$val) { $_REQUEST[strtoupper($key)] = $val; } //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 ($_REQUEST['OUTPUTFORMAT'] == "iso19139") { //Initialize XML document $iso19139Doc = new DOMDocument('1.0'); $iso19139Doc->encoding = 'UTF-8'; } else { echo 'outputFormat: '.$_REQUEST['OUTPUTFORMAT'].' is not set or valid.
'; die(); } //if validation is requested // if (isset($_REQUEST['VALIDATE']) and $_REQUEST['VALIDATE'] != "true") { // echo 'validate: '.$_REQUEST['VALIDATE'].' is not valid.
'; die(); } //some needfull functions to pull metadata out of the database! function fillISO19139($iso19139, $recordId) { global $wmsView; global $admin; //read out relevant information from mapbender database: if ($wmsView != '') { $sql = "SELECT * "; $sql .= "FROM ".$wmsView." WHERE layer_id = $1"; } else { //next function is for normal mapbender installations and read the info directly from the wms and layer tables $sql = "SELECT "; $sql .= "layer.layer_id,layer.layer_name, layer.layer_title, layer.layer_abstract, layer.layer_pos, layer.layer_parent, layer.layer_minscale, layer.layer_maxscale, layer.uuid,"; $sql .= "wms.wms_title, wms.wms_abstract, wms.wms_id, wms.fees, wms.accessconstraints, wms.contactperson, "; $sql .= "wms.contactposition, wms.contactorganization, wms.address, wms.city, wms_timestamp, wms_owner, "; $sql .= "wms.stateorprovince, wms.postcode, wms.contactvoicetelephone, wms.contactfacsimiletelephone, wms.wms_owsproxy,"; $sql .= "wms.contactelectronicmailaddress, wms.country, wms.fkey_mb_group_id, "; $sql .= "layer_epsg.minx || ',' || layer_epsg.miny || ',' || layer_epsg.maxx || ',' || layer_epsg.maxy as bbox "; $sql .= "FROM wms, layer, layer_epsg WHERE layer_id = $1 and layer.fkey_wms_id = wms.wms_id"; $sql .= " and layer_epsg.fkey_layer_id=layer.layer_id and layer_epsg.epsg='EPSG:4326'"; } $v = array((integer)$recordId); $t = array('i'); $res = db_prep_query($sql,$v,$t); $mapbenderMetadata = db_fetch_array($res); //Get other needed information out of mapbender database (if not already defined in the view): //service data if ($wmsView != '') { $sql = "SELECT contactorganization, contactelectronicmailaddress "; $sql .= "FROM wms WHERE wms_id = $1"; $v = array((integer)$mapbenderMetadata['wms_id']); $t = array('i'); $res = db_prep_query($sql,$v,$t); $serviceMetadata = db_fetch_array($res); } //infos about the registrating department, check first if a special metadata point of contact is defined in the service table - function from mod_showMetadata - TODO: should be defined in admin class if (!isset($mapbenderMetadata['fkey_mb_group_id']) or is_null($mapbenderMetadata['fkey_mb_group_id']) or $mapbenderMetadata['fkey_mb_group_id'] == 0){ $e = new mb_exception("mod_layerISOMetadata.php: fkey_mb_group_id not found!"); //Get information about owning user of the relation mb_user_mb_group - alternatively the defined fkey_mb_group_id from the service must be used! $sqlDep = "SELECT mb_group_name, mb_group_title, mb_group_id, mb_group_logo_path, mb_group_address, mb_group_email, mb_group_postcode, mb_group_city, mb_group_voicetelephone, mb_group_facsimiletelephone FROM mb_group AS a, mb_user AS b, mb_user_mb_group AS c WHERE b.mb_user_id = $1 AND b.mb_user_id = c.fkey_mb_user_id AND c.fkey_mb_group_id = a.mb_group_id AND c.mb_user_mb_group_type=2 LIMIT 1"; $vDep = array($mapbenderMetadata['wms_owner']); $tDep = array('i'); $resDep = db_prep_query($sqlDep, $vDep, $tDep); $departmentMetadata = db_fetch_array($resDep); } else { $e = new mb_exception("mod_layerISOMetadata.php: fkey_mb_group_id found!"); $sqlDep = "SELECT mb_group_name , mb_group_title, mb_group_id, mb_group_logo_path , mb_group_address, mb_group_email, mb_group_postcode, mb_group_city, mb_group_voicetelephone, mb_group_facsimiletelephone FROM mb_group WHERE mb_group_id = $1 LIMIT 1"; $vDep = array($mapbenderMetadata['fkey_mb_group_id']); $tDep = array('i'); $resDep = db_prep_query($sqlDep, $vDep, $tDep); $departmentMetadata = db_fetch_array($resDep); } //infos about the owner of the service - he is the man who administrate the metadata - register the service $sql = "SELECT mb_user_email "; $sql .= "FROM mb_user WHERE mb_user_id = $1"; $v = array((integer)$mapbenderMetadata['wms_owner']); $t = array('i'); $res = db_prep_query($sql,$v,$t); $userMetadata = db_fetch_array($res); //check if resource is freely available to anonymous user - which are all users who search thru metadata catalogues: $hasPermission=$admin->getLayerPermission($mapbenderMetadata['wms_id'],$mapbenderMetadata['layer_name'],PUBLIC_USER); //Creating the central "MD_Metadata" node $MD_Metadata = $iso19139->createElementNS('http://www.isotc211.org/2005/gmd', 'gmd:MD_Metadata'); $MD_Metadata = $iso19139->appendChild($MD_Metadata); $MD_Metadata->setAttribute("xmlns:srv", "http://www.isotc211.org/2005/srv"); $MD_Metadata->setAttribute("xmlns:gml", "http://www.opengis.net/gml"); $MD_Metadata->setAttribute("xmlns:gco", "http://www.isotc211.org/2005/gco"); $MD_Metadata->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); $MD_Metadata->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); $MD_Metadata->setAttribute("xsi:schemaLocation", "http://www.isotc211.org/2005/gmd ./xsd/gmd/gmd.xsd://www.isotc211.org/2005/srv ./xsd/srv/srv.xsd"); //generate identifier part $identifier = $iso19139->createElement("gmd:fileIdentifier"); $identifierString = $iso19139->createElement("gco:CharacterString"); if (isset($mapbenderMetadata['uuid'])) { $identifierText = $iso19139->createTextNode($mapbenderMetadata['uuid']); } else { $identifierText = $iso19139->createTextNode("no id found"); } $identifierString->appendChild($identifierText); $identifier->appendChild($identifierString); $MD_Metadata->appendChild($identifier); //generate language part B 10.3 (if available) of the inspire metadata regulation $language = $iso19139->createElement("gmd:language"); $languagecode = $iso19139->createElement("gmd:LanguageCode"); $languagecode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode"); if (isset($mapbenderMetadata['metadata_language'])) { $languageText = $iso19139->createTextNode($mapbenderMetadata['metadata_language']); $languagecode->setAttribute("codeListValue", $mapbenderMetadata['metadata_language']); } else { $languageText = $iso19139->createTextNode("ger"); $languagecode->setAttribute("codeListValue", "ger"); } $languagecode->appendChild($languageText); $language ->appendChild($languagecode); $language = $MD_Metadata->appendChild($language); //generate Characterset - first it should be utf8 ;-) $characterSet = $iso19139->createElement("gmd:characterSet"); $characterSetCode = $iso19139->createElement("gmd:MD_CharacterSetCode"); $characterSetCode->setAttribute("codeList", "./resources/codeList.xml#MD_CharacterSetCode"); $characterSetCode->setAttribute("codeListValue", "utf8"); $characterSet->appendChild($characterSetCode); $characterSet = $MD_Metadata->appendChild($characterSet); #generate MD_Scope part B 1.3 (if available) $hierarchyLevel = $iso19139->createElement("gmd:hierarchyLevel"); $scopecode = $iso19139->createElement("gmd:MD_ScopeCode"); $scopecode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode"); if (isset($mapbenderMetadata['hierarchy_level'])) { $scopecode->setAttribute("codeListValue", $mapbenderMetadata['hierarchy_level']);//if such a metadata exists in the mapbender metadata view $scopeText = $iso19139->createTextNode($mapbenderMetadata['hierarchy_level']); } else { $scopecode->setAttribute("codeListValue", "service"); $scopeText = $iso19139->createTextNode("service"); } $scopecode->appendChild($scopeText); $hierarchyLevel->appendChild($scopecode); $hierarchyLevel=$MD_Metadata->appendChild($hierarchyLevel); #Part B 10.1 responsible party for the resource $contact=$iso19139->createElement("gmd:contact"); $CI_ResponsibleParty=$iso19139->createElement("gmd:CI_ResponsibleParty"); $organisationName=$iso19139->createElement("gmd:organisationName"); $organisationName_cs=$iso19139->createElement("gco:CharacterString"); if (isset($departmentMetadata['mb_group_name'])) { $organisationNameText = $iso19139->createTextNode($departmentMetadata['mb_group_name']); } else { $organisationNameText=$iso19139->createTextNode('department not known'); } $contactInfo=$iso19139->createElement("gmd:contactInfo"); $CI_Contact=$iso19139->createElement("gmd:CI_Contact"); $address=$iso19139->createElement("gmd:address"); $CI_Address=$iso19139->createElement("gmd:CI_Address"); $electronicMailAddress=$iso19139->createElement("gmd:electronicMailAddress"); $electronicMailAddress_cs=$iso19139->createElement("gco:CharacterString"); if (isset($userMetadata['mb_user_email'])) { //get email address from ows service metadata out of mapbender database $electronicMailAddressText=$iso19139->createTextNode($userMetadata['mb_user_email']); } else { $electronicMailAddressText=$iso19139->createTextNode('email not yet given'); } $role=$iso19139->createElement("gmd:role"); $CI_RoleCode=$iso19139->createElement("gmd:CI_RoleCode"); $CI_RoleCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode"); $CI_RoleCode->setAttribute("codeListValue", "pointOfContact"); $CI_RoleCodeText=$iso19139->createTextNode("pointOfContact"); #create xml tree $organisationName_cs->appendChild($organisationNameText); $organisationName->appendChild($organisationName_cs); $CI_ResponsibleParty->appendChild($organisationName); $electronicMailAddress_cs->appendChild($electronicMailAddressText); $electronicMailAddress->appendChild($electronicMailAddress_cs); $CI_Address->appendChild($electronicMailAddress); $address->appendChild($CI_Address); $CI_Contact->appendChild($address); $contactInfo->appendChild($CI_Contact); $CI_RoleCode->appendChild($CI_RoleCodeText); $role->appendChild($CI_RoleCode); $CI_ResponsibleParty->appendChild($contactInfo); $CI_ResponsibleParty->appendChild($role); $contact->appendChild($CI_ResponsibleParty); $MD_Metadata->appendChild($contact); #generate dateStamp part B 10.2 (if available) $dateStamp = $iso19139->createElement("gmd:dateStamp"); $mddate = $iso19139->createElement("gco:Date"); if (isset($mapbenderMetadata['wms_timestamp'])) { $mddateText = $iso19139->createTextNode(date("Y-m-d",$mapbenderMetadata['wms_timestamp'])); } else { $mddateText = $iso19139->createTextNode("2000-01-01"); } $mddate->appendChild($mddateText); $dateStamp->appendChild($mddate); $dateStamp=$MD_Metadata->appendChild($dateStamp); //standard definition - everytime the same $metadataStandardName = $iso19139->createElement("gmd:metadataStandardName"); $metadataStandardVersion = $iso19139->createElement("gmd:metadataStandardVersion"); $metadataStandardNameText = $iso19139->createElement("gco:CharacterString"); $metadataStandardVersionText = $iso19139->createElement("gco:CharacterString"); $metadataStandardNameTextString = $iso19139->createTextNode("ISO19119"); $metadataStandardVersionTextString = $iso19139->createTextNode("2005/PDAM 1"); $metadataStandardNameText->appendChild($metadataStandardNameTextString); $metadataStandardVersionText->appendChild($metadataStandardVersionTextString); $metadataStandardName->appendChild($metadataStandardNameText); $metadataStandardVersion->appendChild($metadataStandardVersionText); $MD_Metadata->appendChild($metadataStandardName); $MD_Metadata->appendChild($metadataStandardVersion); //do the things for identification //create nodes $identificationInfo=$iso19139->createElement("gmd:identificationInfo"); $SV_ServiceIdentification=$iso19139->createElement("srv:SV_ServiceIdentification"); //TODO: add attribut //$SV_ServiceIdentification->setAttribute("id", "dataId"); $citation=$iso19139->createElement("gmd:citation"); $CI_Citation=$iso19139->createElement("gmd:CI_Citation"); #create nodes for things which are defined - howto do the multiplicities? Ask Martin! //Create Resource title element B 1.1 $title=$iso19139->createElement("gmd:title"); $title_cs=$iso19139->createElement("gco:CharacterString"); if (isset($mapbenderMetadata['wms_title'])) { $titleText = $iso19139->createTextNode($mapbenderMetadata['wms_title']." - ".$mapbenderMetadata['layer_title']); } else { $titleText = $iso19139->createTextNode("title not given"); } $title_cs->appendChild($titleText); $title->appendChild($title_cs); $CI_Citation->appendChild($title); #Create date elements B5.2-5.4 #Do things for B 5.2 date of publication if (isset($mapbenderMetadata['wms_timestamp_create'])) { $date1=$iso19139->createElement("gmd:date"); $CI_Date=$iso19139->createElement("gmd:CI_Date"); $date2=$iso19139->createElement("gmd:date"); $gcoDate=$iso19139->createElement("gco:Date"); $dateType=$iso19139->createElement("gmd:dateType"); $dateTypeCode=$iso19139->createElement("gmd:CI_DateTypeCode"); $dateTypeCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode"); $dateTypeCode->setAttribute("codeListValue", "publication"); $dateTypeCodeText=$iso19139->createTextNode('publication'); $dateText= $iso19139->createTextNode(date('Y-m-d',$mapbenderMetadata['wms_timestamp_create'])); $dateTypeCode->appendChild($dateTypeCodeText); $dateType->appendChild($dateTypeCode); $gcoDate->appendChild($dateText); $date2->appendChild($gcoDate); $CI_Date->appendChild($date2); $CI_Date->appendChild($dateType); $date1->appendChild($CI_Date); $CI_Citation->appendChild($date1); } #Do things for B 5.3 date of revision if (isset($mapbenderMetadata['wms_timestamp'])) { $date1=$iso19139->createElement("gmd:date"); $CI_Date=$iso19139->createElement("gmd:CI_Date"); $date2=$iso19139->createElement("gmd:date"); $gcoDate=$iso19139->createElement("gco:Date"); $dateType=$iso19139->createElement("gmd:dateType"); $dateTypeCode=$iso19139->createElement("gmd:CI_DateTypeCode"); $dateTypeCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode"); $dateTypeCode->setAttribute("codeListValue", "revision"); $dateTypeCodeText=$iso19139->createTextNode('revision'); $dateText= $iso19139->createTextNode(date('Y-m-d',$mapbenderMetadata['wms_timestamp'])); $dateTypeCode->appendChild($dateTypeCodeText); $dateType->appendChild($dateTypeCode); $gcoDate->appendChild($dateText); $date2->appendChild($gcoDate); $CI_Date->appendChild($date2); $CI_Date->appendChild($dateType); $date1->appendChild($CI_Date); $CI_Citation->appendChild($date1); } #Do things for B 5.4 date of creation if (isset($mapbenderMetadata['wms_timestamp_creation'])) { $date1=$iso19139->createElement("gmd:date"); $CI_Date=$iso19139->createElement("gmd:CI_Date"); $date2=$iso19139->createElement("gmd:date"); $gcoDate=$iso19139->createElement("gco:Date"); $dateType=$iso19139->createElement("gmd:dateType"); $dateTypeCode=$iso19139->createElement("gmd:CI_DateTypeCode"); $dateTypeCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode"); $dateTypeCode->setAttribute("codeListValue", "creation"); $dateTypeCodeText=$iso19139->createTextNode('creation'); $dateText= $iso19139->createTextNode(date('Y-m-d',$mapbenderMetadata['wms_timestamp_creation'])); $dateTypeCode->appendChild($dateTypeCodeText); $dateType->appendChild($dateTypeCode); $gcoDate->appendChild($dateText); $date2->appendChild($gcoDate); $CI_Date->appendChild($date2); $CI_Date->appendChild($dateType); $date1->appendChild($CI_Date); $CI_Citation->appendChild($date1); } $citation->appendChild($CI_Citation); $SV_ServiceIdentification->appendChild($citation); #Create part for abstract B 1.2 $abstract=$iso19139->createElement("gmd:abstract"); $abstract_cs=$iso19139->createElement("gco:CharacterString"); if (isset($mapbenderMetadata['wms_abstract'])) { $abstractText = $iso19139->createTextNode($mapbenderMetadata['wms_abstract']); } else { $abstractText = $iso19139->createTextNode("not yet defined"); } $abstract_cs->appendChild($abstractText); $abstract->appendChild($abstract_cs); $SV_ServiceIdentification->appendChild($abstract); #Create part for point of contact for service identification #Define relevant objects $pointOfContact=$iso19139->createElement("gmd:pointOfContact"); $CI_ResponsibleParty=$iso19139->createElement("gmd:CI_ResponsibleParty"); $organisationName=$iso19139->createElement("gmd:organisationName"); $orgaName_cs=$iso19139->createElement("gco:CharacterString"); $contactInfo=$iso19139->createElement("gmd:contactInfo"); $CI_Contact=$iso19139->createElement("gmd:CI_Contact"); $address_1=$iso19139->createElement("gmd:address"); $CI_Address=$iso19139->createElement("gmd:CI_Address"); $electronicMailAddress=$iso19139->createElement("gmd:electronicMailAddress"); $email_cs=$iso19139->createElement("gco:CharacterString"); $role=$iso19139->createElement("gmd:role"); $CI_RoleCode=$iso19139->createElement("gmd:CI_RoleCode"); $CI_RoleCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode"); $CI_RoleCode->setAttribute("codeListValue", "publisher"); if (isset($mapbenderMetadata['contactorganization'])) { $resOrgaText = $iso19139->createTextNode($mapbenderMetadata['contactorganization']); } else { $resOrgaText= $iso19139->createTextNode("not yet defined"); } if (isset($mapbenderMetadata['contactelectronicmailaddress'])) { $resMailText = $iso19139->createTextNode($mapbenderMetadata['contactelectronicmailaddress']); } else { $resMailText = $iso19139->createTextNode("kontakt@geoportal.rlp.de"); } $resRoleText = $iso19139->createTextNode("publisher"); $orgaName_cs->appendChild($resOrgaText); $organisationName->appendChild($orgaName_cs); $CI_ResponsibleParty->appendChild($organisationName); $email_cs->appendChild($resMailText); $electronicMailAddress->appendChild($email_cs); $CI_Address->appendChild($electronicMailAddress); $address_1->appendChild($CI_Address); $CI_Contact->appendChild($address_1); $contactInfo->appendChild($CI_Contact); $CI_ResponsibleParty->appendChild($contactInfo); $CI_RoleCode->appendChild($resRoleText); $role->appendChild($CI_RoleCode); $CI_ResponsibleParty->appendChild($role); $pointOfContact->appendChild($CI_ResponsibleParty); $SV_ServiceIdentification->appendChild($pointOfContact); //generate graphical overview part $sql = "SELECT layer_preview.layer_map_preview_filename FROM layer_preview WHERE layer_preview.fkey_layer_id=$1"; $v = array((integer)$mapbenderMetadata["layer_id"]); $t = array('i'); $res = db_prep_query($sql,$v,$t); $row = db_fetch_array($res); #old version /* if (isset($row['layer_map_preview_filename']) & $row['layer_map_preview_filename'] != '') { $graphicOverview=$iso19139->createElement("gmd:graphicOverview"); $MD_BrowseGraphic=$iso19139->createElement("gmd:MD_BrowseGraphic"); $fileName=$iso19139->createElement("gmd:fileName"); $fileName_cs=$iso19139->createElement("gco:characterString"); $previewFilenameText = $iso19139->createTextNode("http://www.gdi-rp-dienste3.rlp.de/mapbender/x_geoportal/layer_preview/".$row['layer_map_preview_filename']); $fileName_cs->appendChild($previewFilenameText); $fileName->appendChild($fileName_cs); $MD_BrowseGraphic->appendChild($fileName); $graphicOverview->appendChild($MD_BrowseGraphic); $SV_ServiceIdentification->appendChild($graphicOverview); } */ #version of bavaria if (file_exists(PREVIEW_DIR."/".$mapbenderMetadata['layer_id']."_layer_map_preview.jpg")) { //TODO $graphicOverview=$iso19139->createElement("gmd:graphicOverview"); $MD_BrowseGraphic=$iso19139->createElement("gmd:MD_BrowseGraphic"); $fileName=$iso19139->createElement("gmd:fileName"); $fileName_cs=$iso19139->createElement("gco:CharacterString"); $previewFilenameText = $iso19139->createTextNode("http://www.geoportal.rlp.de/mapbender/geoportal/preview/".$mapbenderMetadata['layer_id']."_layer_map_preview.jpg"); $fileName_cs->appendChild($previewFilenameText); $fileName->appendChild($fileName_cs); $fileDescription=$iso19139->createElement("gmd:fileDescription"); $fileDescription_cs=$iso19139->createElement("gco:CharacterString"); $fileDescription_text=$iso19139->createTextNode("Thumbnail"); $fileDescription_cs->appendChild($fileDescription_text); $fileDescription->appendChild($fileDescription_cs); $fileType=$iso19139->createElement("gmd:fileType"); $fileType_cs=$iso19139->createElement("gco:CharacterString"); $fileType_text=$iso19139->createTextNode("JPEG"); $fileType_cs->appendChild($fileType_text); $fileType->appendChild($fileType_cs); $MD_BrowseGraphic->appendChild($fileName); $MD_BrowseGraphic->appendChild($fileDescription); $MD_BrowseGraphic->appendChild($fileType); $graphicOverview->appendChild($MD_BrowseGraphic); $SV_ServiceIdentification->appendChild($graphicOverview); } /*example: http://goesr.noaa.gov/browse/datasetIdentifier */ //generate keyword part - for services the inspire themes are not applicable!!! //read keywords for resource out of the database: $sql = "SELECT keyword.keyword FROM keyword, layer_keyword WHERE layer_keyword.fkey_layer_id=$1 AND layer_keyword.fkey_keyword_id=keyword.keyword_id"; $v = array((integer)$recordId); $t = array('i'); $res = db_prep_query($sql,$v,$t); $descriptiveKeywords=$iso19139->createElement("gmd:descriptiveKeywords"); $MD_Keywords=$iso19139->createElement("gmd:MD_Keywords"); while ($row = db_fetch_array($res)) { $keyword=$iso19139->createElement("gmd:keyword"); $keyword_cs=$iso19139->createElement("gco:CharacterString"); $keywordText = $iso19139->createTextNode($row['keyword']); $keyword_cs->appendChild($keywordText); $keyword->appendChild($keyword_cs); $MD_Keywords->appendChild($keyword); } //a special keyword for service type wms as INSPIRE likes it ;-) $keyword=$iso19139->createElement("gmd:keyword"); $keyword_cs=$iso19139->createElement("gco:CharacterString"); $keywordText = $iso19139->createTextNode("humanGeographicViewer"); $keyword_cs->appendChild($keywordText); $keyword->appendChild($keyword_cs); $MD_Keywords->appendChild($keyword); //pull special keywords from custom categories: $sql = "SELECT custom_category.custom_category_key FROM custom_category, layer_custom_category WHERE layer_custom_category.fkey_layer_id = $1 AND layer_custom_category.fkey_custom_category_id = custom_category.custom_category_id AND custom_category_hidden = 0"; $v = array((integer)$recordId); $t = array('i'); $res = db_prep_query($sql,$v,$t); $e = new mb_notice("look for custom categories: "); $countCustom = 0; while ($row = db_fetch_array($res)) { $keyword=$iso19139->createElement("gmd:keyword"); $keyword_cs=$iso19139->createElement("gco:CharacterString"); $keywordText = $iso19139->createTextNode($row['custom_category_key']); $keyword_cs->appendChild($keywordText); $keyword->appendChild($keyword_cs); $MD_Keywords->appendChild($keyword); $countCustom++; } $descriptiveKeywords->appendChild($MD_Keywords); $SV_ServiceIdentification->appendChild($descriptiveKeywords); #Part B 3 INSPIRE Category #do this only if an INSPIRE keyword (Annex I-III) is set #Resource Constraints B 8 $resourceConstraints=$iso19139->createElement("gmd:resourceConstraints"); $MD_LegalConstraints=$iso19139->createElement("gmd:MD_Constraints"); $useLimitation=$iso19139->createElement("gmd:useLimitation"); $useLimitation_cs=$iso19139->createElement("gco:CharacterString"); if(isset($mapbenderMetadata['accessconstraints'])){ $useLimitationText=$iso19139->createTextNode($mapbenderMetadata['accessconstraints']); } else { $useLimitationText=$iso19139->createTextNode("no conditions apply"); } //TODO: Mapping of constraints between OWS/registry and INSPIRE see View Service Guidance $useLimitation_cs->appendChild($useLimitationText); $useLimitation->appendChild($useLimitation_cs); $MD_LegalConstraints->appendChild($useLimitation); $resourceConstraints->appendChild($MD_LegalConstraints); $SV_ServiceIdentification->appendChild($resourceConstraints); $resourceConstraints=$iso19139->createElement("gmd:resourceConstraints"); $MD_LegalConstraints=$iso19139->createElement("gmd:MD_LegalConstraints"); $accessConstraints=$iso19139->createElement("gmd:accessConstraints"); $MD_RestrictionCode=$iso19139->createElement("gmd:MD_RestrictionCode"); $MD_RestrictionCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RetrictionCode"); $MD_RestrictionCode->setAttribute("codeListValue", "otherRestrictions"); $MD_RestrictionCodeText=$iso19139->createTextNode("otherRestrictions"); $otherConstraints=$iso19139->createElement("gmd:otherConstraints"); $otherConstraints_cs=$iso19139->createElement("gco:CharacterString"); if (isset($mapbenderMetadata['accessconstraints']) & strtoupper($mapbenderMetadata['accessconstraints']) != 'NONE'){ $otherConstraintsText=$iso19139->createTextNode($mapbenderMetadata['accessconstraints']); } else { $otherConstraintsText=$iso19139->createTextNode("no constraints"); } $otherConstraints_cs->appendChild($otherConstraintsText); $otherConstraints->appendChild($otherConstraints_cs); $MD_RestrictionCode->appendChild($MD_RestrictionCodeText); $accessConstraints->appendChild($MD_RestrictionCode); $MD_LegalConstraints->appendChild($accessConstraints); $MD_LegalConstraints->appendChild($otherConstraints); $resourceConstraints->appendChild($MD_LegalConstraints); $SV_ServiceIdentification->appendChild($resourceConstraints); /* example view */ $serviceType=$iso19139->createElement("srv:serviceType"); $localName=$iso19139->createElement("gco:LocalName"); $serviceTypeText=$iso19139->createTextNode("view"); $localName->appendChild($serviceTypeText); $serviceType->appendChild($localName); $SV_ServiceIdentification->appendChild($serviceType); $serviceTypeVersion=$iso19139->createElement("srv:serviceTypeVersion"); $serviceTypeVersion_cs=$iso19139->createElement("gco:CharacterString"); $serviceTypeVersionText=$iso19139->createTextNode("1.1.1"); $serviceTypeVersion_cs->appendChild($serviceTypeVersionText); $serviceTypeVersion->appendChild($serviceTypeVersion_cs); $SV_ServiceIdentification->appendChild($serviceTypeVersion); #Geographical Extent $bbox = array(); //initialize if no extent is defined in the database $bbox[0] = -180; $bbox[1] = -90; $bbox[2] = 180; $bbox[3] = 90; if (isset($mapbenderMetadata['bbox']) & ($mapbenderMetadata['bbox'] != '')) { $bbox = explode(',',$mapbenderMetadata['bbox']); } $extent=$iso19139->createElement("srv:extent"); $EX_Extent=$iso19139->createElement("gmd:EX_Extent"); $geographicElement=$iso19139->createElement("gmd:geographicElement"); $EX_GeographicBoundingBox=$iso19139->createElement("gmd:EX_GeographicBoundingBox"); $westBoundLongitude=$iso19139->createElement("gmd:westBoundLongitude"); $wb_dec=$iso19139->createElement("gco:Decimal"); $wb_text=$iso19139->createTextNode($bbox[0]); $eastBoundLongitude=$iso19139->createElement("gmd:eastBoundLongitude"); $eb_dec=$iso19139->createElement("gco:Decimal"); $eb_text=$iso19139->createTextNode($bbox[2]); $southBoundLatitude=$iso19139->createElement("gmd:southBoundLatitude"); $sb_dec=$iso19139->createElement("gco:Decimal"); $sb_text=$iso19139->createTextNode($bbox[1]); $northBoundLatitude=$iso19139->createElement("gmd:northBoundLatitude"); $nb_dec=$iso19139->createElement("gco:Decimal"); $nb_text=$iso19139->createTextNode($bbox[3]); $wb_dec->appendChild($wb_text); $westBoundLongitude->appendChild($wb_dec); $EX_GeographicBoundingBox->appendChild($westBoundLongitude); $eb_dec->appendChild($eb_text); $eastBoundLongitude->appendChild($eb_dec); $EX_GeographicBoundingBox->appendChild($eastBoundLongitude); $sb_dec->appendChild($sb_text); $southBoundLatitude->appendChild($sb_dec); $EX_GeographicBoundingBox->appendChild($southBoundLatitude); $nb_dec->appendChild($nb_text); $northBoundLatitude->appendChild($nb_dec); $EX_GeographicBoundingBox->appendChild($northBoundLatitude); $geographicElement->appendChild($EX_GeographicBoundingBox); $EX_Extent->appendChild($geographicElement); $extent->appendChild($EX_Extent); $SV_ServiceIdentification->appendChild($extent); //read all metadata entries: $i=0; $sql = <<createElement("srv:couplingType"); $SV_CouplingType=$iso19139->createElement("srv:SV_CouplingType"); $SV_CouplingType->setAttribute("codeList", "SV_CouplingType"); $SV_CouplingType->setAttribute("codeListValue", "tight"); $couplingType->appendChild($SV_CouplingType); $SV_ServiceIdentification->appendChild($couplingType); } //declare coupling type: /*example from guidance paper: */ #to the things which have to be done for integrating the service into a client like portalu ... they have defined another location to put the GetCap URL than INSPIRE does it $containsOperation=$iso19139->createElement("srv:containsOperations"); $SV_OperationMetadata=$iso19139->createElement("srv:SV_OperationMetadata"); $operationName=$iso19139->createElement("srv:operationName"); $operationName_cs=$iso19139->createElement("gco:CharacterString"); $operationNameText=$iso19139->createTextNode("GetCapabilities"); $operationName_cs->appendChild($operationNameText); $operationName->appendChild($operationName_cs); //srv DCP ************************************** $DCP=$iso19139->createElement("srv:DCP"); $DCPList=$iso19139->createElement("srv:DCPList"); $DCPList->setAttribute("codeList", "DCPList"); $DCPList->setAttribute("codeListValue", "WebService"); $DCP->appendChild($DCPList); //connectPoint ********************************** $connectPoint=$iso19139->createElement("srv:connectPoint"); $CI_OnlineResource=$iso19139->createElement("gmd:CI_OnlineResource"); $gmd_linkage=$iso19139->createElement("gmd:linkage"); $gmd_URL=$iso19139->createElement("gmd:URL"); //Check if anonymous user has rights to access this layer - if not ? which resource should be advertised? TODO if ($hasPermission) { $gmd_URLText=$iso19139->createTextNode("http://".$_SERVER['HTTP_HOST']."/mapbender/php/wms.php?inspire=1&layer_id=".$mapbenderMetadata['layer_id'].""); } else { $gmd_URLText=$iso19139->createTextNode("https://".$_SERVER['HTTP_HOST']."/http_auth/".$mapbenderMetadata['layer_id']."?"); } $gmd_URL->appendChild($gmd_URLText); $gmd_linkage->appendChild($gmd_URL); $CI_OnlineResource->appendChild($gmd_linkage); $connectPoint->appendChild($CI_OnlineResource); $SV_OperationMetadata->appendChild($operationName); $SV_OperationMetadata->appendChild($DCP); $SV_OperationMetadata->appendChild($connectPoint); $containsOperation->appendChild($SV_OperationMetadata); $SV_ServiceIdentification->appendChild($containsOperation); //fill in operatesOn fields with datasetid if given /**/ while ($row_metadata = db_fetch_array($res_metadataurl)) { switch ($row_metadata['origin']) { case 'capabilities': $operatesOn=$iso19139->createElement("srv:operatesOn"); $operatesOn->setAttribute("xlink:href", $row_metadata['datasetid']); $SV_ServiceIdentification->appendChild($operatesOn); break; case 'metador': $operatesOn=$iso19139->createElement("srv:operatesOn"); $operatesOn->setAttribute("xlink:href", "http://www.geoportal.rlp.de#".$row_metadata['uuid']); $SV_ServiceIdentification->appendChild($operatesOn); break; case 'external': $operatesOn=$iso19139->createElement("srv:operatesOn"); $operatesOn->setAttribute("xlink:href", $row_metadata['uuid']); $SV_ServiceIdentification->appendChild($operatesOn); break; default: break; } } /* $serviceTypeVersion_cs->appendChild($serviceTypeVersionText); $serviceTypeVersion->appendChild($serviceTypeVersion_cs); $SV_ServiceIdentification->appendChild($serviceTypeVersion); */ $identificationInfo->appendChild($SV_ServiceIdentification); //distributionInfo $gmd_distributionInfo=$iso19139->createElement("gmd:distributionInfo"); $MD_Distribution=$iso19139->createElement("gmd:MD_Distribution"); $gmd_distributionFormat=$iso19139->createElement("gmd:distributionFormat"); $MD_Format=$iso19139->createElement("gmd:MD_Format"); $gmd_name=$iso19139->createElement("gmd:name"); $gmd_version=$iso19139->createElement("gmd:version"); $gmd_name->setAttribute("gco:nilReason", "inapplicable"); $gmd_version->setAttribute("gco:nilReason", "inapplicable"); $gmd_transferOptions=$iso19139->createElement("gmd:transferOptions"); $MD_DigitalTransferOptions=$iso19139->createElement("gmd:MD_DigitalTransferOptions"); $gmd_onLine=$iso19139->createElement("gmd:onLine"); $CI_OnlineResource=$iso19139->createElement("gmd:CI_OnlineResource"); $gmd_linkage=$iso19139->createElement("gmd:linkage"); $gmd_URL=$iso19139->createElement("gmd:URL"); //Check if anonymous user has rights to access this layer - if not ? which resource should be advertised? TODO if ($hasPermission) { $gmd_URLText=$iso19139->createTextNode("http://".$_SERVER['HTTP_HOST']."/mapbender/php/wms.php?inspire=1&layer_id=".$mapbenderMetadata['layer_id'].""); } else { $gmd_URLText=$iso19139->createTextNode("https://".$_SERVER['HTTP_HOST']."/http_auth/".$mapbenderMetadata['layer_id']."?"); } $gmd_URL->appendChild($gmd_URLText); $gmd_linkage->appendChild($gmd_URL); $CI_OnlineResource->appendChild($gmd_linkage); //append things which geonetwork needs to invoke service/layer or what else? - Here the name of the layer and the protocol seems to be needed? //a problem will occur, if the link to get map is not the same as the link to get caps? So how can we handle this? It seems to very silly! $gmdProtocol = $iso19139->createElement("gmd:protocol"); $gmdProtocol_cs = $iso19139->createElement("gco:CharacterString"); $gmdProtocolText = $iso19139->createTextNode("OGC:WMS-1.1.1-http-get-map");//for ever 'OGC:WMS-1.1.1-http-get-map' $gmdName=$iso19139->createElement("gmd:name"); $gmdName_cs=$iso19139->createElement("gco:CharacterString"); $gmdNameText=$iso19139->createTextNode($mapbenderMetadata['layer_name']); //Layername? $gmdDescription = $iso19139->createElement("gmd:description"); $gmdDescription_cs = $iso19139->createElement("gco:CharacterString"); $gmdDescriptionText = $iso19139->createTextNode($mapbenderMetadata['layer_abstract']);//Layer Abstract $gmdProtocol_cs->appendChild($gmdProtocolText); $gmdProtocol->appendChild($gmdProtocol_cs); $CI_OnlineResource->appendChild($gmdProtocol); $gmdName_cs->appendChild($gmdNameText); $gmdName->appendChild($gmdName_cs); $CI_OnlineResource->appendChild($gmdName); $gmdDescription_cs->appendChild($gmdDescriptionText); $gmdDescription->appendChild($gmdDescription_cs); $CI_OnlineResource->appendChild($gmdDescription); //*********************************************************************************** $gmd_onLine->appendChild($CI_OnlineResource); $MD_DigitalTransferOptions->appendChild($gmd_onLine); $gmd_transferOptions->appendChild($MD_DigitalTransferOptions); $MD_Format->appendChild($gmd_name); $MD_Format->appendChild($gmd_version); $gmd_distributionFormat->appendChild($MD_Format); $MD_Distribution->appendChild($gmd_distributionFormat); $MD_Distribution->appendChild($gmd_transferOptions); $gmd_distributionInfo->appendChild($MD_Distribution); //dataQualityInfo $gmd_dataQualityInfo=$iso19139->createElement("gmd:dataQualityInfo"); $DQ_DataQuality=$iso19139->createElement("gmd:DQ_DataQuality"); $gmd_scope=$iso19139->createElement("gmd:scope"); $DQ_Scope=$iso19139->createElement("gmd:DQ_Scope"); $gmd_level=$iso19139->createElement("gmd:level"); $MD_ScopeCode=$iso19139->createElement("gmd:MD_ScopeCode"); $MD_ScopeCodeText=$iso19139->createTextNode("service"); $MD_ScopeCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RetrictionCode"); $MD_ScopeCode->setAttribute("codeListValue", "service"); $MD_ScopeCode->appendChild($MD_ScopeCodeText); $gmd_level->appendChild($MD_ScopeCode); $DQ_Scope->appendChild($gmd_level); $gmd_scope->appendChild($DQ_Scope); $DQ_DataQuality->appendChild($gmd_scope); //gmd:report in dataQualityInfo $gmd_report=$iso19139->createElement("gmd:report"); $DQ_DomainConsistency=$iso19139->createElement("gmd:DQ_DomainConsistency"); $gmd_result=$iso19139->createElement("gmd:result"); $DQ_ConformanceResult=$iso19139->createElement("gmd:DQ_ConformanceResult"); $gmd_specification=$iso19139->createElement("gmd:specification"); $CI_Citation=$iso19139->createElement("gmd:CI_Citation"); $gmd_title=$iso19139->createElement("gmd:title"); $gmd_title_cs=$iso19139->createElement("gco:CharacterString"); $gmd_titleText=$iso19139->createTextNode("Service Abstract Suite"); //TODO put in the inspire test suites from mb database! $gmd_date=$iso19139->createElement("gmd:date"); $CI_Date=$iso19139->createElement("gmd:CI_Date"); $gmd_date_2=$iso19139->createElement("gmd:date"); $gco_Date=$iso19139->createElement("gco:Date"); $gco_DateText=$iso19139->createTextNode("2010-03-10"); //TODO put in the info from database $gmd_dateType=$iso19139->createElement("gmd:dateType"); $CI_DateTypeCode=$iso19139->createElement("gmd:CI_DateTypeCode"); $CI_DateTypeCode->setAttribute("codeList","http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode"); $CI_DateTypeCode->setAttribute("codeListValue","publication"); $CI_DateTypeCodeText=$iso19139->createTextNode("publication"); $gmd_explanation=$iso19139->createElement("gmd:explanation"); $gmd_explanation_cs=$iso19139->createElement("gco:CharacterString"); $gmd_explanationText=$iso19139->createTextNode("No explanation available"); $gmd_pass=$iso19139->createElement("gmd:pass"); $gco_Boolean=$iso19139->createElement("gco:Boolean"); $gco_BooleanText=$iso19139->createTextNode("true"); //TODO maybe set here a string cause it can be unevaluated!! See Implementing Rules //generate XML objects $gco_Date->appendChild($gco_DateText); $gmd_date->appendChild($gco_Date); $CI_DateTypeCode->appendChild($CI_DateTypeCodeText); $gmd_dateType->appendChild($CI_DateTypeCode); $CI_Date->appendChild($gmd_date); $CI_Date->appendChild($gmd_dateType); $gmd_date_2->appendChild($CI_Date); $gmd_title_cs->appendChild($gmd_titleText); $gmd_title->appendChild($gmd_title_cs); $CI_Citation->appendChild($gmd_title); $CI_Citation->appendChild($gmd_date_2); $gmd_specification->appendChild($CI_Citation); $gmd_explanation_cs->appendChild($gmd_explanationText); $gmd_explanation->appendChild($gmd_explanation_cs); $gco_Boolean->appendChild($gco_BooleanText); $gmd_pass->appendChild($gco_Boolean); $DQ_ConformanceResult->appendChild($gmd_specification); $DQ_ConformanceResult->appendChild($gmd_explanation); $DQ_ConformanceResult->appendChild($gmd_pass); $gmd_result->appendChild($DQ_ConformanceResult); $DQ_DomainConsistency->appendChild($gmd_result); $gmd_report->appendChild($DQ_DomainConsistency); $DQ_DataQuality->appendChild($gmd_report); $gmd_dataQualityInfo->appendChild($DQ_DataQuality); //$MD_ScopeCode->setAttribute("codeListValue", "service"); $MD_Metadata->appendChild($identificationInfo); $MD_Metadata->appendChild($gmd_distributionInfo); $MD_Metadata->appendChild($gmd_dataQualityInfo); return $iso19139->saveXML(); } //function to give away the xml data function pushISO19139($iso19139Doc, $recordId) { //echo $recordId; header("Content-type: application/xhtml+xml; charset=UTF-8"); $xml = fillISO19139($iso19139Doc, $recordId); echo $xml; die(); } //function to validate against the inspire validation service function validateInspireMetadata($iso19139Doc, $recordId){ $validatorUrl = 'http://www.inspire-geoportal.eu/INSPIREValidatorService/resources/validation/inspire'; #$validatorUrl2 = 'http://localhost/mapbender/x_geoportal/log_requests.php'; //send inspire xml to validator and push the result to requesting user $validatorInterfaceObject = new connector(); $validatorInterfaceObject->set('httpType','POST'); #$validatorInterfaceObject->set('httpContentType','application/xml'); $validatorInterfaceObject->set('httpContentType','multipart/form-data'); # maybe given automatically $xml = fillISO19139($iso19139Doc, $recordId); //first test with data from ram - doesn't function $fields = array( 'dataFile'=>urlencode($xml) ); //generate file identifier: $fileId = guid(); //generate temporary file under tmp if($h = fopen(TMPDIR."/".$fileId."iso19139_validate_tmp.xml","w")){ if(!fwrite($h,$xml)){ $e = new mb_exception("mod_layerISOMetadata: cannot write to file: ".TMPDIR."iso19139_validate_tmp.xml"); } fclose($h); } //send file as post like described under http://www.tecbrat.com/?itemid=13&catid=1 $fields['dataFile']='@'.TMPDIR.'/'.$fileId.'iso19139_validate_tmp.xml'; #if we give a string with parameters #foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } #rtrim($fields_string,'&'); #$postData = $fields_string; $postData = $fields; #$e = new mb_exception("mod_layerISOMetadata: postData: ".$postData['dataFile']); //number of post fields: //curl_setopt($ch,CURLOPT_POST,count($fields)); $validatorInterfaceObject->set('httpPostFieldsNumber',count($postData)); $validatorInterfaceObject->set('curlSendCustomHeaders',false); //$validatorInterfaceObject->set('httpPostData', $postData); $validatorInterfaceObject->set('httpPostData', $postData); #give an array $validatorInterfaceObject->load($validatorUrl); header("Content-type: text/html; charset=UTF-8"); echo $validatorInterfaceObject->file; //delete file in tmp //TODO - this normally done by a cronjob die(); } function getEpsgByLayerId ($layer_id) { // from merge_layer.php $epsg_list = ""; $sql = "SELECT DISTINCT epsg FROM layer_epsg WHERE fkey_layer_id = $1"; $v = array($layer_id); $t = array('i'); $res = db_prep_query($sql, $v, $t); while($row = db_fetch_array($res)){ $epsg_list .= $row['epsg'] . " "; } return trim($epsg_list); } function getEpsgArrayByLayerId ($layer_id) { // from merge_layer.php //$epsg_list = ""; $epsg_array=array(); $sql = "SELECT DISTINCT epsg FROM layer_epsg WHERE fkey_layer_id = $1"; $v = array($layer_id); $t = array('i'); $res = db_prep_query($sql, $v, $t); $cnt=0; while($row = db_fetch_array($res)){ $epsg_array[$cnt] = $row['epsg']; $cnt++; } return $epsg_array; } function guid(){ if (function_exists('com_create_guid')){ return com_create_guid(); }else{ mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. $charid = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45);// "-" $uuid = chr(123)// "{" .substr($charid, 0, 8).$hyphen .substr($charid, 8, 4).$hyphen .substr($charid,12, 4).$hyphen .substr($charid,16, 4).$hyphen .substr($charid,20,12) .chr(125);// "}" return $uuid; } } //do the things which had to be done ;-) if ($_REQUEST['VALIDATE'] == "true"){ validateInspireMetadata($iso19139Doc, $recordId); } else { pushISO19139($iso19139Doc, $recordId); //throw it out to world! } ?>