$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, ";
$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 , ";
$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:
//service data
$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
$sql = "SELECT mb_group_name ";
$sql .= "FROM mb_group WHERE mb_group_id = $1";
$v = array((integer)$mapbenderMetadata['department']);
$t = array('i');
$res = db_prep_query($sql,$v,$t);
$departmentMetadata = db_fetch_array($res);
//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'],ANONYMOUS_USER);
//Creating the "MD_Metadata" node
$MD_Metadata = $iso19139->createElementNS('http://www.isotc211.org/2005/gmd', 'gmd:MD_Metadata');
//$MD_Metadata=$iso19139->registerNamespace('srv','http://www.iso211.org/2005/srv');
//$wmt_ms_capabilities->setAttribute("updateSequence", $wms_row["wms_timestamp"]);
$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['layer_id'])) {
$identifierText = $iso19139->createTextNode($mapbenderMetadata['layer_id']);//TODO: generate an 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");
#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']);
}
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);
}
#Do things for B 1.5 Resource unique identifier NOTE: not applicable for services
//$identifier=$iso19139->createElement("gmd:identifier");
//$rs_identifier=$iso19139->createElement("gmd:RS_Identifier");
//$code=$iso19139->createElement("gmd:code");
//$code_cs=$iso19139->createElement("gco:CharacterString");
//$codeText=$iso19139->createTextNode($detail_array['t01_object.obj_id']);
//$code_cs->appendChild($codeText);
//$code->appendChild($code_cs);
//$rs_identifier->appendChild($code);
//$identifier->appendChild($rs_identifier);
//$CI_Citation->appendChild($identifier);
#create tree
$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
#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($serviceMetadata['contactorganization'])) {
$resOrgaText = $iso19139->createTextNode($serviceMetadata['contactorganization']);
}
else {
$resOrgaText= $iso19139->createTextNode("not yet defined");
}
if (isset($serviceMetadata['contactelectronicmailaddress'])) {
$resMailText = $iso19139->createTextNode($serviceMetadata['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 (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/geoportal/preview/".$row['layer_map_preview_filename']);
$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("PNG");
$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);
}
/*
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 ;-)
$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);
$descriptiveKeywords->appendChild($MD_Keywords);
$SV_ServiceIdentification->appendChild($descriptiveKeywords);
//generate constraints part
//generate service type part
//generate extent part
//generate coupling part
//end of service identification
//generate distribution part
//generate data quality part
#Part B 3 INSPIRE Category
#do this only if an INSPIRE keyword (Annex I-III) is set
#Resource Constraints B 8
//if(isset($mapbenderMetadata['accessconstraints'])){
$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
$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);
//service type
//
// 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);
# Part B 1.7 Dataset Language
#if(isset($detail_array['t01_object.data_language'])){
#$language=$iso19139->createElement("gmd:language");
#$LanguageCode=$iso19139->createElement("gmd:LanguageCode");
#$LanguageCodeText=$iso19139->createTextNode($detail_array['t01_object.data_language']);
#$LanguageCode->appendChild($LanguageCodeText);
#$language->appendChild($LanguageCode);
#$SV_ServiceIdentification->appendChild($language);
#}
#Topic Category B 2.1
#if(isset($detail_array['t011_obj_geo_topic_cat.topic_category'])){
#$topicCategory=$iso19139->createElement("gmd:topicCategory");
#$MD_TopicCategoryCode=$iso19139->createElement("gmd:MD_TopicCategoryCode");
#$MD_TopicCategoryText=$iso19139->createTextNode($detail_array['t011_obj_geo_topic_cat.topic_category']);
#$MD_TopicCategoryCode->appendChild($MD_TopicCategoryText);
#$topicCategory->appendChild($MD_TopicCategoryCode);
#$SV_ServiceIdentification->appendChild($topicCategory);
#}
#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);
#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?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);
/*
$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?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!
}
?>