$val) { $_REQUEST[strtoupper($key)] = $val; } //check if opensearchdescription is requested if (isset($_REQUEST['GETOPENSEARCH']) & $_REQUEST['GETOPENSEARCH'] != "") { //validate $testMatch = $_REQUEST["GETOPENSEARCH"]; if ($testMatch != "true" && $testMatch != "false"){ //echo 'GETOPENSEARCH: '.$testMatch.' is not valid.
'; echo 'Parameter GETOPENSEARCH is not valid (true or false).
'; die(); } $getOpenSearch = $testMatch; if ($getOpenSearch == 'true') { $getOpenSearch = true; } else { $getOpenSearch = false; } $testMatch = NULL; } //check if opensearch should be used if (isset($_REQUEST['OPENSEARCH']) & $_REQUEST['OPENSEARCH'] != "") { //validate $testMatch = $_REQUEST["OPENSEARCH"]; if ($testMatch != "true" && $testMatch != "false"){ //echo 'OPENSEARCH: '.$testMatch.' is not valid.
'; echo 'Parameter OPENSEARCH is not valid (true or false).
'; die(); } $openSearch = $testMatch; if ($openSearch == 'true') { $openSearch = true; } else { $openSearch = false; } $testMatch = NULL; } //validate request params if (isset($_REQUEST['ID']) & $_REQUEST['ID'] != "") { //validate uuid $testMatch = $_REQUEST["ID"]; $uuid = new Uuid($testMatch); $isUuid = $uuid->isValid(); if (!$isUuid) { //echo 'Id: '.$testMatch.' is not a valid mapbender uuid.
'; echo 'Parameter Id is not a valid mapbender uuid.
'; die(); } $recordId = $testMatch; $testMatch = NULL; } /* //validate request params if (isset($_REQUEST['ID']) & $_REQUEST['ID'] != "") { //validate integer $testMatch = $_REQUEST["ID"]; $pattern = '/^[\d]*$/'; if (!preg_match($pattern,$testMatch)){ echo 'Id: '.$testMatch.' is not valid.
'; die(); } $recordId = $testMatch; $testMatch = NULL; } */ if (!isset($_REQUEST['TYPE']) || $_REQUEST['TYPE'] == "") { echo 'Mandatory parameter type is not set!
Please set type to DATASET or SERVICE'; die(); } //validate request params if (isset($_REQUEST['TYPE']) & $_REQUEST['TYPE'] != "") { //validate type $testMatch = $_REQUEST["TYPE"]; if ($testMatch != 'SERVICE' && $testMatch != 'DATASET'){ //echo 'type: '.$testMatch.' is not valid.
'; echo 'Parameter type is not valid (DATASET or SERVICE).
'; die(); } $type = $testMatch; $testMatch = NULL; } if (!isset($_REQUEST['GENERATEFROM']) || $_REQUEST['GENERATEFROM'] == "") { echo 'Mandatory parameter GENERATEFROM is not set!
Please set GENERATEFROM to wmslayer, dataurl, metadata or wfs '; die(); } //validate request params if (isset($_REQUEST['GENERATEFROM']) & $_REQUEST['GENERATEFROM'] != "") { //validate type $testMatch = $_REQUEST["GENERATEFROM"]; if ($testMatch != 'wmslayer' && $testMatch != 'dataurl' && $testMatch != 'wfs' && $testMatch != 'all' && $testMatch != 'metadata'){ //echo 'GENERATEFROM: '.$testMatch.' is not valid.
'; echo 'Parameter GENERATEFROM is not valid (wmslayer,dataurl,wfs,metadata,all).
'; die(); } $generateFrom = $testMatch; $testMatch = NULL; } //parse opensearch parameters - used if $openSearch=true //q, spatial_dataset_identifier_namespace, spatial_dataset_identifier_code, crs, language if (isset($_REQUEST['q']) & $_REQUEST['q'] != "") { //validate type $testMatch = $_REQUEST["q"]; /*if ($testMatch != 'wmslayer' && $testMatch != 'dataurl' && $testMatch != 'wfs' && $testMatch != 'all'){ //echo 'GENERATEFROM: '.$testMatch.' is not valid.
'; echo 'Parameter GENERATEFROM is not valid (wmslayer,dataurl,wfs,all).
'; die(); }*/ $osQuery = $testMatch; $testMatch = NULL; } if (isset($_REQUEST['spatial_dataset_identifier_namespace']) & $_REQUEST['spatial_dataset_identifier_namespace'] != "") { //validate type $testMatch = $_REQUEST["spatial_dataset_identifier_namespace"]; /*if ($testMatch != 'wmslayer' && $testMatch != 'dataurl' && $testMatch != 'wfs' && $testMatch != 'all'){ //echo 'GENERATEFROM: '.$testMatch.' is not valid.
'; echo 'Parameter GENERATEFROM is not valid (wmslayer,dataurl,wfs,all).
'; die(); }*/ $osDatasetNamespace = $testMatch; $testMatch = NULL; } if (isset($_REQUEST['spatial_dataset_identifier_code']) & $_REQUEST['spatial_dataset_identifier_code'] != "") { //validate type $testMatch = $_REQUEST["spatial_dataset_identifier_code"]; /*if ($testMatch != 'wmslayer' && $testMatch != 'dataurl' && $testMatch != 'wfs' && $testMatch != 'all'){ //echo 'GENERATEFROM: '.$testMatch.' is not valid.
'; echo 'Parameter GENERATEFROM is not valid (wmslayer,dataurl,wfs,all).
'; die(); }*/ $osDatasetIdentifier = $testMatch; $testMatch = NULL; } if (isset($_REQUEST['crs']) & $_REQUEST['crs'] != "") { //validate type TODO $testMatch = $_REQUEST["crs"]; /*if ($testMatch != 'wmslayer' && $testMatch != 'dataurl' && $testMatch != 'wfs' && $testMatch != 'all'){ //echo 'GENERATEFROM: '.$testMatch.' is not valid.
'; echo 'Parameter GENERATEFROM is not valid (wmslayer,dataurl,wfs,all).
'; die(); }*/ $osCrs = $testMatch; $testMatch = NULL; } if (isset($_REQUEST['request']) & $_REQUEST['request'] != "") { //validate type TODO $testMatch = $_REQUEST["request"]; if ($testMatch != 'DescribeSpatialDataset' && $testMatch != 'GetSpatialDataset'){ //echo 'GENERATEFROM: '.$testMatch.' is not valid.
'; echo 'Parameter request is not valid (GetSpatialDataset/DescribeSpatialDataset).
'; die(); } $osRequest = $testMatch; $testMatch = NULL; } if (isset($_REQUEST['language']) & $_REQUEST['language'] != "") { //validate type TODO $testMatch = $_REQUEST["language"]; /*if ($testMatch != 'wmslayer' && $testMatch != 'dataurl' && $testMatch != 'wfs' && $testMatch != 'all'){ //echo 'GENERATEFROM: '.$testMatch.' is not valid.
'; echo 'Parameter GENERATEFROM is not valid (wmslayer,dataurl,wfs,all).
'; die(); }*/ $osLanguage = $testMatch; $testMatch = NULL; } if ($generateFrom == "wmslayer") { //check if layerId is set too if (isset($_REQUEST['LAYERID']) & $_REQUEST['LAYERID'] != "") { $testMatch = $_REQUEST["LAYERID"]; $pattern = '/^[\d]*$/'; if (!preg_match($pattern,$testMatch)){ //echo 'LAYERID must be an integer: '.$testMatch.' is not valid.
'; echo 'LAYERID must be an integer!
'; die(); } $layerId = $testMatch; $testMatch = NULL; } else { echo 'Mandatory request parameter layerid must be set if download service should be generated by a wms layer!'; die(); } } if ($generateFrom == "wfs") { //check if wfsId is set too if (isset($_REQUEST['WFSID']) & $_REQUEST['WFSID'] != "") { $testMatch = $_REQUEST["WFSID"]; $pattern = '/^[\d]*$/'; if (!preg_match($pattern,$testMatch)){ //echo 'WFSID must be an integer: '.$testMatch.' is not valid.
'; echo 'WFSID must be an integer!
'; die(); } $wfsId = $testMatch; $testMatch = NULL; } else { echo 'Mandatory request parameter WFSID must be set if download service should be generated by using a Web Feature Service!'; die(); } //check if featuretypeid is set too if (isset($_REQUEST['featuretypeid']) && $_REQUEST['featuretypeid'] != "") { $testMatch = $_REQUEST["featuretypeid"]; $pattern = '/^[\d]*$/'; if (!preg_match($pattern,$testMatch)){ echo 'FEATURETYPEID must be an integer!
'; die(); } $featuretypeId = $testMatch; $testMatch = NULL; } } //Initialize XML document $feedDoc = new DOMDocument('1.0'); $feedDoc->encoding = 'UTF-8'; $feedDoc->preserveWhiteSpace = false; $feedDoc->formatOutput = true; /*function addToQuery($paramName,$queryString,$string,$queryList) { //test if string was part of query before, if so, don't extent the query //TODO: the strings come from json and so they are urlencoded! maybe we have to decode them to find the commata $queryListComma = urldecode($queryList); $queryListC = ",".$queryListComma.","; $pattern = ','.$string.','; if (!preg_match($pattern, $queryListC)){ //append the new element $queryListNew = $queryListC.$string; //echo "query string new: ".$queryListNew."
"; //delete the commatas $queryListNew = ltrim($queryListNew,','); //generate the new query string $queryStringNew = str_replace($paramName.'='.$queryList,$paramName.'='.$queryListNew,$queryString); return $queryStringNew; } else { return $queryString; } }*/ // function to delete one GET parameter totally from a query url function delTotalFromQuery($paramName,$queryString) { $queryString = "&".$queryString; $queryStringNew = preg_replace('/\b'.$paramName.'\=[^&]+&?/',$str2exchange,$queryString); $queryStringNew = ltrim($queryStringNew,'&'); $queryStringNew = rtrim($queryStringNew,'&'); return $queryStringNew; } function answerOpenSearchRequest () { global $admin, $type, $mapbenderMetadata, $indexMapbenderMetadata, $layerId, $wfsId, $mapbenderPath, $mapbenderServerUrl, $epsgId, $alterAxisOrder, $departmentMetadata, $userMetadata, $hasPermission, $m, $crs, $crsUpper, $countRessource, $furtherLink, $osDatasetIdentifier, $osQuery, $osDatasetNamespace, $osCrs, $osLanguage, $osRequest; //service feed url $serviceFeed = delTotalFromQuery("getopensearch",$mapbenderServerUrl.$_SERVER['REQUEST_URI']);//delete GETOPENSEARCH $serviceFeed = delTotalFromQuery("OPENSEARCH",$serviceFeed); //echo $serviceFeed; //die(); //datasetfeed url $datasetFeed = str_replace("=SERVICE&","=DATASET&",$serviceFeed); //echo $datasetFeed; //die(); $returnFile = false; switch ($generateFrom) { case "dataurl": $mimetype = $formatsMimetype[$mapbenderMetadata[$m]->format]; break; case "wmslayer": $mimetype = "image/tiff"; break; case "wfs": $mimetype = "application/gml+xml"; break; case "metadata": $mimetype = $formatsMimetype[$mapbenderMetadata[$m]->format]; break; } //check correct headers foreach (apache_request_headers() as $name => $value) { if ($name == "Accept" && $value == $mimetype) { $returnFile = true; } } //TODO comment this line in productive environment - see inspire guidance for opensearch script $returnFile = true; //check for identifier /*$e = new mb_exception("mod_inspireDownloadFeed.php: osDatasetIdentifier: ".$osDatasetIdentifier); $e = new mb_exception("mod_inspireDownloadFeed.php: osQuery: ".$osQuery); $e = new mb_exception("mod_inspireDownloadFeed.php: osDatasetNamespace: ".$osDatasetNamespace); $e = new mb_exception("mod_inspireDownloadFeed.php: numberOfTiles: ".$numberOfTiles);*/ if (!$osDatasetIdentifier) { if (!$osQuery) { //redirect to service feed header("Location: ".$serviceFeed); die(); } //the query search for an identifier ? $osDatasetIdentifier = $osQuery; } //check namespace if (!$osDatasetNamespace) { echo "No namespace given!"; die(); } //check crs and language if ($osCrs && $osCrs != $crs) { echo "Dataset not available in requested crs!"; die(); } if (!$osLanguage || $osLanguage == "*") { $osLanguage = "de"; } if ($osLanguage != "de") { echo "Dataset not available in requested language!"; die(); } switch ($osRequest) { case "DescribeSpatialDataset": //redirect to datasetfeed header("Location: ".$datasetFeed); break; case "GetSpatialDataset": //check count of links //redirect to downloadlink //parse dataset atom feed and count links - maybe one or multiple!!!! $links = getDatasetFeedLinks($datasetFeed); $numberOfTiles = count($links); //$e = new mb_exception("mod_inspireDownloadFeed.php: numberOfTiles: ".$numberOfTiles); if ($numberOfTiles > 1) { //redirect to dataset atom feed header("Location: ".$datasetFeed); } else { if ($returnFile) { //echo "links[0]:". $links[0]; //die(); header("Location: ".$links[0]); } else { //redirect to datasetfeed header("Location: ".$datasetFeed); } } die(); break; } } function getDatasetFeedLinks($datasetFeedUrl) { //$links = array(); //get feed from remote server $feedConnector = new connector($datasetFeedUrl); $feedConnector->set("timeOut", "10"); $feedFile = $feedConnector->file; libxml_use_internal_errors(true); try { $feedXML = simplexml_load_string($feedFile); if ($feedXML === false) { foreach(libxml_get_errors() as $error) { $err = new mb_exception("mod_inspireDownloadFeed.php:".$error->message); } throw new Exception("mod_inspireDownloadFeed.php:".'Cannot parse Feed!'); return false; } } catch (Exception $e) { $err = new mb_exception("mod_inspireDownloadFeed.php:".$e->getMessage()); return false; } if ($feedXML != false) { $feedXML->registerXPathNamespace("georss", "http://www.georss.org/georss"); $feedXML->registerXPathNamespace("inspire_dls", "http://inspire.ec.europa.eu/schemas/inspire_dls/1.0"); $feedXML->registerXPathNamespace("defaultns", "http://www.w3.org/2005/Atom"); $title = $feedXML->xpath('/defaultns:feed/defaultns:entry/defaultns:title'); //TODO: This is only possible, if one entry is available as it is now. Maybe altered later. $title = $title[0]; //for ($i=0; $i<=(count($title)-1); $i++) { $links = $feedXML->xpath('/defaultns:feed/defaultns:entry[1]/defaultns:link/@href'); //} } return $links; } function generateOpenSearchDescription($feedDoc, $recordId, $generateFrom) { global $admin, $type, $mapbenderMetadata, $indexMapbenderMetadata, $layerId, $wfsId, $mapbenderPath, $mapbenderServerUrl, $epsgId, $alterAxisOrder, $departmentMetadata, $userMetadata, $hasPermission, $m, $crs, $crsUpper, $countRessource, $numberOfTiles; switch ($generateFrom) { case "dataurl": $mimetype = $formatsMimetype[$mapbenderMetadata[$m]->format]; break; case "wmslayer": $mimetype = "image/tiff"; break; case "wfs": $mimetype = "application/gml+xml"; break; case "metadata": $mimetype = $formatsMimetype[$mapbenderMetadata[$m]->format]; break; } //part which generates the feed $feed = $feedDoc->createElementNS('http://a9.com/-/spec/opensearch/1.1/', 'OpenSearchDescription'); $feed = $feedDoc->appendChild($feed); //$feed->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); $feed->setAttribute("xmlns:inspire_dls", "http://inspire.ec.europa.eu/schemas/inspire_dls/1.0"); $feed->setAttribute("xmlns:xsi", "http://www.w3c.org/2001/XMLSchema-instance"); $feed->setAttribute("xsi:schemaLocation", "http://a9.com/-/spec/opensearch/1.1/ OpenSearch.xsd"); //ShortName $osShortName = $feedDoc->createElement("ShortName"); $osShortNameText = $feedDoc->createTextNode("INSPIRE DLS"); $osShortName->appendChild($osShortNameText); $feed->appendChild($osShortName); //Description $osDescription = $feedDoc->createElement("Description"); $osDescriptionText = $feedDoc->createTextNode("Search Description für INSPIRE Download Service."); $osDescription->appendChild($osDescriptionText); $feed->appendChild($osDescription); //Url - self $urlSelf = $feedDoc->createElement("Url"); $urlSelf->setAttribute("type", "application/opensearchdescription+xml"); $urlSelf->setAttribute("rel", "self"); $urlSelf->setAttribute("template", $mapbenderServerUrl.$_SERVER['REQUEST_URI']); $feed->appendChild($urlSelf); //Url - results Atom $urlSelf = $feedDoc->createElement("Url"); $urlSelf->setAttribute("type", "application/atom+xml"); $urlSelf->setAttribute("rel", "results"); $urlSelf->setAttribute("template", str_replace("=SERVICE&","=DATASET&",$mapbenderServerUrl.$_SERVER['REQUEST_URI'])."&OPENSEARCH=true&q={searchTerms}"); $feed->appendChild($urlSelf); //Url - describedby $urlDescribedby = $feedDoc->createElement("Url"); $urlDescribedby->setAttribute("type", "application/atom+xml"); $urlDescribedby->setAttribute("rel", "describedby"); //see documentation $urlDescribedby->setAttribute("template", str_replace("=SERVICE&","=DATASET&",$mapbenderServerUrl.$_SERVER['REQUEST_URI'])."&OPENSEARCH=true&request=DescribeSpatialDataset&spatial_dataset_identifier_code={inspire_dls:spatial_dataset_identifier_code?}&spatial_dataset_identifier_namespace={inspire_dls:spatial_dataset_identifier_namespace?}&crs={inspire_dls:crs?}&language={language?}&q={searchTerms?}"); //$urlDescribedby->setAttribute("template", str_replace("=SERVICE&","=DATASET&",$mapbenderServerUrl.$_SERVER['REQUEST_URI'])); $feed->appendChild($urlDescribedby); //Url - results single part (e.g. zipfile) $urlResults = $feedDoc->createElement("Url"); $urlResults->setAttribute("type", $mimetype);//TODO give reasonable format!! - mimetypes??? geotiff/gml/other - see format of metadata $urlResults->setAttribute("rel", "results"); $urlResults->setAttribute("template", str_replace("=SERVICE&","=DATASET&",$mapbenderServerUrl.$_SERVER['REQUEST_URI'])."&OPENSEARCH=true&request=GetSpatialDataset&spatial_dataset_identifier_code={inspire_dls:spatial_dataset_identifier_code?}&spatial_dataset_identifier_namespace={inspire_dls:spatial_dataset_identifier_namespace?}&crs={inspire_dls:crs?}&language={language?}&q={searchTerms?}"); $feed->appendChild($urlResults); //for firefox? $urlResults = $feedDoc->createElement("Url"); $urlResults->setAttribute("type", "text/html");//TODO give reasonable format!! - mimetypes??? geotiff/gml/other - see format of metadata - see https://developer.mozilla.org/de/docs/OpenSearch_Plugin_f%C3%BCr_Firefox_erstellen $urlResults->setAttribute("rel", "results"); $urlResults->setAttribute("template", str_replace("=SERVICE&","=DATASET&",$mapbenderServerUrl.$_SERVER['REQUEST_URI'])."&OPENSEARCH=true&request=GetSpatialDataset&spatial_dataset_identifier_code={inspire_dls:spatial_dataset_identifier_code?}&spatial_dataset_identifier_namespace={inspire_dls:spatial_dataset_identifier_namespace?}&crs={inspire_dls:crs?}&language={language?}&q={searchTerms?}"); $feed->appendChild($urlResults); //Url -results multi part /* $urlResults = $feedDoc->createElement("Url"); $urlResults->setAttribute("type", "application/atom"); $urlResults->setAttribute("rel", "results"); $urlResults->setAttribute("template", $mapbenderServerUrl.$_SERVER['SCRIPT_NAME']."?spatial_dataset_identifier_code={inspire_dls:spatial_dataset_identifier_code?}&spatial_dataset_identifier_namespace={inspire_dls:spatial_dataset_identifier_namespace?}&crs={inspire_dls:crs?}&language={language?}&q={searchTerms?}"); $feed->appendChild($urlResults); */ //Metadata for OpenSearch //Contact $osContact = $feedDoc->createElement("Contact"); $osContactText = $feedDoc->createTextNode("kontakt@geoportal.rlp.de"); $osContact->appendChild($osContactText); $feed->appendChild($osContact); //Tags $osTags = $feedDoc->createElement("Tags"); $osTagsText = $feedDoc->createTextNode("Tags"); $osTags->appendChild($osTagsText); $feed->appendChild($osTags); //LongName $osLongName = $feedDoc->createElement("LongName"); $osLongNameText = $feedDoc->createTextNode("LongName"); $osLongName->appendChild($osLongNameText); $feed->appendChild($osLongName); //Image $osImage = $feedDoc->createElement("Image"); $osImage->setAttribute("height", "16"); $osImage->setAttribute("width", "16"); $osImage->setAttribute("type", "image/png"); $osImageText = $feedDoc->createTextNode("http://www.geoportal.rlp.de/fileadmin/design/logo_gdi-rp.png"); $osImage->appendChild($osImageText); $feed->appendChild($osImage); //Query //example //$mapbenderMetadata[$m]->datasetid_codespace."#".$mapbenderMetadata[$m]->datasetid; $osQuery = $feedDoc->createElement("Query"); $osQuery->setAttribute("role", "example"); $osQuery->setAttribute("inspire_dls:spatial_dataset_identifier_namespace", $mapbenderMetadata[$m]->datasetid_codespace); $osQuery->setAttribute("inspire_dls:spatial_dataset_identifier_code", $mapbenderMetadata[$m]->datasetid); $osQuery->setAttribute("inspire_dls:crs", "EPSG:".$epsgId); $osQuery->setAttribute("language", "de"); $osQuery->setAttribute("title", $mapbenderMetadata[$m]->metadata_title); $osQuery->setAttribute("count", "1"); //$osQueryText = $feedDoc->createTextNode("Query"); //$osQuery->appendChild($osQueryText); $feed->appendChild($osQuery); //Developer $osDeveloper = $feedDoc->createElement("Developer"); $osDeveloperText = $feedDoc->createTextNode("Rheinland-Pfalz, Zentrale Stelle GDI-RP"); $osDeveloper->appendChild($osDeveloperText); $feed->appendChild($osDeveloper); //Language $osLanguage = $feedDoc->createElement("Language"); $osLanguageText = $feedDoc->createTextNode("de"); $osLanguage->appendChild($osLanguageText); $feed->appendChild($osLanguage); return $feedDoc->saveXML(); } function readInfoFromDatabase($recordId, $generateFrom){ global $admin, $type, $mapbenderMetadata, $indexMapbenderMetadata, $layerId, $wfsId, $mapbenderPath, $mapbenderServerUrl, $epsgId, $alterAxisOrder, $departmentMetadata, $userMetadata, $hasPermission, $m, $crs, $crsUpper, $countRessource; switch ($generateFrom) { case "dataurl": $sql = <<".count($mapbenderMetadata).""; //die(); //$e = new mb_exception("mod_inspireDownloadFeed: uuid ".$recordId); //$e = new mb_exception("mod_inspireDownloadFeed: datalink_id ".$mapbenderMetadata[0]->datalink_id); //$e = new mb_exception("mod_inspireDownloadFeed: sql ".$sql); if ($generateFrom != "wfs") { $countRessource = 1; } //for the first entry - top feed level use the first index - right so or do it on another way? $m = 0; if ($generateFromDataurl) { //check if layer_id datalink_id and metadata_id are given and not empty! if (!isset($mapbenderMetadata[$m]->datalink_id) || $mapbenderMetadata[$m]->datalink_id == '') { return "No dataurl element is given for the requested wms layer"; } } //TODO - if the wms is a raster based wms and the output format may be geotiff - the feed entries can be generated automatically. We need following information // 1. a raster based wms is given or not - checkbox at metadata editor! // 2. geotiff maybe one of the allowed formats! - layer format // 3. the maximum of pixel which can be served by the wms - maybe 2000x2000px - metadata editor! // 4. The scale hints maybe used to control if a special get map request will produce a picture or not //TODO: In this case we have to generate a feed for every single getmap request. This feed have to be called dynamically too! It will be cool to have the bboxes as get parameter or give a index of the bbox with which the bbox can be calculated again! if (!isset($mapbenderMetadata[$m]->metadata_id) || $mapbenderMetadata[$m]->metadata_id == '') { return "The metadataset with id ".$mapbenderMetadata[$m]->metadata_id." has no coupled ".$generateFrom." ressource ".$m.""; } $crs = $mapbenderMetadata[$m]->metadata_ref_system; if (!isset($mapbenderMetadata[$m]->metadata_ref_system) || $mapbenderMetadata[$m]->metadata_ref_system == '') { return "For the metadataset with id ".$mapbenderMetadata[$m]->metadata_id." is no reference system defined!"; } //Handle CRS - maybe in 'urn:ogc:def:crs:EPSG:6.9:4326' or 'EPSG:4326' or 'epsg:4326' or 'urn:ogc:def:crs:EPSG::4326' format! //*********************** New use crs class for checking if the order has to be changed in the filter!!! $crsObject = new Crs($crs); if ($crsObject->alterAxisOrder("wms"."_".$mapbenderMetadata[$m]->wms_version) == true) { $alterAxisOrder = true; } else { $alterAxisOrder = false; } //************************************************************************************** $epsgId = $crsObject->identifierCode; //************************************************************************************** switch ($generateFrom) { case "wmslayer": $serviceType = "wms"; $serviceId = $mapbenderMetadata[$m]->fkey_wms_id; $ownerId = $mapbenderMetadata[$m]->wms_owner; break; case "wfs": $serviceType = "wfs"; $serviceId = $mapbenderMetadata[$m]->wfs_id; $ownerId = $mapbenderMetadata[$m]->wfs_owner; break; case "dataurl": $serviceType = "wms"; $serviceId = $mapbenderMetadata[$m]->fkey_wms_id; $ownerId = $mapbenderMetadata[$m]->wms_owner; break; case "metadata": $serviceType = "metadata"; $serviceId = $mapbenderMetadata[$m]->metadata_id; $ownerId = $mapbenderMetadata[$m]->md_owner; break; default: break; } $departmentMetadata = $admin->getOrgaInfoFromRegistry($serviceType, $serviceId, $ownerId); $userMetadata['mb_user_email'] = $departmentMetadata['mb_user_email']; $userMetadata['timestamp'] = $departmentMetadata['mb_user_timestamp']; //************************************************************************************** switch ($generateFrom) { case "wmslayer": $v = array($mapbenderMetadata[$m]->wms_owner); $hasPermission=$admin->getLayerPermission($mapbenderMetadata[$m]->fkey_wms_id,$mapbenderMetadata[$m]->layer_name,PUBLIC_USER); break; case "dataurl": $v = array($mapbenderMetadata[$m]->wms_owner); //$hasPermission=$admin->getLayerPermission($mapbenderMetadata[$m]->fkey_wms_id,$mapbenderMetadata[$m]->layer_name,PUBLIC_USER); $hasPermission = true; break; case "wfs": $v = array($mapbenderMetadata[$m]->wfs_owner); $hasPermission = true; break; case "metadata": $v = array($mapbenderMetadata[$m]->md_owner); $hasPermission = true; break; } //check if resource is freely available to anonymous user - which are all users who search thru metadata catalogues: /*if ($generateFrom != "wfs") { $hasPermission=$admin->getLayerPermission($mapbenderMetadata[$m]->fkey_wms_id,$mapbenderMetadata[$m]->layer_name,PUBLIC_USER); } else { $hasPermission = true; }*/ } //Some needfull functions to pull metadata out of the database. //List of data which is needed to build the feed: //header part ****** // - feed title: Generated from dataset name - either mb_metadata.title or layer.layer_title // - feed subtitle: Generated from dataset name - either mb_metadata.title or layer.layer_title, organisation name - mapbender group information (metadata contact) - cause it is generated from data of a registrated wms // - link to ISO19139 service metadata - this will be created dynamically by given layer_id as this script itself // - link to opensearch description for this download service - as before the layer_id will be used as a parameter // - id - link to the script itself // - rights - the access constraints of the view service are used - they should also give information about the access constraints for the usage of the data // - updated : last date the feed was updated - use current timestamp of the wms as the feed will be generated from dataurl entry of the layer object - wms.wms_timestamp //datalink.random_id - this is newly created when layers are updated ! - new //author - use information from mapbender group - metadata point of contact - registrating organization //entry part ****** // - entry title: Generated from dataset name - either mb_metadata.title or layer.layer_title - in combination e.g. with "Feed for ..." // - link to the dataset feed - invoked by layer id as this is done before // - summary - Generated by some infomation: mb_metadata.format, mb_metadata.ref_sytem, ...., datalink.datalink_format // - updated - timestamp of wms as done before // - function generateFeed($feedDoc, $recordId, $generateFrom) { global $admin, $type, $imageResolution, $maxImageSize, $maxFeatureCount, $mapbenderMetadata, $indexMapbenderMetadata, $layerId, $wfsId, $featuretypeId, $mapbenderPath, $mapbenderServerUrl, $epsgId, $alterAxisOrder, $departmentMetadata, $userMetadata, $hasPermission, $m, $crs, $crsUpper,$countRessource, $numberOfTiles, $furtherLink; //caching feeds in apc cache //check age of information to allow caching of atom feeds /*$e = new mb_exception("mod_inspireDownloadFeed.php: wms_timestamp: ".date("Y-m-d H:i:s",$mapbenderMetadata[$m]->wms_timestamp)); $e = new mb_exception("mod_inspireDownloadFeed.php: wfs_timestamp: ".date("Y-m-d H:i:s",$mapbenderMetadata[$m]->wfs_timestamp)); $e = new mb_exception("mod_inspireDownloadFeed.php: md_timestamp: ".date("Y-m-d H:i:s",strtotime($mapbenderMetadata[$m]->md_timestamp))); $e = new mb_exception("mod_inspireDownloadFeed.php: group timestamp: ".date("Y-m-d H:i:s",strtotime($departmentMetadata['timestamp']))); $e = new mb_exception("mod_inspireDownloadFeed.php: user timestamp: ".date("Y-m-d H:i:s",strtotime($userMetadata['timestamp'])));*/ if ($type == 'DATASET') { if (isset($mapbenderMetadata[$m]->metadata_id)) { //log download for resource $metadataMonitor = new Metadata_load_count(); $metadataMonitor->increment($mapbenderMetadata[$m]->metadata_id); } } $timestamps = array( date("Y-m-d H:i:s",$mapbenderMetadata[$m]->wms_timestamp), date("Y-m-d H:i:s",$mapbenderMetadata[$m]->wfs_timestamp), date("Y-m-d H:i:s",strtotime($mapbenderMetadata[$m]->md_timestamp)), date("Y-m-d H:i:s",strtotime($departmentMetadata['timestamp'])), date("Y-m-d H:i:s",strtotime($userMetadata['timestamp'])) ); $maxDate = max($timestamps); //$e = new mb_exception("mod_inspireDownloadFeed.php: maxDate: ".$maxDate); //instantiate cache if available $cache = new Cache(); //define key name cache $atomFeedKey = 'atomFeed_'.$type."_".$recordId."_".$generateFrom.'_'; switch ($generateFrom) { case "wmslayer": $atomFeedKey .= $layerId; break; case "dataurl": $atomFeedKey .= $layerId; break; case "wfs": $atomFeedKey .= $wfsId; switch ($mapbenderMetadata[$m]->wfs_version) { case "2.0.2": $typeParameterName = "typeNames"; break; case "2.0.0": $typeParameterName = "typeNames"; break; default: $typeParameterName = "typeName"; break; } break; } //$e = new mb_exception("mod_inspireDownloadFeed.php: cachedVariableTimestamp: ".date("Y-m-d H:i:s",$cache->cachedVariableCreationTime($atomFeedKey))); if ($cache->isActive && $cache->cachedVariableExists($atomFeedKey) && (date("Y-m-d H:i:s",$cache->cachedVariableCreationTime($atomFeedKey)) > $maxDate)) { $e = new mb_exception("class_map.php: read ".$atomFeedKey." from ".$cache->cacheType." cache!"); return $cache->cachedVariableFetch($atomFeedKey); } else { //***************************************************************** //compare highestDate with timestamp of cache //part which generates the feed $feed = $feedDoc->createElementNS('http://www.w3.org/2005/Atom', 'feed'); $feed = $feedDoc->appendChild($feed); //$feed->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); $feed->setAttribute("xmlns:georss", "http://www.georss.org/georss"); if ($type == 'SERVICE') { $feed->setAttribute("xmlns:inspire_dls", "http://inspire.ec.europa.eu/schemas/inspire_dls/1.0"); } $feed->setAttribute("xmlns:lang", "de"); //echo "".$mapbenderMetadata['fkey_wms_id'].":".$mapbenderMetadata['wms_owner'].""; //pull the namespace from database $metadataArray['datasetid_codespace'] = $mapbenderMetadata[$m]->datasetid_codespace; $uniqueResourceIdentifierCodespace = $admin->getIdentifierCodespaceFromRegistry($departmentMetadata, $metadataArray); //overwrite datasetid_codespace $mapbenderMetadata[$m]->datasetid_codespace = $uniqueResourceIdentifierCodespace; //qualifying id of the referenced ressource: Either dataset id or the id of the metadata record /*if (isset($mapbenderMetadata[$m]->datasetid) && $mapbenderMetadata[$m]->datasetid != '' ) { $ressourceId = $mapbenderMetadata[$m]->datasetid_codespace."#".$mapbenderMetadata[$m]->datasetid; }*/ //check if the metadata set has a title and abstract if not given (in case of dataurl, use layer information!) //first use metadata title then layer title if (isset($mapbenderMetadata[$m]->metadata_title) && $mapbenderMetadata[$m]->metadata_title != '' ) { $ressourceTitle = $mapbenderMetadata[$m]->metadata_title; } else { //TODO check wfs title.... if (isset($mapbenderMetadata[$m]->layer_title) && $mapbenderMetadata[$m]->layer_title != '' ) { $ressourceTitle = $mapbenderMetadata[$m]->layer_title; } else { $ressourceTitle = "Title of dataset cannot be found!"; } } //first use metadata abstract then layer abstract if (isset($mapbenderMetadata[$m]->metadata_abstract) && $mapbenderMetadata[$m]->metadata_abstract != '' ) { $ressourceAbstract = $mapbenderMetadata[$m]->metadata_abstract; } else { if (isset($mapbenderMetadata[$m]->layer_abstract) && $mapbenderMetadata[$m]->layer_abstract != '' ) { $ressourceAbstract = $mapbenderMetadata[$m]->layer_abstract; } else { $ressourceAbstract = "Abstract of dataset cannot be found!"; } } //Begin generation of feed content ********************************************************************************************* //feed title - 5.1.1 / 5.2 //XYZ Example INSPIRE Download Service //XYZ Example INSPIRE Dataset ABC Download $feedTitle = $feedDoc->createElement("title"); //$feedTitle->setAttribute("xml:lang", "de"); if ($type == 'SERVICE') { $feedTitleText = $feedDoc->createTextNode("INSPIRE Download Service Feed für ".$ressourceTitle); } else { //DATASET $feedTitleText = $feedDoc->createTextNode("INSPIRE Datensatz Feed für ".$ressourceTitle); } $feedTitle->appendChild($feedTitleText); $feed->appendChild($feedTitle); //feed subtitle - 5.1.2 / 5.2 //INSPIRE Download Service of organisation XYZ providing a data set for the Hydrography theme //INSPIRE Download Service, of organisation XYZ providing dataset ABC for the Hydrography theme $feedSubTitle = $feedDoc->createElement("subtitle"); //$feedSubTitle->setAttribute("xml:lang", "de"); if ($type == 'SERVICE') { $feedSubTitleText = $feedDoc->createTextNode("INSPIRE Download Service von ".$departmentMetadata['mb_group_title'].""); } else { //DATASET $feedSubTitleText = $feedDoc->createTextNode("INSPIRE Download Service von: ".$departmentMetadata['mb_group_title']." zur Bereitstellung des Datensatzes: ".$ressourceTitle); } //TODO maybe add topic $feedSubTitle->appendChild($feedSubTitleText); $feed->appendChild($feedSubTitle); //links //metadata //service metadata - 5.1.3 / dataset metadata 5.2.1 // $feedLink = $feedDoc->createElement("link"); if ($type == 'SERVICE') { if ($generateFrom == 'wfs') { $feedLink->setAttribute("href", $mapbenderPath."php/mod_inspireAtomFeedISOMetadata.php?id=".$recordId."&outputFormat=iso19139&generateFrom=".$generateFrom."&wfsid=".$wfsId); } else { $feedLink->setAttribute("href", $mapbenderPath."php/mod_inspireAtomFeedISOMetadata.php?id=".$recordId."&outputFormat=iso19139&generateFrom=".$generateFrom."&layerid=".$layerId); } $feedLink->setAttribute("rel", "describedby"); $feedLink->setAttribute("type", "application/xml"); $feed->appendChild($feedLink); } else { //DATASET switch ($generateFrom) { //TODO: set inspire data model reference if conformity is declared and theme is given! case "wfs": if ($admin->getWFSOWSstring($mapbenderMetadata[$m]->wfs_id) == false) { $feedLink->setAttribute("href", $mapbenderMetadata[$m]->wfs_describefeaturetype."SERVICE=WFS&VERSION=".$mapbenderMetadata[$m]->wfs_version."&REQUEST=DescribeFeatureType&".$typeParameterName."=".$mapbenderMetadata[$m]->featuretype_name); } else { $feedLink->setAttribute("href", $mapbenderServerUrl."/registry/wfs/".$mapbenderMetadata[$m]->wfs_id."?INSPIRE=1&"."SERVICE=WFS&VERSION=".$mapbenderMetadata[$m]->wfs_version."&REQUEST=DescribeFeatureType&".$typeParameterName."=".$mapbenderMetadata[$m]->featuretype_name); } $feedLink->setAttribute("rel", "describedby"); $feedLink->setAttribute("type", "application/xml"); $feed->appendChild($feedLink); break; case "wms": $feedLink->setAttribute("href", "https://en.wikipedia.org/wiki/GeoTIFF"); $feedLink->setAttribute("rel", "describedby"); $feedLink->setAttribute("type", "text/html"); $feed->appendChild($feedLink); break; case "dataurl": $feedLink->setAttribute("href", "https://www.google.com/search?q=".$mapbenderMetadata[$m]->format."+spatial"); $feedLink->setAttribute("rel", "describedby"); $feedLink->setAttribute("type", "text/html"); $feed->appendChild($feedLink); break; case "metadata": $feedLink->setAttribute("href", "https://www.google.com/search?q=".$mapbenderMetadata[$m]->format."+spatial"); $feedLink->setAttribute("rel", "describedby"); $feedLink->setAttribute("type", "text/html"); $feed->appendChild($feedLink); break; } } //self reference - 5.1.4 / 5.2 if ($type == 'SERVICE') { $selfReference = $mapbenderServerUrl.$_SERVER['SCRIPT_NAME']."?id=".$recordId."&type=SERVICE&generateFrom=".$generateFrom; switch($generateFrom) { case "wmslayer": $selfReference .= "&layerid=".$mapbenderMetadata[$m]->layer_id; break; case "wfs": $selfReference .= "&wfsid=".$mapbenderMetadata[$m]->wfs_id; break; } } else { //DATASET $selfReference = $mapbenderServerUrl.$_SERVER['SCRIPT_NAME']."?id=".$recordId."&type=DATASET&generateFrom=".$generateFrom; switch($generateFrom) { case "wmslayer": $selfReference .= "&layerid=".$mapbenderMetadata[$m]->layer_id; break; case "wfs": $selfReference .= "&wfsid=".$mapbenderMetadata[$m]->wfs_id; if ($featuretypeId !== false) { //$e = new mb_exception("ft_id: ".$featuretypeId); $selfReference .= "&featuretypeid=".$featuretypeId; } else { $selfReference .= "&featuretypeid=".$mapbenderMetadata[$m]->featuretype_id; } break; } } // $feedLink = $feedDoc->createElement("link"); $feedLink->setAttribute("href", $selfReference); $feedLink->setAttribute("rel", "self"); $feedLink->setAttribute("type", "application/atom+xml"); $feedLink->setAttribute("hreflang", "de"); $feedLink->setAttribute("title", "Selbstreferenz"); $feed->appendChild($feedLink); //opensearch descriptionlink 5.1.5 if ($type == 'SERVICE') { $feedLink = $feedDoc->createElement("link"); $feedLink->setAttribute("href", $mapbenderServerUrl.$_SERVER['SCRIPT_NAME']."?id=".$recordId."&type=".$type."&generateFrom=".$generateFrom."&wfsid=".$wfsId."&layerid=".$layerId."&getopensearch=true"); $feedLink->setAttribute("rel", "search"); $feedLink->setAttribute("type", "application/opensearchdescription+xml"); //$feedLink->setAttribute("hreflang", "de"); $feedLink->setAttribute("title", "Open Search Beschreibung des INSPIRE Download Dienstes für den Datensatz ".$ressourceTitle); $feed->appendChild($feedLink); } else { //5.2.2 //description of datatypes - if given??? What todo when there is no description available - some html page have to be referenced? /*$feedLink = $feedDoc->createElement("link"); $feedLink->setAttribute("href", $mapbenderPath."php/mod_showMetadata.php?languageCode=de&resource=layer&layout=tabs&id=".$recordId); //TODO show metadata in form of html content - switch for each type $feedLink->setAttribute("rel", "describedby"); $feedLink->setAttribute("type", "text/html"); $feedLink->setAttribute("hreflang", "de"); $feedLink->setAttribute("title", "Nähere Beschreibung des Datensatzes"); $feed->appendChild($feedLink);*/ } //5.1.6 - 5.1.7 //other -- not needed cause only one language is defined // // // //optional link to wfs capabilities document / see TG 3.1 from 09.08.2013 if ($type == 'SERVICE' && $generateFrom == "wfs") { /**/ $feedLink = $feedDoc->createElement("link"); if ($admin->getWFSOWSstring($mapbenderMetadata[$m]->wfs_id) == false) { //$wfsGetCapabilitiesUrl = $mapbenderMetadata[$m]->wfs_getcapabilities; if (count($mapbenderMetadata) == 1) { //$e = new mb_exception(count($mapbenderMetadata)); $wfsGetCapabilitiesUrl = $mapbenderPath."php/wfs.php?INSPIRE=1&FEATURETYPE_ID=".$mapbenderMetadata[$m]->featuretype_id; } else { //TODO - set url to wfs proxy - wfs.php has to be adopted to allow more than one featuretype as parameter! $wfsGetCapabilitiesUrl = $mapbenderMetadata[$m]->wfs_getcapabilities; } } else { $wfsGetCapabilitiesUrl = $mapbenderServerUrl."/registry/wfs/".$mapbenderMetadata[$m]->wfs_id."?INSPIRE=1"; } $feedLink->setAttribute("href", $wfsGetCapabilitiesUrl."&request=GetCapabilities&VERSION=".$mapbenderMetadata[$m]->wfs_version."&SERVICE=WFS"); $feedLink->setAttribute("rel", "related"); $feedLink->setAttribute("type", "application/xml"); //$feedLink->setAttribute("hreflang", "en"); $feedLink->setAttribute("title", "Service implementing Direct Access operations"); $feed->appendChild($feedLink); } // //http://xyz.org/data - also self reference - see 5.1.8 on page 39 of INSPIRE GD for Download Services V 3.0 // and 5.2.1 if ($type == 'SERVICE') { $feedId = $feedDoc->createElement("id"); $feedIdText = $feedDoc->createTextNode($selfReference); $feedId->appendChild($feedIdText); $feed->appendChild($feedId); } else { //use inspire resource identifier? $feedId = $feedDoc->createElement("id"); $feedIdText = $feedDoc->createTextNode($selfReference); $feedId->appendChild($feedIdText); $feed->appendChild($feedId); } // //Copyright (c) 2011, XYZ; all rights reserved -- see 5.1.9 on page 39 of INSPIRE GD for Download Services V 3.0 - only accessconstraints should be used $feedRights = $feedDoc->createElement("rights"); $feedRightsText = $feedDoc->createTextNode($mapbenderMetadata[$m]->accessconstraints); $feedRights->appendChild($feedRightsText); $feed->appendChild($feedRights); // -- see 5.1.10 on page 40 of INSPIRE GD for Download Services V 3.0 - maybe date of metadata should be used - first we use current date! //2011-09-24T13:45:03Z $feedUpdated = $feedDoc->createElement("updated"); $feedUpdatedText = $feedDoc->createTextNode(date(DATE_ATOM,time())); $feedUpdated->appendChild($feedUpdatedText); $feed->appendChild($feedUpdated); // 5.1.11 // // John Doe // doe@xyz.org // $feedAuthor = $feedDoc->createElement("author"); $feedAuthorName = $feedDoc->createElement("name"); $feedAuthorEmail = $feedDoc->createElement("email"); //check for department, 1. group, 2. from metadata, 3. dummy if ($departmentMetadata["mb_group_title"] == "" || empty($departmentMetadata["mb_group_title"])) { if ($mapbenderMetadata[$m]->ressource_responsible_party == "" || empty($mapbenderMetadata[$m]->ressource_responsible_party)) { $feedAuthorName->appendChild($feedDoc->createTextNode("No responsible department found!")); } else { $feedAuthorName->appendChild($feedDoc->createTextNode($mapbenderMetadata[$m]->ressource_responsible_party)); } } else { $feedAuthorName->appendChild($feedDoc->createTextNode($departmentMetadata["mb_group_title"])); } if ($departmentMetadata["mb_group_email"] == "" || empty($departmentMetadata["mb_group_email"])) { if ($mapbenderMetadata[$m]->ressource_contact_email == "" || empty($mapbenderMetadata[$m]->ressource_contact_email)) { $feedAuthorEmail->appendChild($feedDoc->createTextNode("No email for responsible department found!")); } else { $feedAuthorEmail->appendChild($feedDoc->createTextNode($mapbenderMetadata[$m]->ressource_contact_email)); } } else { $feedAuthorEmail->appendChild($feedDoc->createTextNode($departmentMetadata["mb_group_email"])); } //$feedAuthorEmail->appendChild($feedDoc->createTextNode($departmentMetadata["mb_group_email"])); $feedAuthor->appendChild($feedAuthorName); $feedAuthor->appendChild($feedAuthorEmail); $feed->appendChild($feedAuthor); //check for given polygonal extent: if (is_null($mapbenderMetadata[$m]->metadata_polygon)) { $e = new mb_notice("php/mod_inspireDownloadFeed.php polygonalFilter is not set"); $polygonalFilter = false; } else { $e = new mb_notice("php/mod_inspireDownloadFeed.php polygonalFilter was found and will be applied!"); $polygonalFilter = true; } $e = new mb_notice("php/mod_inspireDownloadFeed.php metadata_uuid: ".$mapbenderMetadata[$m]->metadata_uuid); // //if dataurl not given and a raster wms is defined - calculate the number of entries if ($type == 'DATASET' && $generateFrom == "wmslayer") { $numberOfEntries = 1; //only one entry with many links!! //calculate number of entries and the bboxes if ($mapbenderMetadata[$m]->spatial_res_type != 'groundDistance' & $mapbenderMetadata[$m]->spatial_res_type != 'scaleDenominator') { echo "WMS footprints cannot be calculated, cause kind of resolution is not given."; } else { if (!is_int((integer)$mapbenderMetadata[$m]->spatial_res_value)) { echo "WMS footprints cannot be calculated, cause resolution is no integer."; } else { $maxImageSize = (integer)$mapbenderMetadata[$m]->wms_max_imagesize; //calculate the bboxes //transform layer_bbox to mb_metadata epsg /*$georssPolygon = $mapbenderMetadata["minx"]." ".$mapbenderMetadata["miny"]." ".$mapbenderMetadata["maxx"]." ".$mapbenderMetadata["miny"]." "; $georssPolygon .= $mapbenderMetadata["maxx"]." ".$mapbenderMetadata["maxy"]." ".$mapbenderMetadata["minx"]." ".$mapbenderMetadata["maxy"]." "; $georssPolygon .= $mapbenderMetadata["minx"]." ".$mapbenderMetadata["miny"]; echo $georssPolygon;*/ //TODO: check if epsg, and bbox are filled correctly! $sqlExtent = "SELECT X(transform(GeometryFromText('POINT(".$mapbenderMetadata[$m]->minx." ".$mapbenderMetadata[$m]->miny.")',4326),".$epsgId.")) as minx, Y(transform(GeometryFromText('POINT(".$mapbenderMetadata[$m]->minx." ".$mapbenderMetadata[$m]->miny.")',4326),".$epsgId.")) as miny, X(transform(GeometryFromText('POINT(".$mapbenderMetadata[$m]->maxx." ".$mapbenderMetadata[$m]->maxy.")',4326),".$epsgId.")) as maxx, Y(transform(GeometryFromText('POINT(".$mapbenderMetadata[$m]->maxx." ".$mapbenderMetadata[$m]->maxy.")',4326),".$epsgId.")) as maxy"; $resExtent = db_query($sqlExtent); $minx = floatval(db_result($resExtent,0,"minx")); $miny = floatval(db_result($resExtent,0,"miny")); $maxx = floatval(db_result($resExtent,0,"maxx")); $maxy = floatval(db_result($resExtent,0,"maxy")); $diffX = $maxx - $minx; //in m $diffY = $maxy - $miny; //in m //$e = new mb_exception($diffX); //echo $diffX .":". $diffY; //calculate target number of pixels for x and y switch ($mapbenderMetadata[$m]->spatial_res_type) { case "scaleDenominator": //transform to pixel $diffXPx = $diffX / (float)$mapbenderMetadata[$m]->spatial_res_value / (float)0.0254 * floatval($imageResolution); $diffYPx = $diffY / (float)$mapbenderMetadata[$m]->spatial_res_value / (float)0.0254 * floatval($imageResolution); break; case "groundDistance": //transform to pixel $diffXPx = $diffX / floatval($mapbenderMetadata[$m]->spatial_res_value); $diffYPx = $diffY / floatval($mapbenderMetadata[$m]->spatial_res_value); break; } $e = new mb_notice($diffXPx.":".$diffYPx); $nRows = ceil($diffYPx / floatval($maxImageSize)); $nCols = ceil($diffXPx / floatval($maxImageSize)); $e = new mb_notice($nRows.":".$nCols); $bboxWms = array(); $bboxWmsWGS84 = array(); /*echo $diffXPx.":".$diffYPx.","; echo $nRows.":".$nCols.","; echo $minx.":".$miny.","; echo $maxx.":".$maxy.",";*/ $incX = $diffX / ($diffXPx / floatval($maxImageSize)); $incY = $diffY / ($diffYPx / floatval($maxImageSize)); for ($j = 0; $j < $nRows; $j++) { for ($k = 0; $k < $nCols; $k++) { //echo "j: ".$k.",k: ".$j; $minxWms = $minx + $k * $incX; //echo "minxWms: ". $minxWms .","; $minyWms = $miny + $j * $incY; //echo "minyWms: ". $minyWms .","; $maxxWms = $minx + ($k+1) * $incX; //echo "maxxWms: ". $maxxWms .","; $maxyWms = $miny + ($j+1) * $incY; //echo "maxyWms: ". $maxyWms .","; $bboxWms[] = $minxWms.",".$minyWms.",".$maxxWms.",".$maxyWms; //new: use filter of polygon is given ;-) $lonLatBboxWms = transformBbox($minxWms.",".$minyWms.",".$maxxWms.",".$maxyWms,intval($epsgId),4326,$mapbenderMetadata[$m]->metadata_uuid,$polygonalFilter); //only add entry, if not false if ($lonLatBboxWms != false) { $bboxWmsWGS84[] = $lonLatBboxWms; } else { //delete last entry from $bboxWms, cause it is outside the polygon! array_pop($bboxWms); } } } } } //generate wgs84 bbox again - transform it from projected coords $numberOfTiles = count($bboxWms); } else { if ($type == 'DATASET' && $generateFrom == "wfs") { $numberOfEntries = 1; //generate Download Links for the different featuretypes //first calculate the number of tiles for the different featureTypes $featureHits = array(); $getFeatureLink = array(); $featureTypeName = array(); $featureTypeBbox = array(); $featureTypeBboxWGS84 = array(); $featuretypeIndex = false; //For each featuretype which was found! Maybe more than one! for ($i = 0; $i < $countRessource; $i++) { //$e = new mb_exception($featuretypeId); if ($featuretypeId !== false && $mapbenderMetadata[$i]->featuretype_id == $featuretypeId) { $featuretypeIndex = $i; //overwrite feature count with information from database $maxFeatureCount = (integer)$mapbenderMetadata[$i]->wfs_max_features; $crs = $mapbenderMetadata[$i]->metadata_ref_system; //use featuretype ref system - to build the bbox filters!!! $crs = $mapbenderMetadata[$i]->featuretype_srs; //log ref system of metadata - is this a good idea? //$e = new mb_exception("Ref system of featuretype ".$mapbenderMetadata[$i]->featuretype_name." : ".$crs); //*********************** New use crs class for checking if the order has to be changed in the filter!!! $crsObject = new Crs($crs); if ($crsObject->alterAxisOrder("wfs"."_".$mapbenderMetadata[$i]->wfs_version) == true) { $alterAxisOrder = true; } else { $alterAxisOrder = false; } //************************************************************************************** $e = new mb_notice("Epsg id of featuretype ".$mapbenderMetadata[$i]->featuretype_name." : ".$epsgId); if (!($mapbenderMetadata[$i]->wfs_version) || $mapbenderMetadata[$i]->wfs_version == '') { return "Version of WFS : ".$mapbenderMetadata[$i]->wfs_version." is not supported to generate inspire download services for predefined datasets!"; } //check if count is possible - in wfs 1.0.0 it is not possible! if ($mapbenderMetadata[$i]->wfs_version !== '1.0.0') { //define request to get number of hits per featuretype //add ? if not given in string $gHLink = $mapbenderMetadata[$i]->wfs_getfeature."SERVICE=WFS&REQUEST=GetFeature&VERSION="; $gHLink .= $mapbenderMetadata[$i]->wfs_version."&".$typeParameterName."="; $gHLink .= $mapbenderMetadata[$i]->featuretype_name."&resultType=hits"; $startRequestTime = time(); //get auth information from database: $sql = "SELECT wfs_auth_type, wfs_username, wfs_password from wfs WHERE wfs_id = $1 "; $v = array($mapbenderMetadata[$i]->wfs_id); $t = array('i'); $res = db_prep_query($sql,$v,$t); $row = db_fetch_assoc($res); $auth['auth_type'] = $row["wfs_auth_type"]; $auth['username'] = $row["wfs_username"]; $auth['password'] = $row["wfs_password"]; if (isset($auth['auth_type']) && $auth['auth_type'] != '' && isset($auth['username']) && $auth['username'] != '' && isset($auth['password']) && $auth['password'] != '') { $hitConnector = new connector($gHLink,$auth); } else { $hitConnector = new connector($gHLink); } $hitXml = $hitConnector->file; $endRequestTime = time(); $diffTime = $endRequestTime-$startRequestTime; $e = new mb_notice("Time for counting objects of featuretype ".$mapbenderMetadata[$i]->featuretype_name." : ".$diffTime." seconds!"); //parse hits try { $featureTypeHits = new SimpleXMLElement($hitXml); if ($featureTypeHits == false) { throw new Exception('Cannot parse WFS number of hits request!'); } } catch (Exception $e) { $e = new mb_exception($e->getMessage()); } switch ($mapbenderMetadata[$i]->wfs_version) { case "2.0.0": $hits = $featureTypeHits->xpath('/wfs:FeatureCollection/@numberMatched'); break; case "2.0.2": $hits = $featureTypeHits->xpath('/wfs:FeatureCollection/@numberMatched'); break; case "1.1.0": $hits = $featureTypeHits->xpath('/wfs:FeatureCollection/@numberOfFeatures'); break; } $featureHits[$i] = (integer)$hits[0]; //$e = new mb_exception($featureHits[$i]." hits for featuretype ".$mapbenderMetadata[$i]->featuretype_name); //calculate further bboxes if the # of hits extents some value //minimum number of single tiles: $countTiles = ceil($featureHits[$i]/$maxFeatureCount); } else { $countTiles = 1; } //calculate number of rows and columns from x / y ratio //$e = new mb_exception("http/php/mod_inspireDownloadFeed.php: - Bbox from metadata: minx: ". $mapbenderMetadata[$i]->minx." - miny: ".$mapbenderMetadata[$i]->miny." - maxx: ".$mapbenderMetadata[$i]->maxx." - maxy: ".$mapbenderMetadata[$i]->maxy." - CRS: ".$mapbenderMetadata[$i]->featuretype_srs." - EPSG ID: ".$crsObject->identifierCode); //set epsgId; $epsgId = $crsObject->identifierCode; //read out in variables $sqlExtent = "SELECT X(transform(GeometryFromText('POINT(".$mapbenderMetadata[$i]->minx." ".$mapbenderMetadata[$i]->miny.")',4326),".$crsObject->identifierCode.")) as minx, Y(transform(GeometryFromText('POINT(".$mapbenderMetadata[$i]->minx." ".$mapbenderMetadata[$i]->miny.")',4326),".$crsObject->identifierCode.")) as miny, X(transform(GeometryFromText('POINT(".$mapbenderMetadata[$i]->maxx." ".$mapbenderMetadata[$i]->maxy.")',4326),".$crsObject->identifierCode.")) as maxx, Y(transform(GeometryFromText('POINT(".$mapbenderMetadata[$i]->maxx." ".$mapbenderMetadata[$i]->maxy.")',4326),".$crsObject->identifierCode.")) as maxy"; $resExtent = db_query($sqlExtent); $minx = floatval(db_result($resExtent,0,"minx")); $miny = floatval(db_result($resExtent,0,"miny")); $maxx = floatval(db_result($resExtent,0,"maxx")); $maxy = floatval(db_result($resExtent,0,"maxy")); //$e = new mb_exception("http/php/mod_inspireDownloadFeed.php: - minx: ".$minx. " - maxx: ".$maxx); //only calculate new boxes if countTiles > 1 if ($countTiles > 1) { $diffX = $maxx - $minx; //in m - depends on given epsg code $diffY = $maxy - $miny; //in m $width = sqrt(($diffX * $diffY) / $countTiles); $nRows = ceil($diffY / $width); $nCols = ceil($diffX / $width); $bboxWfs = array(); $countBbox = 0; for ($j = 0; $j < $nRows; $j++) { for ($k = 0; $k < $nCols; $k++) { //echo "j: ".$k.",k: ".$j; $minxWfs = $minx + $k * $width; //echo "minxWms: ". $minxWms .","; $minyWfs = $miny + $j * $width; //echo "minyWms: ". $minyWms .","; $maxxWfs = $minx + ($k+1) * $width; //echo "maxxWms: ". $maxxWms .","; $maxyWfs = $miny + ($j+1) * $width; //echo "maxyWms: ". $maxyWms .","; $bboxWfs[$mapbenderMetadata[$i]->featuretype_name][$countBbox] = $minxWfs.",".$minyWfs.",".$maxxWfs.",".$maxyWfs; //transform bbox back to geographic coordinates and filter them if a spatial_extent as polygon is given (give only those which intersects)!! $lonLatBbox = transformBbox($minxWfs.",".$minyWfs.",".$maxxWfs.",".$maxyWfs,intval($epsgId),4326, $mapbenderMetadata[$i]->metadata_uuid, $polygonalFilter); //only add entry, if not false if ($lonLatBbox != false) { $lonLatBbox = explode(',',$lonLatBbox); //georss needs latitude longitude $featureTypeBboxWGS84[] = $lonLatBbox[1].",".$lonLatBbox[0].",".$lonLatBbox[3].",".$lonLatBbox[2]; //switch bbox to lat/lon cause inspire demands ist $countBbox++; } } } } else { //only normal extent used if ($minx == "" || $miny == "" || $maxx == "" || $maxy == "") { //set default values //EPSG:4326 //use lon/lat - for postgis!!! $minx = "-180"; $miny = "-90"; $maxx = "180"; $maxy = "90"; /* */ $epsgId = "4326"; } $bboxWfs[$mapbenderMetadata[$i]->featuretype_name][0] = $minx.",".$miny.",".$maxx.",".$maxy; //transform bbox back to geographic coordinates $lonLatBbox = transformBbox($minx.",".$miny.",".$maxx.",".$maxy,intval($epsgId),4326); $lonLatBbox = explode(',',$lonLatBbox); //georss needs latitude longitude $featureTypeBboxWGS84[] = $lonLatBbox[1].",".$lonLatBbox[0].",".$lonLatBbox[3].",".$lonLatBbox[2]; } //$getFeatureLink = array(); /*TODO for ($i = 0; $i < $countRessource-1; $i++) { $gFLink = $mapbenderMetadata[$i]->wfs_getfeature."SERVICE=WFS&REQUEST=GetFeature&VERSION="; $gFLink .= $mapbenderMetadata[$i]->wfs_version."&typeName=".$mapbenderMetadata[$i]->featuretype_name; $gFLink .= "&maxFeatures=".$featureHits[$i]."&srsName=".$mapbenderMetadata[$i]->featuretype_srs; $getFeatureLink[] = $gFLink; }*/ //echo count($bboxWfs[$mapbenderMetadata[$i]->featuretype_name]); for ($l = 0; $l < count($bboxWfs[$mapbenderMetadata[$i]->featuretype_name]); $l++) { //generate bbox Filter: //-8033496.4863128,5677373.0653376 -7988551.5136872,5718801.9346624 /* fes="http://www.opengis.net/fes/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" /RS1/geometry 10 10 20 20 */ if (!isset($mapbenderMetadata[$i]->geometry_field_name[0]) || $mapbenderMetadata[$i]->geometry_field_name[0] == '') { $geometryFieldName = 'geometry'; } else { $geometryFieldName = $mapbenderMetadata[$i]->geometry_field_name[0]; } //$e = new mb_exception("mod_inspireDownloadFeed.php: geometryFieldName: ".$geometryFieldName); //get bbox from wfs metadata $currentBbox = explode(',',$bboxWfs[$mapbenderMetadata[$i]->featuretype_name][$l]); //change axis order if crs definition and service needs it if ($alterAxisOrder == true) { //$e = new mb_exception("mod_inspireDownloadFeed.php: axis order should be altered!"); $currentBboxNew = $currentBbox; $currentBboxGetFeature[0] = $currentBboxNew[1]; $currentBboxGetFeature[1] = $currentBboxNew[0]; $currentBboxGetFeature[2] = $currentBboxNew[3]; $currentBboxGetFeature[3] = $currentBboxNew[2]; } else { $currentBboxGetFeature = $currentBbox; } /*$e = new mb_exception("ftname: ".$mapbenderMetadata[$i]->featuretype_name); $e = new mb_exception("gfname: ".$geometryFieldName);*/ if (strpos($mapbenderMetadata[$i]->featuretype_name, ':') !== false) { $ftNamespace = explode(':', $mapbenderMetadata[$i]->featuretype_name); $ftNamespace = $ftNamespace[0]; $geometryFieldName = $ftNamespace.':'.$geometryFieldName; } else { $ftNamespace = false; $geometryFieldName = $geometryFieldName; } switch ($mapbenderMetadata[$i]->wfs_version) { case "2.0.0": $bboxFilter = ''; $bboxFilter .= ''.$geometryFieldName.''; // $bboxFilter .= ''; //FIX for ESRI? TODO $bboxFilter .= ''.$currentBboxGetFeature[0].' '.$currentBboxGetFeature[1].''; $bboxFilter .= ''.$currentBboxGetFeature[2].' '.$currentBboxGetFeature[3].''; $bboxFilter .= ''; $bboxFilter .= ''; $bboxFilter .= ''; $bboxFilter = rawurlencode(utf8_decode($bboxFilter)); break; case "2.0.2": $bboxFilter = ''; $bboxFilter .= ''.$geometryFieldName.''; // $bboxFilter .= ''; //FIX for ESRI? TODO $bboxFilter .= ''.$currentBboxGetFeature[0].' '.$currentBboxGetFeature[1].''; $bboxFilter .= ''.$currentBboxGetFeature[2].' '.$currentBboxGetFeature[3].''; $bboxFilter .= ''; $bboxFilter .= ''; $bboxFilter .= ''; $bboxFilter = rawurlencode(utf8_decode($bboxFilter)); break; case "1.1.0": $bboxFilter = ''; //$bboxFilter = ''; //$bboxFilter .= 'geometry_field_name[0].''; $bboxFilter .= ''; $bboxFilter .= ''; //$currentBbox = explode(',',$bboxWfs[$mapbenderMetadata[$i]->featuretype_name][$l]); $e = new mb_notice("Bounding box ".$l." : ".$l.$bboxWfs[$mapbenderMetadata[$i]->featuretype_name][$l]); //fix for esri????? TODO check crs axes order handling //if (strtoupper($mapbenderMetadata[$i]->geometry_field_name[0] == "SHAPE")) { // $bboxFilter .= $currentBboxGetFeature[1].','.$currentBboxGetFeature[0].' '.$currentBboxGetFeature[3].','.$currentBboxGetFeature[2]; //} else { $bboxFilter .= $currentBboxGetFeature[0].','.$currentBboxGetFeature[1].' '.$currentBboxGetFeature[2].','.$currentBboxGetFeature[3]; //} $bboxFilter .= ''; $bboxFilter = rawurlencode(utf8_decode($bboxFilter)); break; } //check if owsproxy is activated for wfs - if so, use absolute url of wfs //e.g.: www.geoportal.rlp.de/registry/wfs/{wfs_id}? - important - there has to be one wfsconf defined and assigned! if ($admin->getWFSOWSstring($mapbenderMetadata[$i]->wfs_id) == false) { $wfsGetFeatureUrl = $mapbenderMetadata[$i]->wfs_getfeature; } else { $wfsGetFeatureUrl = $mapbenderServerUrl."/registry/wfs/".$mapbenderMetadata[$i]->wfs_id."?"; } $gFLink = $wfsGetFeatureUrl."SERVICE=WFS&REQUEST=GetFeature&VERSION="; $gFLink .= $mapbenderMetadata[$i]->wfs_version."&".$typeParameterName."=".$mapbenderMetadata[$i]->featuretype_name; $gFLink .= "&srsName=".$mapbenderMetadata[$i]->featuretype_srs; //TODO check if other epsg string should be used! //$crsObject->identifier; if (count($mapbenderMetadata[$i]->output_formats) >= 1 && strtoupper($mapbenderMetadata[$i]->geometry_field_name[0] !== "SHAPE")) { //use first output format which have been found - TODO - check if it should be pulled from featuretype instead from wfs $gFLink .= "&outputFormat=".rawurlencode($mapbenderMetadata[$i]->output_formats[0]); } $gFLink .= "&FILTER=".$bboxFilter; $getFeatureLink[] = $gFLink; $featureTypeName[] = $mapbenderMetadata[$i]->featuretype_name; $featureTypeBbox[] = $bboxWfs[$mapbenderMetadata[$i]->featuretype_name][$l]; } //$numberOfTiles = count($bboxWfs[$mapbenderMetadata[$i]->featuretype_name]); //$e = new mb_exception("Number of tiles for wfs predefined download service: ".$numberOfTiles); } //end for if filter - if some featuretypeid was given via get parameter } //end for each featuretype } else { //type SERVICE was set - generate one entry for each coupled resource - they are distinguished by names, titles, ids, bbox, type of download! $numberOfEntries = count($mapbenderMetadata); } } $e = new mb_notice("Count of bboxes: ".$numberOfEntries); for ($i = 0; $i < $numberOfEntries; $i++) { // 5.1.12 / 5.2.3 $feedEntry = $feedDoc->createElement("entry"); // //Water network ABC //Water network in CRS EPSG:4258 (GML) $feedEntryTitle = $feedDoc->createElement("title"); //$feedEntryTitle->setAttribute("xml:lang", "de"); if ($type == 'SERVICE') { //generate one entry for each possible download variant switch ($mapbenderMetadata[$i]->origin) { case "wmslayer": $ressourceServiceFeedEntryTitle = $ressourceTitle." - generiert aus WMS Datenquelle"; break; case "dataurl": $ressourceServiceFeedEntryTitle = $ressourceTitle." - generiert aus WMS Capabilities dataURL Element"; break; case "wfs": $ressourceServiceFeedEntryTitle = $ressourceTitle." - Objektart: ".$mapbenderMetadata[$i]->featuretype_title." (".$mapbenderMetadata[$i]->featuretype_name.") - generiert über WFS GetFeature Aufrufe"; break; case "metadata": $ressourceServiceFeedEntryTitle = $ressourceTitle." - generiert über Downloadlinks aus Metadatensatz"; break; } $feedEntryTitle->appendChild($feedDoc->createTextNode("Feed Entry fuer: ".$ressourceServiceFeedEntryTitle)); //TODO: maybe add some category? } else { switch ($mapbenderMetadata[$i]->origin) { case "wmslayer": $ressourceDataFeedEntryTitle = $ressourceTitle." - generiert aus WMS Datenquelle"; $resourceFormat = "image/tiff"; break; case "dataurl": $ressourceDataFeedEntryTitle = $ressourceTitle." - generiert aus WMS Capabilities dataURL Element"; $resourceFormat = $mapbenderMetadata[$i]->format; break; case "wfs": if ($featuretypeIndex !== false) { $ressourceDataFeedEntryTitle = $ressourceTitle." - Objektart: ".$mapbenderMetadata[$featuretypeIndex]->featuretype_title." (".$mapbenderMetadata[$featuretypeIndex]->featuretype_name.") - generiert über WFS GetFeature Aufrufe"; } else { $ressourceDataFeedEntryTitle = $ressourceTitle." - Objektart: ".$mapbenderMetadata[$i]->featuretype_title." (".$mapbenderMetadata[$i]->featuretype_name.") - generiert über WFS GetFeature Aufrufe"; } //$resourceFormat = "application/gml+xml"; //first format from wfs server $resourceFormat = $mapbenderMetadata[$i]->output_formats[0]; break; case "metadata": $ressourceDataFeedEntryTitle = $ressourceTitle." - generiert über Downloadlinks aus Metadatensatz"; $resourceFormat = $mapbenderMetadata[$i]->format; break; } $feedEntryTitle->appendChild($feedDoc->createTextNode($ressourceDataFeedEntryTitle. " im CRS ".$mapbenderMetadata[$i]->metadata_ref_system." und Format ".$resourceFormat)); //TODO: maybe add some category? } $feedEntry->appendChild($feedEntryTitle); /*For Service: wn_id1 http://xyz.org/ http://xyz.org/data/waternetwork_feed.xml*/ //or link to dataset 5.2.3 // $datasetFeedLink = $mapbenderServerUrl.$_SERVER['SCRIPT_NAME']."?id=".$recordId."&type=DATASET&generateFrom=".$mapbenderMetadata[$i]->origin; switch($mapbenderMetadata[$i]->origin) { case "wmslayer": $datasetFeedLink .= "&layerid=".$mapbenderMetadata[$i]->layer_id; break; case "wfs": $datasetFeedLink .= "&wfsid=".$mapbenderMetadata[$i]->wfs_id; if ($featuretypeId !== false) { //$e = new mb_exception("ft_id: ".$featuretypeId); $datasetFeedLink .= "&featuretypeid=".$featuretypeId; } else { $datasetFeedLink .= "&featuretypeid=".$mapbenderMetadata[$i]->featuretype_id; } break; case "metadata": //$datasetFeedLink .= "&wfsid=".$mapbenderMetadata[$i]->wfs_id; break; } $datasetLink = $mapbenderMetadata[$i]->datalink_url; if ($type == 'SERVICE') { //insert resource identifier for service / dataset coupling!! $feedEntryIdCode = $feedDoc->createElement("inspire_dls:spatial_dataset_identifier_code"); $feedEntryIdCodeText = $feedDoc->createTextNode($mapbenderMetadata[$i]->datasetid); $feedEntryIdCode->appendChild($feedEntryIdCodeText); $feedEntry->appendChild($feedEntryIdCode); $feedEntryIdNamespace = $feedDoc->createElement("inspire_dls:spatial_dataset_identifier_namespace"); $feedEntryIdNamespaceText = $feedDoc->createTextNode($mapbenderMetadata[$i]->datasetid_codespace); $feedEntryIdNamespace->appendChild($feedEntryIdNamespaceText); $feedEntry->appendChild($feedEntryIdNamespace); $metadataLink = $mapbenderPath."php/mod_dataISOMetadata.php?outputFormat=iso19139&id=".$mapbenderMetadata[$m]->metadata_uuid; $feedEntryMetadataLink = $feedDoc->createElement("link"); $feedEntryMetadataLink->setAttribute("href",$metadataLink); $feedEntryMetadataLink->setAttribute("rel", "describedby"); $feedEntryMetadataLink->setAttribute("type", "application/xml"); $feedEntry->appendChild($feedEntryMetadataLink); $furtherLink = $datasetFeedLink; $furtherLinkType = "application/atom+xml"; $furtherLinkTitle = "Feed für den pre-defined Datensatz ".$ressourceTitle; $feedEntryLink = $feedDoc->createElement("link"); $feedEntryLink->setAttribute("rel", "alternate"); $feedEntryLink->setAttribute("href", $furtherLink); $feedEntryLink->setAttribute("type", $furtherLinkType); $feedEntryLink->setAttribute("hreflang", "de"); $feedEntryLink->setAttribute("title", $furtherLinkTitle); $feedEntry->appendChild($feedEntryLink); } else { //DATASET switch ($generateFrom) { case "dataurl": $furtherLink = $datasetLink; $furtherLinkType = $mapbenderMetadata[$i]->datalink_format; $furtherLinkTitle = $ressourceTitle." im CRS ".$mapbenderMetadata[$i]->metadata_ref_system."(".$mapbenderMetadata[$i]->format.")"; //generate content link $feedEntryLink = $feedDoc->createElement("link"); $feedEntryLink->setAttribute("rel", "alternate"); $feedEntryLink->setAttribute("href", $furtherLink); $feedEntryLink->setAttribute("type", $furtherLinkType); $feedEntryLink->setAttribute("hreflang", "de"); $feedEntryLink->setAttribute("title", $furtherLinkTitle); //$feedEntryLink->setAttribute("bbox", $newBox); $feedEntry->appendChild($feedEntryLink); break; case "metadata": $downloadLinks = json_decode($mapbenderMetadata[$i]->datalinks); $furtherLink = urldecode($downloadLinks->downloadLinks[0]->{"0"}); $furtherLinkType = $formatsMimetype[$mapbenderMetadata[$i]->format]; $furtherLinkTitle = $ressourceTitle." im CRS ".$mapbenderMetadata[$i]->metadata_ref_system."(".$mapbenderMetadata[$i]->format.")"; //generate content link $feedEntryLink = $feedDoc->createElement("link"); $feedEntryLink->setAttribute("rel", "alternate"); $feedEntryLink->setAttribute("href", $furtherLink); $feedEntryLink->setAttribute("type", $furtherLinkType); $feedEntryLink->setAttribute("hreflang", "de"); $feedEntryLink->setAttribute("title", $furtherLinkTitle); if (isset($mapbenderMetadata[$i]->transfer_size) && $mapbenderMetadata[$i]->transfer_size !== '') { $feedEntryLink->setAttribute("length", ceil(((double)$mapbenderMetadata[$i]->transfer_size)*1000000)); } //$feedEntryLink->setAttribute("bbox", $newBox); $feedEntry->appendChild($feedEntryLink); break; case "wmslayer": //example: //http://localhost/cgi-bin/mapserv?map=/data/umn/geoportal/karte_rp/testinspiredownload.map&VERSION=1.1.1&REQUEST=GetMap&SERVICE=WMS&LAYERS=inspirewms&STYLES=&SRS=EPSG:4326&BBOX=6.92134,50.130465,6.93241,50.141535000000005&WIDTH=200&HEIGHT=200&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_inimage //generate further links, one for each tile which was computed before $furtherLink = array(); $furtherLinkType = array(); $furtherLinkTitle = array(); $furtherLinkBbox = array(); if ($numberOfTiles > 1) { $feedEntryContent = $feedDoc->createElement("content"); $feedEntryContentText = $feedDoc->createTextNode("Datensatz wird in in ".$numberOfTiles." einzelnen Teilen ausgeliefert."); $feedEntryContent->appendChild($feedEntryContentText); $feedEntry->appendChild($feedEntryContent); } for ($m = 0; $m < $numberOfTiles; $m++ ) { //check if proxy is used, if so exchange urls with proxy urls if ($mapbenderMetadata[$i]->wms_owsproxy <> NULL && $mapbenderMetadata[$i]->wms_getmap != '') { $getMapUrl = str_replace(":80","",HTTP_AUTH_PROXY)."/".$mapbenderMetadata[$i]->layer_id."?"; //TODO check why :80 is part of the http_host - maybe apache rewrite } else { $getMapUrl = $mapbenderMetadata[$i]->wms_getmap; } //TODO - define further link for wms 1.1.1 and wms 1.3.0 - SRS Paramter changed and maybe the axis order!!!!!! $furtherLink[$m] = $getMapUrl."REQUEST=GetMap&VERSION=".$mapbenderMetadata[$i]->wms_version."&SERVICE=WMS&LAYERS=".$mapbenderMetadata[$i]->layer_name; $furtherLink[$m] .= "&STYLES=&SRS=".trim($crs)."&BBOX=".$bboxWms[$m]."&WIDTH=".$maxImageSize."&HEIGHT=".$maxImageSize."&FORMAT=image/tiff&"; $furtherLink[$m] .= "BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_inimage"; $furtherLinkType[$m] = "image/tiff"; //formats from layer_format - geotiff $currentTileIndex = $m+1; $furtherLinkTitle[$m] = $ressourceTitle." im CRS ".$mapbenderMetadata[$i]->metadata_ref_system." - ".$resourceFormat." - Teil ".$currentTileIndex." von ".$numberOfTiles.""; //$furtherLinkBbox[$m] = $bboxWms[$m]; $furtherLinkBbox[$m] = $bboxWmsWGS84[$m]; //exchange lon lat with lat long for georss $newBox = explode(',',$furtherLinkBbox[$m]); //georss needs latitude longitude $newBox = $newBox[1].",".$newBox[0].",".$newBox[3].",".$newBox[2]; //generate content link $feedEntryLink = $feedDoc->createElement("link"); if ($numberOfTiles > 1) { $feedEntryLink->setAttribute("rel", "section"); } else { $feedEntryLink->setAttribute("rel", "alternate"); } $feedEntryLink->setAttribute("href", $furtherLink[$m]); $feedEntryLink->setAttribute("type", $furtherLinkType[$m]); $feedEntryLink->setAttribute("hreflang", "de"); $feedEntryLink->setAttribute("title", $furtherLinkTitle[$m]); //if axis order was $feedEntryLink->setAttribute("bbox", str_replace(","," ",$newBox)); $feedEntry->appendChild($feedEntryLink); } break; case "wfs": //example: //http://localhost/cgi-bin/mapserv?map=/data/umn/geoportal/karte_rp/testinspiredownload.map&VERSION=1.1.1&REQUEST=GetMap&SERVICE=WMS&LAYERS=inspirewms&STYLES=&SRS=EPSG:4326&BBOX=6.92134,50.130465,6.93241,50.141535000000005&WIDTH=200&HEIGHT=200&FORMAT=image/png&BGCOLOR=0xffffff&TRANSPARENT=TRUE&EXCEPTIONS=application/vnd.ogc.se_inimage //for each possibly format do following //foreach ($mapbenderMetadata[$i]->output_formats as $output_format) { $furtherLink = array(); $furtherLinkType = array(); $furtherLinkTitle = array(); $furtherLinkBbox = array(); //loop for each featuretype $e = new mb_notice("Count of wfs links: ".count($getFeatureLink)); if (count($getFeatureLink) > 1) { $feedEntryContent = $feedDoc->createElement("content"); $feedEntryContentText = $feedDoc->createTextNode("Datensatz wird in in ".count($getFeatureLink)." einzelnen Teilen ausgeliefert."); //TODO exchange text for output_format! $feedEntryContent->appendChild($feedEntryContentText); $feedEntry->appendChild($feedEntryContent); } for ($m = 0; $m < count($getFeatureLink); $m++ ) { //TODO exchange text for output_format! $furtherLink[$m] = $getFeatureLink[$m];//was computed before //discard filter if only one request is needed - problem with epsg codes? TODO solve problem if (count($getFeatureLink) == 1) { $splittedLink = explode('&FILTER=',$furtherLink[$m]); $furtherLink[$m] = $splittedLink[0]; } //TODO exchange text for output_format - maybe match them before? $furtherLinkType[$m] = "application/gml+xml";//inspire media type registry http://inspire.ec.europa.eu/media-types/ $currentIndex = $m+1; $furtherLinkTitle[$m] = $ressourceTitle." im CRS ".$mapbenderMetadata[$i]->metadata_ref_system." - ".$resourceFormat." - Teil ".$currentIndex." von ".count($getFeatureLink)."";//TODO: set right format for wfs version! //$furtherLinkBbox[$m] = $featureTypeBbox[$m]; $furtherLinkBbox[$m] = $featureTypeBboxWGS84[$m]; $newBox = explode(',',$furtherLinkBbox[$m]); /*if ($alterAxisOrder == true) { $newBox = $newBox[1].",".$newBox[0].",".$newBox[3].",".$newBox[2]; } else {*/ $newBox = $newBox[0].",".$newBox[1].",".$newBox[2].",".$newBox[3]; /*}*/ //generate content links $feedEntryLink = $feedDoc->createElement("link"); if (count($getFeatureLink) > 1) { $feedEntryLink->setAttribute("rel", "section"); } else { $feedEntryLink->setAttribute("rel", "alternate"); } $feedEntryLink->setAttribute("href", $furtherLink[$m]); $feedEntryLink->setAttribute("type", $furtherLinkType[$m]); $feedEntryLink->setAttribute("hreflang", "de"); $feedEntryLink->setAttribute("title", $furtherLinkTitle[$m]); $feedEntryLink->setAttribute("bbox", str_replace(","," ",$newBox)); $feedEntry->appendChild($feedEntryLink); } //} end of foreach output_format break;//end for service type wfs } } //In the case of dynamically build entries for a raster based wms - not the dataurl but another the dyn ulrs will be used in the next feed //5.1.14 / 5.2 // //http://xyz.org/data/waternetwork.gml/id> //insert self reference $feedEntryId = $feedDoc->createElement("id"); $feedEntryId->appendChild($feedDoc->createTextNode($datasetFeedLink)); $feedEntry->appendChild($feedEntryId); // //Copyright (c) 2011, XYZ; all rights reserved -- see 5.1.9 on page 39 of INSPIRE GD for Download Services V 3.0 - only accessconstraints should be used $feedEntryRights = $feedDoc->createElement("rights"); $feedEntryRightsText = $feedDoc->createTextNode($mapbenderMetadata[$i]->accessconstraints); $feedEntryRights->appendChild($feedEntryRightsText); $feedEntry->appendChild($feedEntryRights); //5.1.14 / 5.2 - updated // //2011-06-14T12:22:09Z $feedEntryUpdated = $feedDoc->createElement("updated"); $feedEntryUpdated->appendChild($feedDoc->createTextNode(date(DATE_ATOM,time()))); $feedEntry->appendChild($feedEntryUpdated); //5.1.15 / // //This is the entry for water network ABC Dataset if ($type == 'SERVICE') { $feedEntrySummary = $feedDoc->createElement("summary"); $feedEntrySummary->appendChild($feedDoc->createTextNode("Nähere Beschreibung des Feedinhaltes: ".$ressourceAbstract)); $feedEntry->appendChild($feedEntrySummary); } //5.1.16 / 5.2? // //47.202 5.755 55.183 5.755 55.183 15.253 47.202 15.253 47.202 5.755 //TODO: Get this out of mb_metadata! If not given get it from layer bbox - but normally they should be identical! $feedEntryBbox = $feedDoc->createElement("georss:polygon"); $e = new mb_notice('mapbender minx: '.$mapbenderMetadata[$i]->minx); $e = new mb_notice('mapbender i: '.$i); $e = new mb_notice('mapbender origin: '.$mapbenderMetadata[$i]->origin); $georssPolygon = $mapbenderMetadata[$i]->miny." ".$mapbenderMetadata[$i]->minx." ".$mapbenderMetadata[$i]->maxy." ".$mapbenderMetadata[$i]->minx." "; $georssPolygon .= $mapbenderMetadata[$i]->maxy." ".$mapbenderMetadata[$i]->maxx." ".$mapbenderMetadata[$i]->miny." ".$mapbenderMetadata[$i]->maxx." "; $georssPolygon .= $mapbenderMetadata[$i]->miny." ".$mapbenderMetadata[$i]->minx; $feedEntryBbox->appendChild($feedDoc->createTextNode($georssPolygon)); $feedEntry->appendChild($feedEntryBbox); //category entry for crs (from mb_metadata) 5.1.17 /* */ $feedEntryCategory = $feedDoc->createElement("category"); $feedEntryCategory->setAttribute("term", "http://www.opengis.net/def/crs/EPSG/".$epsgId); $feedEntryCategory->setAttribute("label", "EPSG/0/".$epsgId); $feedEntry->appendChild($feedEntryCategory); // // //only applicable for inspire conformant datasets! //Generate List of inspire themes of the given layer! /*$sql = "SELECT inspire_category.inspire_category_id, inspire_category.inspire_category_code_en FROM inspire_category, layer_inspire_category WHERE layer_inspire_category.fkey_layer_id=$1 AND layer_inspire_category.fkey_inspire_category_id=inspire_category.inspire_category_id"; $v = array((integer)$mapbenderMetadata['layer_id']); $t = array('i'); $res = db_prep_query($sql,$v,$t); while ($row = db_fetch_array($res)) { //part for the name of the inspire category $feedEntryCategory = $feedDoc->createElement("category"); $feedEntryCategory->setAttribute("term", $row['inspire_category_code_en']); $feedEntryCategory->setAttribute("scheme", "http://www.eionet.europa.eu/gemet/theme_concepts?langcode=en&ns=5&th=".$row['inspire_category_id']); $feedEntryCategory->setAttribute("label", $row['inspire_category_code_en']); $feedEntryCategory->setAttribute("xml:lang", "en"); $feedEntry->appendChild($feedEntryCategory); } */ /*$feedEntryCategory = $feedDoc->createElement("category"); $feedEntryCategory->setAttribute("term", "Watercourse"); $feedEntryCategory->setAttribute("scheme", "http://inspire-registry.jrc.ec.europa.eu/registers/FCD/"); $feedEntryCategory->setAttribute("label", "Watercourse"); $feedEntryCategory->setAttribute("xml:lang", "en"); $feedEntry->appendChild($feedEntryCategory); // $feedEntryCategory = $feedDoc->createElement("category"); $feedEntryCategory->setAttribute("term", "StandingWater"); $feedEntryCategory->setAttribute("scheme", "http://inspire-registry.jrc.ec.europa.eu/registers/FCD/"); $feedEntryCategory->setAttribute("label", "Standing Water"); $feedEntryCategory->setAttribute("xml:lang", "en"); $feedEntry->appendChild($feedEntryCategory);*/ // $feed->appendChild($feedEntry); //duplicate feed entry for other formats if one is given if ($type == 'DATASET' && $generateFrom == 'wfs' && count($mapbenderMetadata[$i]->output_formats) > 1 && strtoupper($mapbenderMetadata[$i]->geometry_field_name[0] !== "SHAPE")) { for ($j=1; $j < count($mapbenderMetadata[$i]->output_formats); $j++) { $feedEntryCopy = $feedEntry; $feedEntryCopyXml = $feedDoc->saveXML($feedEntry); //exchange formats $feedEntryCopyXml = str_replace($mapbenderMetadata[$i]->output_formats[0],$mapbenderMetadata[$i]->output_formats[$j],$feedEntryCopyXml); $feedEntryCopyXml = str_replace(rawurlencode($mapbenderMetadata[$i]->output_formats[0]),rawurlencode($mapbenderMetadata[$i]->output_formats[$j]),$feedEntryCopyXml); $feedEntryCopyXmlDOM = $feedDoc->createDocumentFragment(); $feedEntryCopyXmlDOM->appendXML($feedEntryCopyXml); $feed->appendChild($feedEntryCopyXmlDOM); } } } //} //store feed to variable: //atom_feed_{mdid}_{type}_{generateFrom}_{resource_id} if ($cache->isActive) { //delete old variable first - cause the timestamp will remain the old! if ($cache->cachedVariableExists($atomFeedKey)) { $cache->cachedVariableDelete($atomFeedKey); //$e = new mb_exception("mod_inspireDownloadFeed.php: Delete old atom feed in cache!"); } $cache->cachedVariableAdd($atomFeedKey,$feedDoc->saveXML()); //$e = new mb_exception("mod_inspireDownloadFeed.php: Save atom feed to apc cache!"); } return $feedDoc->saveXML(); } //loop if no cached variable is available } //function to give away the xml data function pushOpenSearch($feedDoc, $recordId, $generateFrom) { header("Content-type: application/opensearchdescription+xml; charset=UTF-8"); $xml = generateOpenSearchDescription($feedDoc, $recordId, $generateFrom); echo $xml; die(); } //function to give away the xml data function pushFeed($feedDoc, $recordId, $generateFrom) { header("Content-type: application/xhtml+xml; charset=UTF-8"); $xml = generateFeed($feedDoc, $recordId, $generateFrom); echo $xml; die(); } //parses box2d string from postgis to bbox array [minx, miny, maxx, maxy] function parseBox2d($box2d) { //"BOX(6.9213399887085 50.1331939697266,6.93241024017334 50.138801574707)" //delete BOX( and ), replace , with blank $bbox = str_replace(","," ",str_replace(")","",str_replace("BOX(", "", $box2d))); //explode with blank $bbox = explode(" ",$bbox); return $bbox; } function transformBbox($oldBbox, $fromCRS, $toCRS, $metadataUuid = false ,$polygonFilter = false) { //Transform the given BBOX to $toCRS $arrayBbox = explode(',',$oldBbox); if ($metadataUuid != false && $polygonFilter != false) { $sql = "select asewkt(transform(GeometryFromText ( 'LINESTRING ( ".$arrayBbox[0]." ".$arrayBbox[1].",".$arrayBbox[2]." ".$arrayBbox[3]." )', $fromCRS ),".intval($toCRS).")) as bbox, CASE WHEN st_intersects((select geography(bounding_geom) from mb_metadata where uuid = '".$metadataUuid."'),transform(GeometryFromText ( 'POLYGON (( ".$arrayBbox[0]." ".$arrayBbox[1].",".$arrayBbox[2]." ".$arrayBbox[1].",".$arrayBbox[2]." ".$arrayBbox[3].",".$arrayBbox[0]." ".$arrayBbox[3].",".$arrayBbox[0]." ".$arrayBbox[1]."))', $fromCRS ),".intval($toCRS)." )) = true THEN true ELSE false END as inside;"; $res = db_query($sql,$v,$t); $row = db_fetch_assoc($res); $textBbox = $row['bbox']; $inside = $row['inside']; if ($inside == "f") { return false; } else { $pattern = '~LINESTRING\((.*)\)~i'; preg_match($pattern, $textBbox, $subpattern); $newBbox = str_replace(" ", ",", $subpattern[1]); return $newBbox; } } else { $sql = "select asewkt(transform(GeometryFromText ( 'LINESTRING ( ".$arrayBbox[0]." ".$arrayBbox[1].",".$arrayBbox[2]." ".$arrayBbox[3]." )', $fromCRS ),".intval($toCRS)."))"; $res = db_query($sql,$v,$t); $textBbox = db_fetch_row($res); $pattern = '~LINESTRING\((.*)\)~i'; preg_match($pattern, $textBbox[0], $subpattern); $newBbox = str_replace(" ", ",", $subpattern[1]); return $newBbox; } } function fillMapbenderMetadata($dbResult, $generateFrom) { //function increments $indexMapbenderMetadata !!! global $mapbenderMetadata, $indexMapbenderMetadata, $admin, $mapbenderPath; //echo "fill begins"; if ($generateFrom == 'metadata') { $row = db_fetch_assoc($dbResult); //to generate an atom feed from mb_metadata there must be some information avaiable, that is normally used from service metadata //owner, group, bbox, ... - the mb_metadata table have to be filled with the geometry from the layer/featuretype - of which it has been coupled with $mapbenderMetadata[$indexMapbenderMetadata]->origin = $row['origin']; if (isset($row['bbox2d']) && $row['bbox2d'] != '') { $bbox = $row['bbox2d']; $mapbenderMetadata[$indexMapbenderMetadata]->latlonbbox = explode(',',$bbox); $mapbenderMetadata[$indexMapbenderMetadata]->minx = $mapbenderMetadata[$indexMapbenderMetadata]->latlonbbox[0]; $mapbenderMetadata[$indexMapbenderMetadata]->miny = $mapbenderMetadata[$indexMapbenderMetadata]->latlonbbox[1]; $mapbenderMetadata[$indexMapbenderMetadata]->maxx = $mapbenderMetadata[$indexMapbenderMetadata]->latlonbbox[2]; $mapbenderMetadata[$indexMapbenderMetadata]->maxy = $mapbenderMetadata[$indexMapbenderMetadata]->latlonbbox[3]; } $mapbenderMetadata[$indexMapbenderMetadata]->metadata_id = $row['metadata_id']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_ref_system = $row['metadata_ref_system']; $mapbenderMetadata[$indexMapbenderMetadata]->md_owner = $row['fkey_mb_user_id']; $mapbenderMetadata[$indexMapbenderMetadata]->datasetid = $row['datasetid']; $mapbenderMetadata[$indexMapbenderMetadata]->datasetid_codespace = $row['datasetid_codespace']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid = $row['metadata_uuid']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_title = $row['metadata_title']; //$e = new mb_exception("title: ".$row['metadata_title']); $mapbenderMetadata[$indexMapbenderMetadata]->metadata_abstract = $row['metadata_abstract']; $mapbenderMetadata[$indexMapbenderMetadata]->accessconstraints = $row['accessconstraints'];//TODO: Let metadata get this from service when created $mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid = $row['metadata_uuid']; $mapbenderMetadata[$indexMapbenderMetadata]->spatial_res_type = $row['spatial_res_type']; $mapbenderMetadata[$indexMapbenderMetadata]->spatial_res_value = $row['spatial_res_value']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_ref_system = $row['metadata_ref_system']; $mapbenderMetadata[$indexMapbenderMetadata]->format = $row['format']; $mapbenderMetadata[$indexMapbenderMetadata]->datalinks = $row['datalinks']; $mapbenderMetadata[$indexMapbenderMetadata]->transfer_size = $row['transfer_size']; // $mapbenderMetadata[$indexMapbenderMetadata]->datalink_format = $row['datalink_format']; $mapbenderMetadata[$indexMapbenderMetadata]->format = $row['format']; $mapbenderMetadata[$indexMapbenderMetadata]->md_timestamp = $row['md_timestamp']; //check if codespace was given in metadata or it must be generated from uuid and default codespace /*if (($mapbenderMetadata[$indexMapbenderMetadata]->datasetid_codespace == '' or !isset($mapbenderMetadata[$indexMapbenderMetadata]->datasetid_codespace)) or ($mapbenderMetadata[$indexMapbenderMetadata]->datasetid == '' or !isset($mapbenderMetadata[$indexMapbenderMetadata]->datasetid))) { //generate one: $mapbenderMetadata[$indexMapbenderMetadata]->datasetid_codespace = METADATA_DEFAULT_CODESPACE; $mapbenderMetadata[$indexMapbenderMetadata]->datasetid = $mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid; }*/ if ($mapbenderMetadata[$indexMapbenderMetadata]->datasetid == '' or !isset($mapbenderMetadata[$indexMapbenderMetadata]->datasetid)) { //generate one: $mapbenderMetadata[$indexMapbenderMetadata]->datasetid = $mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid; } //$e = new mb_exception("test"); //overwrite some elements if the feed should be generated from metadata itself: access constraints, use limitations, ... if ($generateFrom == "metadata") { //get metadata from metadata proxy by uuid //http://www.geoportal.rlp.de/mapbender/php/mod_iso19139ToHtml.php?url=http%3A%2F%2Fwww.geoportal.rlp.de%2Fmapbender%2Fphp%2Fmod_dataISOMetadata.php%3FoutputFormat%3Diso19139%26id%3D2b009ae4-aa3e-ff21-870b-49846d9561b2 $iso19139 = new iso19139(); $metadata = $iso19139->createFromUrl($mapbenderPath."php/mod_dataISOMetadata.php?outputFormat=iso19139&id=".$mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid); //$e = new mb_exception($mapbenderPath."php/mod_dataISOMetadata.php?outputFormat=iso19139&id=".$mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid); if ($metadata->fees == "" || empty($metadata->fees)) { //$e = new mb_exception("fees from metadata: ".$metadata->fees); $mapbenderMetadata[$indexMapbenderMetadata]->accessconstraints = "No information about conditions/fees found in original metadata"; } else { $mapbenderMetadata[$indexMapbenderMetadata]->accessconstraints = $metadata->fees; } if ($metadata->ressourceContactEmail == "" || empty($metadata->ressourceContactEmail)) { $mapbenderMetadata[$indexMapbenderMetadata]->ressource_contact_email = "dummy@test.org"; } else { $mapbenderMetadata[$indexMapbenderMetadata]->ressource_contact_email = $metadata->ressourceContactEmail; } if ($metadata->ressourceResponsibleParty == "" || empty($metadata->ressourceResponsibleParty)) { $mapbenderMetadata[$indexMapbenderMetadata]->ressource_responsible_party = "dummy organisation"; } else { $mapbenderMetadata[$indexMapbenderMetadata]->ressource_responsible_party = $metadata->ressourceResponsibleParty; } //extract relevant fields //overwrite values } } else { while ($row = db_fetch_assoc($dbResult)) { //get relevant information //echo "".$indexMapbenderMetadata.""; if ($row['inspire_download'] == '1') { $mapbenderMetadata[$indexMapbenderMetadata]->origin = $row['origin']; $mapbenderMetadata[$indexMapbenderMetadata]->latlonbbox = $row['latlonbbox']; $mapbenderMetadata[$indexMapbenderMetadata]->datalink_id = $row['datalink_id']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_id = $row['metadata_id']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_ref_system = $row['metadata_ref_system']; $mapbenderMetadata[$indexMapbenderMetadata]->fkey_mb_group_id = $row['fkey_mb_group_id']; $mapbenderMetadata[$indexMapbenderMetadata]->wms_owner = $row['wms_owner']; $mapbenderMetadata[$indexMapbenderMetadata]->wfs_owner = $row['wfs_owner']; $mapbenderMetadata[$indexMapbenderMetadata]->fkey_wms_id = $row['fkey_wms_id']; $mapbenderMetadata[$indexMapbenderMetadata]->layer_id = $row['layer_id']; $mapbenderMetadata[$indexMapbenderMetadata]->layer_name = $row['layer_name']; $mapbenderMetadata[$indexMapbenderMetadata]->datasetid = $row['datasetid']; $mapbenderMetadata[$indexMapbenderMetadata]->datasetid_codespace = $row['datasetid_codespace']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid = $row['metadata_uuid']; $mapbenderMetadata[$indexMapbenderMetadata]->minx = $row['minx']; $mapbenderMetadata[$indexMapbenderMetadata]->miny = $row['miny']; $mapbenderMetadata[$indexMapbenderMetadata]->maxx = $row['maxx']; $mapbenderMetadata[$indexMapbenderMetadata]->maxy = $row['maxy']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_title = $row['metadata_title']; $mapbenderMetadata[$indexMapbenderMetadata]->layer_title = $row['layer_title']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_abstract = $row['metadata_abstract']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_bbox = $row['metadata_bbox']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_polygon = $row['polygon']; $mapbenderMetadata[$indexMapbenderMetadata]->layer_abstract = $row['layer_abstract']; $mapbenderMetadata[$indexMapbenderMetadata]->accessconstraints = $row['accessconstraints']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid = $row['metadata_uuid']; $mapbenderMetadata[$indexMapbenderMetadata]->spatial_res_type = $row['spatial_res_type']; $mapbenderMetadata[$indexMapbenderMetadata]->spatial_res_value = $row['spatial_res_value']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_ref_system = $row['metadata_ref_system']; $mapbenderMetadata[$indexMapbenderMetadata]->format = $row['format']; $mapbenderMetadata[$indexMapbenderMetadata]->datalink_url = $row['datalink_url']; $mapbenderMetadata[$indexMapbenderMetadata]->wms_getmap = $row['wms_getmap']; $mapbenderMetadata[$indexMapbenderMetadata]->wms_owsproxy = $row['wms_owsproxy']; $mapbenderMetadata[$indexMapbenderMetadata]->wms_version = $row['wms_version']; $mapbenderMetadata[$indexMapbenderMetadata]->wms_max_imagesize = $row['wms_max_imagesize']; $mapbenderMetadata[$indexMapbenderMetadata]->layer_name = $row['layer_name']; $mapbenderMetadata[$indexMapbenderMetadata]->datalink_format = $row['datalink_format']; $mapbenderMetadata[$indexMapbenderMetadata]->metadata_ref_system = $row['metadata_ref_system']; $mapbenderMetadata[$indexMapbenderMetadata]->format = $row['format']; $mapbenderMetadata[$indexMapbenderMetadata]->featuretype_name = $row['featuretype_name']; $mapbenderMetadata[$indexMapbenderMetadata]->featuretype_srs = $row['featuretype_srs']; $mapbenderMetadata[$indexMapbenderMetadata]->featuretype_title = $row['featuretype_title']; $mapbenderMetadata[$indexMapbenderMetadata]->featuretype_id = $row['featuretype_id']; $mapbenderMetadata[$indexMapbenderMetadata]->wfs_title = $row['wfs_title']; $mapbenderMetadata[$indexMapbenderMetadata]->wfs_id = $row['wfs_id']; $mapbenderMetadata[$indexMapbenderMetadata]->wfs_abstract = $row['wfs_abstract']; $mapbenderMetadata[$indexMapbenderMetadata]->wfs_getfeature = $admin->checkUrl($row['wfs_getfeature']); $mapbenderMetadata[$indexMapbenderMetadata]->wfs_getcapabilities = $row['wfs_getcapabilities']; $mapbenderMetadata[$indexMapbenderMetadata]->wfs_describefeaturetype = $row['wfs_describefeaturetype']; $mapbenderMetadata[$indexMapbenderMetadata]->wfs_version = $row['wfs_version']; $mapbenderMetadata[$indexMapbenderMetadata]->wfs_max_features = $row['wfs_max_features']; $mapbenderMetadata[$indexMapbenderMetadata]->md_timestamp = $row['md_timestamp']; $mapbenderMetadata[$indexMapbenderMetadata]->wms_timestamp = $row['wms_timestamp']; $mapbenderMetadata[$indexMapbenderMetadata]->wfs_timestamp = $row['wfs_timestamp']; //$mapbenderMetadata[$indexMapbenderMetadata]->format = $row['format']; //check if codespace was given in metadata or it must be generated from uuid and default codespace /*if (($mapbenderMetadata[$indexMapbenderMetadata]->datasetid_codespace == '' or !isset($mapbenderMetadata[$indexMapbenderMetadata]->datasetid_codespace)) or ($mapbenderMetadata[$indexMapbenderMetadata]->datasetid == '' or !isset($mapbenderMetadata[$indexMapbenderMetadata]->datasetid))) { //generate one: $mapbenderMetadata[$indexMapbenderMetadata]->datasetid_codespace = METADATA_DEFAULT_CODESPACE; $mapbenderMetadata[$indexMapbenderMetadata]->datasetid = $mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid; }*/ if ($mapbenderMetadata[$indexMapbenderMetadata]->datasetid == '' or !isset($mapbenderMetadata[$indexMapbenderMetadata]->datasetid)) { //generate one: $mapbenderMetadata[$indexMapbenderMetadata]->datasetid = $mapbenderMetadata[$indexMapbenderMetadata]->metadata_uuid; } if ($generateFrom == "wfs" or $mapbenderMetadata[$indexMapbenderMetadata]->origin == "wfs") { $latlonbbox = explode(",",$mapbenderMetadata[$indexMapbenderMetadata]->latlonbbox); $mapbenderMetadata[$indexMapbenderMetadata]->minx = $latlonbbox[0]; $mapbenderMetadata[$indexMapbenderMetadata]->miny = $latlonbbox[1]; $mapbenderMetadata[$indexMapbenderMetadata]->maxx = $latlonbbox[2]; $mapbenderMetadata[$indexMapbenderMetadata]->maxy = $latlonbbox[3]; //do a special select to get all outputformats from database $mapbenderMetadata[$indexMapbenderMetadata]->output_formats = array(); //$e = new mb_exception("php/mod_inspireDownloadFeed.php: owfsId: ".$mapbenderMetadata[$indexMapbenderMetadata]->wfs_id); $sql = "SELECT output_format from wfs_output_formats WHERE fkey_wfs_id = $1 UNION SELECT output_format FROM wfs_featuretype_output_formats WHERE fkey_featuretype_id = $2"; $v = array($mapbenderMetadata[$indexMapbenderMetadata]->wfs_id, $mapbenderMetadata[$indexMapbenderMetadata]->featuretype_id); $t = array('i', 'i'); $res = db_prep_query($sql,$v,$t); while ($row = db_fetch_array($res)) { $mapbenderMetadata[$indexMapbenderMetadata]->output_formats[] = $row['output_format']; //$e = new mb_exception("php/mod_inspireDownloadFeed.php: output_format for wfs: ".$row['output_format']); } if (count($mapbenderMetadata[$indexMapbenderMetadata]->output_formats) < 1) { //set default output format to gml2 TODO - check if senseful $mapbenderMetadata[$indexMapbenderMetadata]->output_formats[0] = "text/xml; subtype=gml/2.1.2"; } $mapbenderMetadata[$indexMapbenderMetadata]->output_formats = array_unique($mapbenderMetadata[$indexMapbenderMetadata]->output_formats); //get geometry field name from featuretype information out of mapbender database $sql = "SELECT element_name, element_type from wfs_element WHERE fkey_featuretype_id = $1"; $v = array($mapbenderMetadata[$indexMapbenderMetadata]->featuretype_id); $t = array('i'); $res = db_prep_query($sql,$v,$t); //pull first element with type is string like "PropertyType" $geometryElements = array("GeometryPropertyType","MultiSurfacePropertyType","GeometryPropertyType","CurvePropertyType","PolygonPropertyType","LineStringPropertyType","PointPropertyType","MultiPolygonPropertyType","MultiLineStringPropertyType","MultiPointPropertyType","SurfacePropertyType"); while ($row = db_fetch_array($res)) { //$e = new mb_exception("php/mod_inspireDownloadFeed.php: test element_type: ".$row['element_type']); if (in_array($row['element_type'], $geometryElements)) { $mapbenderMetadata[$indexMapbenderMetadata]->geometry_field_name[] = $row['element_name']; //$e = new mb_exception("php/mod_inspireDownloadFeed.php: element_name of geometry field (type name like PropertyName) found: ".$row['element_name']); break; } } if (count($mapbenderMetadata[$indexMapbenderMetadata]->geometry_field_name) < 1) { $mapbenderMetadata[$indexMapbenderMetadata]->geometry_field_name[0] = "the_geom"; } } //overwrite mapbenderMetadata->minx ... which came from layer/featuretype metadata with bbox of metadata itself, if given if (isset($mapbenderMetadata[$indexMapbenderMetadata]->metadata_bbox) && $mapbenderMetadata[$indexMapbenderMetadata]->metadata_bbox !== "") { $bbox = explode(",", $mapbenderMetadata[$indexMapbenderMetadata]->metadata_bbox); $mapbenderMetadata[$indexMapbenderMetadata]->minx = $bbox[0]; $mapbenderMetadata[$indexMapbenderMetadata]->miny = $bbox[1]; $mapbenderMetadata[$indexMapbenderMetadata]->maxx = $bbox[2]; $mapbenderMetadata[$indexMapbenderMetadata]->maxy = $bbox[3]; } $indexMapbenderMetadata++; } } } } if ($openSearch) { readInfoFromDatabase($recordId, $generateFrom); //generate rss to get number of tiles! //generateFeed($feedDoc, $recordId, $generateFrom);//TODO: maybe call feed from cache first - we have to parse the feed - it is mor simple than generate it !!!! answerOpenSearchRequest($feedDoc, $recordId, $generateFrom); } else { if ($getOpenSearch) { readInfoFromDatabase($recordId, $generateFrom); pushOpenSearch($feedDoc, $recordId, $generateFrom); } else { readInfoFromDatabase($recordId, $generateFrom); pushFeed($feedDoc, $recordId, $generateFrom); //throw it out to world! } } ?>