getXml(); * */ class WmcToXml { private $wmc = null; private $doc; private $xml = ""; /** * Constructor. Computes the XML of the WMC object given as parameter. * * @param $someWmc wmc */ public function __construct ($someWmc) { $this->wmc = $someWmc; $this->toXml(); } // --------------------------------------------------------------------- // public functions // --------------------------------------------------------------------- public function getXml () { if (is_null($this->wmc)) { return null; } if ($this->xml == "") { $this->toXml(); } return $this->xml; } // --------------------------------------------------------------------- // private functions // --------------------------------------------------------------------- private function toXml () { // generate XML $this->doc = new DOMDocument("1.0", CHARSET); $this->doc->preserveWhiteSpace = false; // ViewContext $e_view_context = $this->doc->createElementNS("http://www.opengis.net/context", "ViewContext"); $e_view_context->setAttribute("version", "1.1.0"); $e_view_context->setAttribute("id", $this->wmc->wmc_id); $e_view_context->setAttribute("xsi:schemaLocation", "http://www.opengis.net/context http://schemas.opengis.net/context/1.1.0/context.xsd"); $e_view_context->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); $e_view_context->setAttribute("xmlns:" . $this->wmc->extensionNamespace, $this->wmc->extensionNamespaceUrl); // General $e_general = $this->createGeneralNode(); if ($e_general !== null) { $e_view_context->appendChild($e_general); } // Layerlist $e_layer_list = $this->doc->createElement("LayerList"); // store overview layers $overviewLayerArray = array(); if ($this->wmc->overviewMap !== null) { $currentOverviewWmsArray = $this->wmc->overviewMap->getWmsArray(); for ($k = 0; $k < count($currentOverviewWmsArray); $k++) { $currentOverviewWms = $currentOverviewWmsArray[$k]; for ($l = 0; $l < count($currentOverviewWms->objLayer); $l++) { $currentOverviewLayer = $currentOverviewWms->objLayer[$l]; array_push($overviewLayerArray, $currentOverviewLayer); } } } $currentWmsArray = $this->wmc->mainMap->getWmsArray(); $currentMap = $this->wmc->mainMap; for ($i = 0; $i < count($currentWmsArray); $i++) { $currentWms = $currentWmsArray[$i]; for ($j = 0; $j < count($currentWms->objLayer); $j++) { $currentLayer = $currentWms->objLayer[$j]; $layerNode = null; $found = false; for ($k = 0; $k < count($overviewLayerArray); $k++) { $currentOverviewLayer = $overviewLayerArray[$k]; if ($currentLayer->layer_uid == $currentOverviewLayer->layer_uid) { $layerNode = $this->createLayerNode($currentMap, $currentWms, $currentLayer, $currentOverviewLayer); $found = true; break; } } if (!$found) { $layerNode = $this->createLayerNode($currentMap, $currentWms, $currentLayer); } if ($layerNode !== null) { $e_layer_list->appendChild($layerNode); } } } $e_view_context->appendChild($e_layer_list); $this->doc->appendChild($e_view_context); // $this->xml = $this->doc->saveXML($this->doc->documentElement); $this->xml = $this->doc->saveXML(); // $e = new mb_notice($this->xml); } private function createGeneralNode () { $extensionData = array(); if ($this->wmc->overviewMap !== null) { $ovExtent = $this->wmc->overviewMap->getExtent(); $extensionData["ov_minx"] = $ovExtent->min->x; $extensionData["ov_miny"] = $ovExtent->min->y; $extensionData["ov_maxx"] = $ovExtent->max->x; $extensionData["ov_maxy"] = $ovExtent->max->y; $extensionData["ov_srs"] = $ovExtent->epsg; $extensionData["ov_framename"] = $this->wmc->overviewMap->getFrameName(); $extensionData["ov_width"] = $this->wmc->overviewMap->getWidth(); $extensionData["ov_height"] = $this->wmc->overviewMap->getHeight(); } // store epsg and bbox of root layer of 0th WMS $firstWms = $this->wmc->mainMap->getWms(0); if ($firstWms !== null) { for ($i = 0; $i < count($firstWms->objLayer[0]->layer_epsg); $i++) { $currentLayerEpsg = $firstWms->objLayer[0]->layer_epsg[$i]; $extensionData["mainMapBox" . $i] = $currentLayerEpsg; } } if ($this->wmc->mainMap !== null) { $extensionData["main_framename"] = $this->wmc->mainMap->getFrameName(); } // General $e_general = $this->doc->createElement("General"); // Window $e_window = $this->doc->createElement("Window"); if ($this->wmc->mainMap->getWidth() && $this->wmc->mainMap->getHeight()) { $e_window->setAttribute("width", $this->wmc->mainMap->getWidth()); $e_window->setAttribute("height", $this->wmc->mainMap->getHeight()); } $e_general->appendChild($e_window); // BoundingBox $mainExtent = $this->wmc->mainMap->getExtent(); $e_bbox = $this->doc->createElement("BoundingBox"); $e_bbox->setAttribute("SRS", $mainExtent->epsg); $e_bbox->setAttribute("minx", $mainExtent->min->x); $e_bbox->setAttribute("miny", $mainExtent->min->y); $e_bbox->setAttribute("maxx", $mainExtent->max->x); $e_bbox->setAttribute("maxy", $mainExtent->max->y); $e_general->appendChild($e_bbox); // Title $e_title = $this->doc->createElement("Title", $this->wmc->wmc_title); $e_general->appendChild($e_title); // Keywords if (count($this->wmc->wmc_keyword) > 0) { $e_keyword_list = $this->doc->createElement("KeywordList"); for ($i=0; $i < count($this->wmc->wmc_keyword); $i++) { $e_keyword = $this->doc->createElement("Keyword", $this->wmc->wmc_keyword[$i]); $e_keyword_list->appendChild($e_keyword); } $e_general->appendChild($e_keyword_list); } // Abstract if ($this->wmc->wmc_abstract) { $e_abstract = $this->doc->createElement("Abstract", $this->wmc->wmc_abstract); $e_general->appendChild($e_abstract); } // Logo URL if ($this->wmc->wmc_logourl_width && $this->wmc->wmc_logourl_height && $this->wmc->wmc_logourl_format && $this->wmc->wmc_logourl){ $e_logo_url = $this->doc->createElement("LogoURL"); $e_logo_url->setAttribute("width", $this->wmc->wmc_logourl_width); $e_logo_url->setAttribute("height", $this->wmc->wmc_logourl_height); $e_logo_url->setAttribute("format", $this->wmc->wmc_logourl_format); $e_logo_url_or = $this->doc->createElement("OnlineResource"); $e_logo_url_or->setAttributeNS("http://www.opengis.net/context", "xmlns:xlink", "http://www.w3.org/1999/xlink"); $e_logo_url_or->setAttribute("xlink:type", "simple"); $e_logo_url_or->setAttribute("xlink:href", $this->wmc->wmc_logourl); $e_logo_url->appendChild($e_logo_url_or); $e_general->appendChild($e_logo_url); } // Description URL if ($this->wmc->wmc_descriptionurl){ $e_description_url = $this->doc->createElement("DescriptionURL"); $e_description_url_or = $this->doc->createElement("OnlineResource"); $e_description_url_or->setAttributeNS("http://www.opengis.net/context", "xmlns:xlink", "http://www.w3.org/1999/xlink"); $e_description_url_or->setAttribute("xlink:type", "simple"); $e_description_url_or->setAttribute("xlink:href", $this->wmc->wmc_descriptionurl); $e_description_url->appendChild($e_description_url_or); $e_general->appendChild($e_description_url); } // Contact information $e_contact = $this->createContactInformationNode(); if ($e_contact !== null) { $e_general->appendChild($e_contact); } // Extension data if (count($extensionData) > 0) { $e_extensionGeneral = $this->doc->createElement("Extension"); foreach ($extensionData as $keyExtensionData => $valueExtensionData) { $e_currentExtensionTag = $this->addExtension($keyExtensionData, $valueExtensionData); $e_extensionGeneral->appendChild($e_currentExtensionTag); } $e_general->appendChild($e_extensionGeneral); } return $e_general; } private function createLayerNode () { if (func_num_args() == 3) { $currentMap = func_get_arg(0); $currentWms = func_get_arg(1); $currentLayer = func_get_arg(2); $currentOverviewLayer = null; } else if (func_num_args() == 4) { $currentMap = func_get_arg(0); $currentWms = func_get_arg(1); $currentLayer = func_get_arg(2); $currentOverviewLayer = func_get_arg(3); } else { return null; } if ($currentLayer->layer_parent != '') { // Layer $e_layer = $this->doc->createElement("Layer"); $e_layer->setAttribute("queryable", $currentLayer->layer_queryable); $e_layer->setAttribute("hidden", ($currentLayer->gui_layer_visible ? 0 : 1)); // Server $e_service = $this->doc->createElement("Server"); $e_service->setAttribute("service", "OGC:WMS"); $e_service->setAttribute("version", $currentWms->wms_version); $e_service->setAttribute("title", $currentWms->wms_title); // Online resource $e_service_or = $this->doc->createElement("OnlineResource"); $e_service_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); $e_service_or->setAttribute("xlink:type", "simple"); $e_service_or->setAttribute("xlink:href", $currentWms->wms_getmap); $e_service->appendChild($e_service_or); $e_layer->appendChild($e_service); // Name $currentLayerName = $currentLayer->layer_name; $e_layer_name = $this->doc->createElement("Name", $currentLayerName); $e_layer->appendChild($e_layer_name); // Title $currentLayerTitle = $currentLayer->layer_title; $e_layer_title = $this->doc->createElement("Title", $currentLayerTitle); $e_layer->appendChild($e_layer_title); // Abstract if ($currentWms->wms_abstract){ $e_layer_abstract = $this->doc->createElement("Abstract", $currentWms->wms_abstract); $e_layer->appendChild($e_layer_abstract); } // Data URL if ($currentLayer->layer_dataurl_href){ $e_layer_data_url = $this->doc->createElement("DataURL"); $e_layer_data_url_or = $this->doc->createElement("OnlineResource"); $e_layer_data_url_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); $e_layer_data_url_or->setAttribute("xlink:type", "simple"); $e_layer_data_url_or->setAttribute("xlink:href", $currentLayer->layer_dataurl_href); $e_layer_data_url->appendChild($e_layer_data_url_or); $e_layer->appendChild($e_layer_data_url); } // Metadata URL if ($currentLayer->layer_metadataurl){ $e_layer_metadata_url = $this->doc->createElement("MetadataURL"); // Metadata URL online resource $e_layer_metadata_url_or = $this->doc->createElement("OnlineResource"); $e_layer_metadata_url_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); $e_layer_metadata_url_or->setAttribute("xlink:type", "simple"); $e_layer_metadata_url_or->setAttribute("xlink:href", $currentLayer->layer_metadataurl); $e_layer_metadata_url->appendChild($e_layer_metadata_url_or); $e_layer->appendChild($e_layer_metadata_url); } // SRS $srsNode = $this->createSrsNode($currentMap, $currentWms); if ($srsNode !== null) { $e_layer->appendChild($srsNode); } // Layer format $formatListNode = $this->createLayerFormatListNode($currentWms); if ($formatListNode !== null) { $e_layer->appendChild($formatListNode); } // Layer style $layerStyleListNode = $this->createLayerStyleNode($currentWms, $currentLayer); if ($layerStyleListNode !== null) { $e_layer->appendChild($layerStyleListNode); } // Extension $extensionNode = $this->createLayerExtensionNode($currentMap, $currentWms, $currentLayer, $currentOverviewLayer); if ($extensionNode !== null) { $e_layer->appendChild($extensionNode); } return $e_layer; } return null; } private function createSrsNode ($currentMap, $currentWms) { $wms_epsg = array(); $wms_epsg[0] = $currentMap->getEpsg(); if ($currentWms->gui_wms_epsg != $currentMap->getEpsg()) { $wms_epsg[1] = $currentWms->gui_wms_epsg; } for ($j = 0; $j < count($currentWms->gui_epsg); $j++) { if (!in_array($currentWms->gui_epsg[$j], $wms_epsg)){ array_push($wms_epsg, $currentWms->gui_epsg[$j]); } } $e_layer_srs = $this->doc->createElement("SRS", implode(" ", $wms_epsg)); return $e_layer_srs; } private function createLayerFormatListNode ($currentWms) { $e_layer_format = $this->doc->createElement("FormatList"); $data_format_current = false; for ($k = 0; $k < count($currentWms->data_format); $k++){ if ($currentWms->data_type[$k] == "map") { $layerFormat = $currentWms->data_format[$k]; $e_format = $this->doc->createElement("Format", $layerFormat); if ($data_format_current === false && ( $currentWms->data_format[$k] == $currentWms->gui_wms_mapformat || $k == (count($currentWms->data_format)-1) )){ $e_format->setAttribute("current", "1"); $data_format_current = true; } $e_layer_format->appendChild($e_format); } } return $e_layer_format; } private function createLayerExtensionNode ($currentMap, $currentWms, $currentLayer, $currentOverviewLayer) { $layerExtensionData = array(); $layerExtensionData["wms_name"] = $currentWms->objLayer[0]->layer_name; $layerExtensionData["minscale"] = $currentLayer->layer_minscale; $layerExtensionData["maxscale"] = $currentLayer->layer_maxscale; $layerExtensionData["gui_minscale"] = $currentLayer->gui_layer_minscale; $layerExtensionData["gui_maxscale"] = $currentLayer->gui_layer_maxscale; $layerExtensionData["layer_id"] = $currentLayer->layer_uid; $layerExtensionData["wms_layer_id"] = $currentWms->objLayer[0]->layer_uid; $layerExtensionData["wms_selectable"] = $currentWms->objLayer[0]->gui_layer_selectable; $layerExtensionData["wms_visible"] = $currentWms->gui_wms_visible; $layerExtensionData["layer_pos"] = $currentLayer->layer_pos; $layerExtensionData["layer_parent"] = $currentLayer->layer_parent; $layerExtensionData["wms_id"] = $currentLayer->gui_layer_wms_id; $layerExtensionData["querylayer"] = $currentLayer->gui_layer_querylayer; $layerExtensionData["gui_selectable"] = $currentLayer->gui_layer_selectable; $layerExtensionData["gui_queryable"] = $currentLayer->gui_layer_queryable; $layerExtensionData["gui_status"] = $currentLayer->gui_layer_status; $layerExtensionData["layer_epsg"] = $currentLayer->layer_epsg; if ($currentOverviewLayer != null) { $layerExtensionData["overviewData"] = array("overviewHidden" => ($currentOverviewLayer->gui_layer_visible ? 0 : 1)); } if ($currentLayer->gui_layer_wfs_featuretype) { $layerExtensionData["wfsFeatureType"] = $currentLayer->gui_layer_wfs_featuretype; } if (count($layerExtensionData) > 0) { $e_extension = $this->doc->createElement("Extension"); foreach ($layerExtensionData as $keyExtensionData => $valueExtensionData) { $e_currentExtensionTag = $this->addExtension($keyExtensionData, $valueExtensionData); $e_extension->appendChild($e_currentExtensionTag); } return $e_extension; } return null; } private function addExtension ($key, $value) { if (is_array($value)) { if (is_numeric($key)) { $key = "data" . $key; } // $e_currentExtensionTag = $this->doc->createElementNS($this->wmc->extensionNamespaceUrl, $this->wmc->extensionNamespace.":".$key); $e_currentExtensionTag = $this->doc->createElement($this->wmc->extensionNamespace.":".$key); foreach ($value as $childKey => $childValue) { $newNode = $this->addExtension($childKey, $childValue); $e_currentExtensionTag->appendChild($newNode); } } else { // $e_currentExtensionTag = $this->doc->createElementNS($this->wmc->extensionNamespaceUrl, $this->wmc->extensionNamespace.":".$key, $value); $e_currentExtensionTag = $this->doc->createElement($this->wmc->extensionNamespace.":".$key, $value); } return $e_currentExtensionTag; } private function createLayerStyleNode ($currentWms, $currentLayer) { $e_layer_stylelist = $this->doc->createElement("StyleList"); for ($k = 0; $k < count($currentLayer->layer_style); $k++) { $currentStyle = $currentLayer->layer_style[$k]; $layerStyle_current = 0; if ($k === 0){ $layerStyle_current = 1; // To do: insert proper data } $e_layer_style = $this->doc->createElement("Style"); $layerStyleSLD = ""; if ($layerStyleSLD) { $e_layer_style_or = $this->doc->createElement("OnlineResource"); $e_layer_style_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); $e_layer_style_or->setAttribute("xlink:type", "simple"); $e_layer_style_or->setAttribute("xlink:href", $currentWms->gui_wms_sldurl); $e_layer_style->appendChild($e_layer_style_or); } else{ if ($layerStyle_current == 1){ $e_layer_style->setAttribute("current", "1"); } $e_layer_style_name = $this->doc->createElement("Name", $currentStyle["name"]); $e_layer_style->appendChild($e_layer_style_name); $e_layer_style_title = $this->doc->createElement("Title", $currentStyle["title"]); $e_layer_style->appendChild($e_layer_style_title); $e_layer_style_legendurl = $this->doc->createElement("LegendURL"); //TODO: determine correct layer style entries $layerStyle_legendUrl_width = ""; // To Do: add proper data $layerStyle_legendUrl_height = ""; // To Do: add proper data $layerStyle_legendUrl_format = ""; // To Do: add proper data $e_layer_style_legendurl->setAttribute("width", $layerStyle_legendUrl_width); $e_layer_style_legendurl->setAttribute("height", $layerStyle_legendUrl_height); $e_layer_style_legendurl->setAttribute("format", $layerStyle_legendUrl_format); $e_layer_style_legendurl_or = $this->doc->createElement("OnlineResource"); $e_layer_style_legendurl_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); $e_layer_style_legendurl_or->setAttribute("xlink:type", "simple"); $e_layer_style_legendurl_or->setAttribute("xlink:href", $currentStyle["legendurl"]); $e_layer_style_legendurl->appendChild($e_layer_style_legendurl_or); $e_layer_style->appendChild($e_layer_style_legendurl); } $e_layer_stylelist->appendChild($e_layer_style); } return $e_layer_stylelist; } /** * * @return */ private function createContactInformationNode () { if ($this->wmc->wmc_contactemail || $this->wmc->wmc_contactorganization || $this->wmc->wmc_contactperson || $this->wmc->wmc_contactposition || $this->wmc->wmc_contactaddresstype || $this->wmc->wmc_contactaddress || $this->wmc->wmc_contactcity || $this->wmc->wmc_contactstateorprovince || $this->wmc->wmc_contactpostcode || $this->wmc->wmc_contactcountry || $this->wmc->wmc_contactvoicetelephone || $this->wmc->wmc_contactfacsimiletelephone) { $e_contact = $this->doc->createElement("ContactInformation"); $e_contact_person_primary = $this->wmc->createContactPersonPrimaryNode(); if ($e_contact_person_primary !== null) { $e_contact->appendChild($e_contact_person_primary); } if ($this->wmc->wmc_contactposition){ $e_contact_position = $this->doc->createElement("ContactPosition", $this->wmc->wmc_contactposition); $e_contact->appendChild($e_contact_position); } if ($this->wmc->wmc_contactaddresstype || $this->wmc->wmc_contactaddress || $this->wmc->wmc_contactcity || $this->wmc->wmc_contactstateorprovince || $this->wmc->wmc_contactpostcode || $this->wmc->wmc_contactcountry) { $e_contact_address = $this->doc->createElement("ContactAddress"); if ($this->wmc->wmc_contactaddresstype){ $e_address_type = $this->doc->createElement("AddressType", $this->wmc->wmc_contactaddresstype); $e_contact_address->appendChild($e_address_type); } if ($this->wmc->wmc_contactaddress){ $e_address = $this->doc->createElement("Address", $this->wmc->wmc_contactaddress); $e_contact_address->appendChild($e_address); } if ($this->wmc->wmc_contactcity){ $e_city = $this->doc->createElement("City", $this->wmc->wmc_contactcity); $e_contact_address->appendChild($e_city); } if ($this->wmc->wmc_contactstateorprovince){ $e_state = $this->doc->createElement("StateOrProvince", $this->wmc->wmc_contactstateorprovince); $e_contact_address->appendChild($e_state); } if ($this->wmc->wmc_contactpostcode){ $e_postcode = $this->doc->createElement("PostCode", $this->wmc->wmc_contactpostcode); $e_contact_address->appendChild($e_postcode); } if ($this->wmc->wmc_contactcountry){ $e_country = $this->doc->createElement("Country", $this->wmc->wmc_contactcountry); $e_contact_address->appendChild($e_country); } $e_contact->appendChild($e_contact_address); } if ($this->wmc->wmc_contactvoicetelephone){ $e_voice_telephone = $this->doc->createElement("ContactVoiceTelephone", $this->wmc->wmc_contactvoicetelephone); $e_contact->appendChild($e_voice_telephone); } if ($this->wmc->wmc_contactfacsimiletelephone){ $e_facsimile_telephone = $this->doc->createElement("ContactFacsimileTelephone", $this->wmc->wmc_contactfacsimiletelephone); $e_contact->appendChild($e_facsimile_telephone); } if ($this->wmc->wmc_contactemail){ $e_email = $this->doc->createElement("ContactElectronicMailAddress", $this->wmc->wmc_contactemail); $e_contact->appendChild($e_email); } return $e_contact; } return null; } private function createContactPersonPrimaryNode () { if ($this->wmc->wmc_contactperson || $this->wmc->wmc_contactorganization){ $e_contact_person_primary = $this->doc->createElement("ContactPersonPrimary"); if ($this->wmc->wmc_contactperson){ $e_contact_person = $this->doc->createElement("ContactPerson", $this->wmc->wmc_contactperson); $e_contact_person_primary->appendChild($e_contact_person); } if ($this->wmc->wmc_contactorganization){ $e_contact_organization = $this->doc->createElement("ContactOrganization", $this->wmc->wmc_contactorganization); $e_contact_person_primary->appendChild($e_contact_organization); } return $e_contact_person_primary; } return null; } } ?>