[Mapbender-commits] r6845 - trunk/mapbender/http/php

svn_mapbender at osgeo.org svn_mapbender at osgeo.org
Tue Aug 31 01:42:58 EDT 2010


Author: armin11
Date: 2010-08-31 05:42:58 +0000 (Tue, 31 Aug 2010)
New Revision: 6845

Added:
   trunk/mapbender/http/php/mod_layerISOMetadata.php
Log:
New module to read out iso19139 files from the mapbender database. It can also validate these files against the INSPIRE metadata validator. The module generates files that are almost compatible to the IINSPIRE technical guidlines for service metadata.

Added: trunk/mapbender/http/php/mod_layerISOMetadata.php
===================================================================
--- trunk/mapbender/http/php/mod_layerISOMetadata.php	                        (rev 0)
+++ trunk/mapbender/http/php/mod_layerISOMetadata.php	2010-08-31 05:42:58 UTC (rev 6845)
@@ -0,0 +1,851 @@
+<?php
+#http://www.geoportal.rlp.de/mapbender/php/mod_layerISOMetadata.php?SERVICE=WMS&outputFormat=iso19139&Id=24356
+# $Id: mod_layerISOMetadata.php 235
+# http://www.mapbender.org/index.php/Inspire_Metadata_Editor
+# Copyright (C) 2002 CCGIS 
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+
+require_once(dirname(__FILE__) . "/../../core/globalSettings.php");
+require_once(dirname(__FILE__) . "/../classes/class_connector.php");
+
+$con = db_connect(DBSERVER,OWNER,PW);
+db_select_db(DB,$con);
+
+//define the view or table to use as input for metadata generation
+$wmsView = "wms_search_table_test";
+$wmsView = '';
+//parse request parameter
+//make all parameters available as upper case
+
+foreach($_REQUEST as $key => $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: <b>'.$testMatch.'</b> is not valid.<br/>'; 
+		die(); 		
+ 	}
+	$recordId = $testMatch;
+	$testMatch = NULL;
+}
+//
+if ($_REQUEST['OUTPUTFORMAT'] == "iso19139") {
+	//Initialize XML document
+	$iso19139Doc = new DOMDocument('1.0');
+	$iso19139Doc->encoding = 'UTF-8';
+} else {
+	echo 'outputFormat: <b>'.$_REQUEST['OUTPUTFORMAT'].'</b> is not set or valid.<br/>'; 
+	die();
+}
+//if validation is requested
+//
+if (isset($_REQUEST['VALIDATE']) and $_REQUEST['VALIDATE'] != "true") {
+	//
+	echo 'validate: <b>'.$_REQUEST['VALIDATE'].'</b> is not valid.<br/>'; 
+	die();
+}
+//some needfull functions to pull metadata out of the database!
+
+function fillISO19139($iso19139, $recordId) {
+        global $wmsView;
+	//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 .= "FROM wms, layer WHERE layer_id = $1 and layer.fkey_wms_id = wms.wms_id";
+	}
+	$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=getLayerPermission($mapbenderMetadata['wms_id'],$mapbenderMetadata['layer_id'],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 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 at 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 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
+	//<srv:serviceType>
+    	//	<gco:LocalName>view</gco:LocalName>
+	//</srv:serviceType>
+	$serviceType=$iso19139->createElement("srv:serviceType");
+	$localName=$iso19139->createElement("gco:LocalName");
+	$serviceTypeText=$iso19139->createTextNode("view");
+	$localName->appendChild($serviceTypeText);
+	$serviceType->appendChild($localName);
+	$SV_ServiceIdentification->appendChild($serviceType);
+	# 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);
+	
+	$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(urlencode("http://www.geoportal.rlp.de/mapbender/x_geoportal/wms.php?layer_id=".$mapbenderMetadata['layer_id']."&REQUEST=GetCapabilities&VERSION=1.1.1&SERVICE=WMS"));
+	}
+	else {
+		$gmd_URLText=$iso19139->createTextNode(urlencode("https://www.geoportal.rlp.de/http_auth/".$mapbenderMetadata['layer_id']."?REQUEST=GetCapabilities&VERSION=1.1.1&SERVICE=WMS"));
+	}
+	$gmd_URL->appendChild($gmd_URLText);
+	$gmd_linkage->appendChild($gmd_URL);
+	$CI_OnlineResource->appendChild($gmd_linkage);
+	$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('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 user_authorization($wms_id,$layer_name,$user_id){
+		$n = new administration();
+		$this->n = $n; 
+		$permission=$this->n->getLayerPermission($wms_id, $layer_name, $user_id);
+		return $permission;
+	}
+
+//functions necessary to decide if service url should be displayed
+	function getLayerPermission($wms_id, $layer_id, $user_id){
+		//$layer_id = $this->getLayerIdByLayerName($wms_id,$layer_name);
+		$array_guis = getGuisByPermission($user_id,true);
+		$v = array();
+		$t = array();
+		$sql = "SELECT * FROM gui_layer WHERE fkey_gui_id IN (";
+		$c = 1;
+		//generate guilist assigned to specific user
+		for($i=0; $i<count($array_guis); $i++){
+			if($i>0){ $sql .= ",";}
+			$sql .= "$".$c;
+			$c++;
+			array_push($v, $array_guis[$i]);
+			array_push($t, 's');
+		}
+		$sql .= ") AND fkey_layer_id = $".$c." AND gui_layer_status = 1"; //Status must be 1
+		array_push($v,$layer_id);
+		array_push($t,'i');
+		$res = db_prep_query($sql,$v,$t);
+		if($row = db_fetch_array($res)){
+			return true;
+		}
+		else{
+			return false;
+		}
+	}
+	function getGuisByPermission($mb_user_id,$ignoreublic){
+		$arrayGuis = array();
+		$mb_user_groups = array();
+		$sql_groups = "SELECT fkey_mb_group_id FROM mb_user_mb_group WHERE fkey_mb_user_id = $1 ";
+		$v = array($mb_user_id);
+		$t = array("i");
+		$res_groups = db_prep_query($sql_groups,$v,$t);
+		$cnt_groups = 0;
+		while($row = db_fetch_array($res_groups)){
+			$mb_user_groups[$cnt_groups] = $row["fkey_mb_group_id"];
+			$cnt_groups++;
+		}
+		if($cnt_groups > 0){
+			$v = array();
+			$t = array();
+			$sql_g = "SELECT gui.gui_id FROM gui JOIN gui_mb_group ";
+			$sql_g .= " ON gui.gui_id = gui_mb_group.fkey_gui_id WHERE gui_mb_group.fkey_mb_group_id IN (";
+			for($i=0; $i<count($mb_user_groups);$i++){
+				if($i > 0){$sql_g .= ",";}
+				$sql_g .= "$".strval($i+1);
+				array_push($v,$mb_user_groups[$i]);
+				array_push($t,"i");
+			}
+			$sql_g .= ") GROUP BY gui.gui_id";
+			$res_g = db_prep_query($sql_g,$v,$t);
+			while($row = db_fetch_array($res_g)){
+				array_push($arrayGuis,$row["gui_id"]);
+			}
+		}
+		$sql_guis = "SELECT gui.gui_id FROM gui JOIN gui_mb_user ON gui.gui_id = gui_mb_user.fkey_gui_id";
+		$sql_guis .= " WHERE (gui_mb_user.fkey_mb_user_id = $1) ";
+		if (!isset($ignore_public) OR $ignore_public== false){
+			$sql_guis .= " AND gui.gui_public = 1 ";
+		}
+		$sql_guis .= " GROUP BY gui.gui_id";
+		$v = array($mb_user_id);
+		$t = array("i");
+		$res_guis = db_prep_query($sql_guis,$v,$t);
+		$guis = array();
+		while($row = db_fetch_array($res_guis)){
+			if(!in_array($row['gui_id'],$arrayGuis)){
+				array_push($arrayGuis,$row["gui_id"]);
+			}
+		}
+		return $arrayGuis;
+	}
+
+
+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!
+}
+?>
+



More information about the Mapbender_commits mailing list