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

svn_mapbender at osgeo.org svn_mapbender at osgeo.org
Fri Oct 11 13:09:05 PDT 2013


Author: armin11
Date: 2013-10-11 13:09:05 -0700 (Fri, 11 Oct 2013)
New Revision: 8727

Modified:
   trunk/mapbender/http/php/wms.php
Log:
New possibility so serve mapbender capabilities with all childs of requested layer - make some things easier ;-) - not intended for inspire.

Modified: trunk/mapbender/http/php/wms.php
===================================================================
--- trunk/mapbender/http/php/wms.php	2013-10-11 07:02:29 UTC (rev 8726)
+++ trunk/mapbender/http/php/wms.php	2013-10-11 20:09:05 UTC (rev 8727)
@@ -16,14 +16,13 @@
 # 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.
-
+//http://localhost/mapbender_trunk/php/wms.php?layer_id=21018&INSPIRE=1&REQUEST=GetCapabilities&VERSION=1.1.1&SERVICE=wms&withChilds=1
 require_once(dirname(__FILE__)."/../../core/globalSettings.php");
 require_once(dirname(__FILE__)."/../classes/class_layer_monitor.php");
 require_once(dirname(__FILE__)."/../classes/class_administration.php");
 //
 $admin = new administration();
 //
-//
 // make all parameters available as upper case
 //
 foreach($_GET as $key => $val) {
@@ -36,6 +35,11 @@
 $layerId = $_GET["LAYER_ID"];
 $updateSequence = intval($_GET["UPDATESEQUENCE"]);
 $inspire = $_GET["INSPIRE"];
+$withChilds = false;
+
+if (isset($_REQUEST["withChilds"]) && $_REQUEST["withChilds"] === "1") {
+	$withChilds = true;
+}
 $sessionId = $_GET[strtoupper(session_name())];
 //if session id not set, set a dummy id!
 if (!isset($sessionId) || $sessionId =="") {
@@ -136,7 +140,7 @@
 $wms_row = db_fetch_array($res_wms_sql);
 
 if (!$wms_row["wms_id"]) {
-	// TO DO: create exception XML
+	// TODO: create exception XML
 	header("Content-type: application/xhtml+xml; charset=UTF-8");
 	echo createExceptionXml("Layer not defined", "Unknown layer id " . $layerId);
 	die;
@@ -211,8 +215,6 @@
 $monitor = new Layer_load_count();
 $monitor->increment($layerId);
 
-
-
 // ---------------------------------------------------------------------------
 //
 // START TO CREATE CAPABILITIES DOC
@@ -228,7 +230,7 @@
 #to be adopted TODO armin 
 function validate ($contactInformation_column) {
     if ($contactInformation_column <> "" AND $contactInformation_column <> NULL) {
-             $contactinformationcheck = true;
+             	$contactinformationcheck = true;
     }
     else {
 		$contactinformationcheck = false;
@@ -784,7 +786,7 @@
 $res_layer_sql = db_prep_query($layer_sql, $v, $t);
 $layer_row = db_fetch_array($res_layer_sql);
 			
-#Creating layer node
+#Creating root layer node
 $layer = $doc->createElement("Layer");
 $layer = $capability->appendChild($layer);
 
@@ -813,10 +815,10 @@
 } else {
 	$layerAbstract = _mb("Layer abstract not given - please give a description for this layer.");
 }
-    $abstract = $doc->createElement("Abstract");
-    $abstract = $layer->appendChild($abstract);
-    $abstractText = $doc->createTextNode($layerAbstract);
-    $abstractText = $abstract->appendChild($abstractText);
+$abstract = $doc->createElement("Abstract");
+$abstract = $layer->appendChild($abstract);
+$abstractText = $doc->createTextNode($layerAbstract);
+$abstractText = $abstract->appendChild($abstractText);
 #Request the specific wms- and layerkeywords
 
 $keyword_sql = "SELECT DISTINCT keyword FROM keyword, layer_keyword, layer " . 
@@ -849,8 +851,6 @@
 	}
 }
 
-
-
 #SQL statement to get additional layer information from layer epsg	
 $epsg_sql = "SELECT layer_epsg.epsg, layer_epsg.minx, layer_epsg.miny, " . 
 	"layer_epsg.maxy, layer_epsg.maxx " . 
@@ -859,28 +859,25 @@
 $v = array($layer_row['layer_id']);
 $t = array("i");
 $res_espg_sql = db_prep_query($epsg_sql, $v, $t);
-
+$res_espg_sql1 = $res_espg_sql;
 $latLonBoundingBoxCreated = false;
 $BoundingBoxCreated = false;
 
 while ($epsg_row = db_fetch_array($res_espg_sql)) {
-
 	#Creating SRS node
 	$srs = $doc->createElement("SRS");
 	$srs = $layer->appendChild($srs);
 	$srsText = $doc->createTextNode(str_replace('epsg','EPSG',$epsg_row['epsg']));
 	$srsText = $srs->appendChild($srsText);
-	
-
 }
 
 #SQL statement to get additional layer information from layer epsg	
-$epsg_sql = "SELECT layer_epsg.epsg, layer_epsg.minx, layer_epsg.miny, " . 
+/*$epsg_sql = "SELECT layer_epsg.epsg, layer_epsg.minx, layer_epsg.miny, " . 
 	"layer_epsg.maxy, layer_epsg.maxx " . 
 	"FROM layer_epsg WHERE layer_epsg.fkey_layer_id = $1";
 	
 $v = array($layer_row['layer_id']);
-$t = array("i");
+$t = array("i");*/
 $res_espg_sql = db_prep_query($epsg_sql, $v, $t);
 
 while ($epsg_row = db_fetch_array($res_espg_sql)) {
@@ -904,12 +901,12 @@
 }
 
 #SQL statement to get additional layer information from layer epsg	
-$epsg_sql = "SELECT layer_epsg.epsg, layer_epsg.minx, layer_epsg.miny, " . 
+/*$epsg_sql = "SELECT layer_epsg.epsg, layer_epsg.minx, layer_epsg.miny, " . 
 	"layer_epsg.maxy, layer_epsg.maxx " . 
 	"FROM layer_epsg WHERE layer_epsg.fkey_layer_id = $1";
 	
 $v = array($layer_row['layer_id']);
-$t = array("i");
+$t = array("i");*/
 $res_espg_sql = db_prep_query($epsg_sql, $v, $t);
 
 while ($epsg_row = db_fetch_array($res_espg_sql)) {
@@ -930,7 +927,6 @@
 	$boundingBox->setAttribute('maxy', $bbox['maxy']);
 }
 
-
 #Append epsg string to srs node
 $srsText = $doc->createTextNode($epsgText);
 $srsText = $srs->appendChild($srsText);
@@ -946,6 +942,7 @@
 $AUOnlineResource->setAttribute("xlink:href", $AuthorityUrl);
 $AUOnlineResource = $AuthorityURL->appendChild($AUOnlineResource);
 
+//fictive root layer created
 
 ####### duplicate root layer 
 #if layer is root layer itself!
@@ -960,189 +957,112 @@
 ##}
 #</armin>
 
+//call function for sublayer element
 
-
-############## sublayer 
-	
-#SQL statement to get all layers
-$sub_layer_sql = "SELECT * FROM layer WHERE fkey_wms_id = $1 AND layer_parent <> ''";
-$v = array($wms_row['wms_id']);
-$t = array("i");
-
-if (isset($layerId) && $layerId > 0) {	
-	$sub_layer_sql .= " AND layer_id = $2";
-	array_push($v, $layerId);
-	array_push($t, "i");
-}
-$sub_layer_sql .= " ORDER BY layer_pos";
-$res_sub_layer_sql = db_prep_query($sub_layer_sql, $v, $t);
-
-
-#<armin>
-$res_sub_layer_sql_2 = db_prep_query($sub_layer_sql, $v, $t);   
-$sub_layer_row_2 = db_fetch_array($res_sub_layer_sql_2);
-
-
-if (!isset($sub_layer_row_2['layer_pos'])) {
-	$clonedLayer = $layer->cloneNode(true);
-	$clonedLayer->setAttribute("queryable", "0");
-	$clonedLayer->setAttribute("cascaded", "0");
-	$layer->appendChild($clonedLayer);
-}
-#</armin>
-
-
-$e = new mb_notice("wms.php: read sublayer:");
-
-while ($sub_layer_row = db_fetch_array($res_sub_layer_sql)) {
-	
-	#Creating layer node
-
-	$sub_layer = $doc->createElement("Layer");
-	$e = new mb_notice("wms.php: layer_parent:".$sub_layer_row['layer_parent']);
-	$parent = $parentLayerArray[$sub_layer_row['layer_parent']];
-	$e = new mb_notice("wms.php: type of parent:".gettype($parent));
-	if (gettype($parent) == "NULL") {
-		$e = new mb_notice("wms.php: layer_parent not found in parent array - root layer info will be used!");
-		$parent = $parentLayerArray[0];
-	}
-	$sub_layer = $parent->appendChild($sub_layer);
-    
-    	if($sub_layer_row['layer_queryable'] <> "" AND $sub_layer_row['layer_queryable'] <> NULL) {
-		$sub_layer->setAttribute('queryable', $sub_layer_row['layer_queryable']);
+//*************************************************
+function createLayerElement ($doc, $wmsId, $layerRow, $wmsRow) {
+	#Creating single layer node
+	$layer = $doc->createElement("Layer");
+    	if($layerRow['layer_queryable'] <> "" AND $layerRow['layer_queryable'] <> NULL) {
+		$layer->setAttribute('queryable', $layerRow['layer_queryable']);
     	}
-	#Getting information about the hierarchie of layers
-	$cascadeSQL = "SELECT COUNT(*) FROM layer WHERE fkey_wms_id = $1 AND layer_parent = $2";
-	
-	$v = array($wms_row[0], $sub_layer_row['layer_pos']);
-	$t = array("i", "i");
-	$res_cascadeSQL = db_prep_query($cascadeSQL, $v, $t);
-	$cascade = 0;
-	$cascade_row = db_fetch_row($res_cascadeSQL);
-	if($cascade_row[0] > 0)
-	{
-		$cascade = 1;
-	}
-	$sub_layer->setAttribute('cascaded', $cascade); //TODO: check if this is right!
-	
-	#Write layer to parent layer array
-	$parentLayerArray[$sub_layer_row['layer_pos']] = $sub_layer;
-	
 	#Creating name node
-    	if($sub_layer_row['layer_name'] <> "" AND $sub_layer_row['layer_name'] <> NULL) {
+    	if($layerRow['layer_name'] <> "" AND $layerRow['layer_name'] <> NULL) {
 		$name = $doc->createElement("Name");
-		$name = $sub_layer->appendChild($name);
-		$nameText = $doc->createTextNode($sub_layer_row['layer_name']);
+		$name = $layer->appendChild($name);
+		$nameText = $doc->createTextNode($layerRow['layer_name']);
 		$nameText = $name->appendChild($nameText);
     	}
-	
 	#Creating Title node
-    	if($sub_layer_row['layer_title'] <> "" AND $sub_layer_row['layer_title'] <> NULL) {
+    	if($layerRow['layer_title'] <> "" AND $layerRow['layer_title'] <> NULL) {
 		$title = $doc->createElement("Title");
-		$title = $sub_layer->appendChild($title);
-		$titleText = $doc->createTextNode($sub_layer_row['layer_title']);
+		$title = $layer->appendChild($title);
+		$titleText = $doc->createTextNode($layerRow['layer_title']);
 		$titleText = $title->appendChild($titleText);
     	}
-	
 	#Creating the "Abstract" node
-    	if($sub_layer_row['layer_abstract'] <> "" AND $sub_layer_row['layer_abstract'] <> NULL) {
-		$layerAbstract = $sub_layer_row['layer_abstract'];
+    	if($layerRow['layer_abstract'] <> "" AND $layerRow['layer_abstract'] <> NULL) {
+		$layerAbstract = $layerRow['layer_abstract'];
 	} else {
 		$layerAbstract = _mb('No abtract for the specific layer was given, please add a description to your layer ressource.');
 	}
     	$abstract = $doc->createElement("Abstract");
-    	$abstract = $sub_layer->appendChild($abstract);
+    	$abstract = $layer->appendChild($abstract);
     	$abstractText = $doc->createTextNode($layerAbstract);
     	$abstractText = $abstract->appendChild($abstractText);
-	
-    #Request the specific wms- and layerkeywords
-    $keyword_sql = "SELECT DISTINCT keyword FROM layer LEFT JOIN layer_keyword ON layer_keyword.fkey_layer_id = layer.layer_id LEFT JOIN keyword ON  keyword.keyword_id = layer_keyword.fkey_keyword_id WHERE layer.fkey_wms_id = ".$wms_row['wms_id']." AND layer.layer_id = ".$sub_layer_row['layer_id']."";
-    $res_keyword_sql = db_query($keyword_sql);
-    
-    #Creating list of keyword nodes
-    #Iterating over a List of Keywords
-    $keywordlistExist = 0;
-    while ($keyword_sql = db_fetch_array($res_keyword_sql))
-    {
-        #Initially creating the "KeywordList" node
-        if ($keywordlistExist == 0)
-        {
-            $keywordList = $doc->createElement("KeywordList");
-            $keywordList = $sub_layer->appendChild($keywordList);
-		    $keywordlistExist = 1;			
-        }
-        
-        #Creating the "Keyword" node
-        $keyword_dom = $doc->createElement("Keyword");
-        $keyword_dom = $keywordList->appendChild($keyword_dom);
-	if (trim($keyword_sql['keyword']) <> "" AND $keyword_sql['keyword'] <> NULL) {
-		$keyword = $keyword_sql['keyword'];
-	} else {
-		$keyword = _mb('Empty keyword was given, please add a keyword to your layer ressource.');
-	}
-        $keyword_domText = $doc->createTextNode($keyword);
-
-        $keyword_domText = $keyword_dom->appendChild($keyword_domText);
-    }
-
-	// inherit srs from parent layer
+	#Request the specific wms- and layerkeywords
+    	$keyword_sql = "SELECT DISTINCT keyword FROM layer LEFT JOIN layer_keyword ON layer_keyword.fkey_layer_id = layer.layer_id LEFT JOIN keyword ON  keyword.keyword_id = layer_keyword.fkey_keyword_id WHERE layer.fkey_wms_id = ".$wmsRow['wms_id']." AND layer.layer_id = ".$layerRow['layer_id']."";
+    	$res_keyword_sql = db_query($keyword_sql);
+    	#Creating list of keyword nodes
+   	#Iterating over a List of Keywords
+  	$keywordlistExist = 0;
+    	while ($keyword_sql = db_fetch_array($res_keyword_sql)) {
+        	#Initially creating the "KeywordList" node
+        	if ($keywordlistExist == 0)
+        	{
+            		$keywordList = $doc->createElement("KeywordList");
+            		$keywordList = $layer->appendChild($keywordList);
+			$keywordlistExist = 1;			
+        	}
+        	#Creating the "Keyword" node
+        	$keyword_dom = $doc->createElement("Keyword");
+        	$keyword_dom = $keywordList->appendChild($keyword_dom);
+		if (trim($keyword_sql['keyword']) <> "" AND $keyword_sql['keyword'] <> NULL) {
+			$keyword = $keyword_sql['keyword'];
+		} else {
+			$keyword = _mb('Empty keyword was given, please add a keyword to your layer ressource.');
+		}
+        	$keyword_domText = $doc->createTextNode($keyword);
+        	$keyword_domText = $keyword_dom->appendChild($keyword_domText);
+    	}
+	//inherit srs from parent layer TODO - use all srs from parents! Test the sql first
 	$layer_srs_sql = "SELECT DISTINCT epsg FROM layer_epsg " . 
-			"WHERE fkey_layer_id = ".$sub_layer_row['layer_id'] . 
-			" OR fkey_layer_id = " . $layer_row['layer_id'];
+			"WHERE fkey_layer_id = ".$layerRow['layer_id'];  
+			//" OR fkey_layer_id = " . $layer_row['layer_id'];
 	$res_layer_srs_sql = db_query($layer_srs_sql);
-
 	while ($layer_srs_row = db_fetch_array($res_layer_srs_sql)) {
 		#Creating SRS node
 		$srs = $doc->createElement("SRS");
-		$srs = $sub_layer->appendChild($srs);
+		$srs = $layer->appendChild($srs);
 		$srsText = $doc->createTextNode(str_replace('epsg','EPSG',$layer_srs_row['epsg']));
 		$srsText = $srs->appendChild($srsText);
-
 	}
 	#SQL statement to get additional layer information from layer epsg	
 	$epsg_sql = "SELECT layer_epsg.epsg, layer_epsg.minx, layer_epsg.miny, " . 
 			"layer_epsg.maxy, layer_epsg.maxx FROM layer_epsg " . 
-			"WHERE layer_epsg.fkey_layer_id = ".$sub_layer_row['layer_id'];
+			"WHERE layer_epsg.fkey_layer_id = ".$layerRow['layer_id'];
 	$res_espg_sql = db_query($epsg_sql);
-	
 	while ($epsg_row = db_fetch_array($res_espg_sql)) {
 		#set epsg 4326 for latlonbbox
 		if ($epsg_row['epsg'] == "EPSG:4326" AND $latLonBoundingBoxCreated == false) {
-			
 			$latlon['minx'] = $epsg_row['minx'];
 			$latlon['miny'] = $epsg_row['miny'];
 			$latlon['maxx'] = $epsg_row['maxx'];
 			$latlon['maxy'] = $epsg_row['maxy'];
-
 			#Creating LatLongBoundingBox node
-		    $latLonBoundingBox = $doc->createElement("LatLonBoundingBox");
-		    $latLonBoundingBox = $sub_layer->appendChild($latLonBoundingBox);
-		    $latLonBoundingBox->setAttribute('minx', $latlon['minx']);
-		    $latLonBoundingBox->setAttribute('miny', $latlon['miny']);
-		    $latLonBoundingBox->setAttribute('maxx', $latlon['maxx']);
-		    $latLonBoundingBox->setAttribute('maxy', $latlon['maxy']);
-	    }	
+		    	$latLonBoundingBox = $doc->createElement("LatLonBoundingBox");
+		    	$latLonBoundingBox = $layer->appendChild($latLonBoundingBox);
+		    	$latLonBoundingBox->setAttribute('minx', $latlon['minx']);
+		   	$latLonBoundingBox->setAttribute('miny', $latlon['miny']);
+		   	$latLonBoundingBox->setAttribute('maxx', $latlon['maxx']);
+		   	$latLonBoundingBox->setAttribute('maxy', $latlon['maxy']);
+	    	}	
 	}
-	
 	#SQL statement to get additional layer information from layer epsg	
 	$epsg_sql = "SELECT layer_epsg.epsg, layer_epsg.minx, layer_epsg.miny, " . 
 			"layer_epsg.maxy, layer_epsg.maxx FROM layer_epsg " . 
-			"WHERE layer_epsg.fkey_layer_id = ".$sub_layer_row['layer_id'];
+			"WHERE layer_epsg.fkey_layer_id = ".$layerRow['layer_id'];
 	$res_espg_sql = db_query($epsg_sql);
-	
 	while ($epsg_row = db_fetch_array($res_espg_sql)) {
-	
-		
 		#set only first epsg for bbox
 		$bbox['epsg'] = str_replace('epsg','EPSG',$epsg_row['epsg']);
 		$bbox['minx'] = $epsg_row['minx'];
 		$bbox['miny'] = $epsg_row['miny'];
 		$bbox['maxx'] = $epsg_row['maxx'];
 		$bbox['maxy'] = $epsg_row['maxy'];
-
 		#Creating BoundingBox node
 		$boundingBox = $doc->createElement("BoundingBox");
-		$boundingBox = $sub_layer->appendChild($boundingBox);
+		$boundingBox = $layer->appendChild($boundingBox);
 		$boundingBox->setAttribute('SRS', $bbox['epsg']);
 		$boundingBox->setAttribute('minx', $bbox['minx']);
 		$boundingBox->setAttribute('miny', $bbox['miny']);
@@ -1152,9 +1072,7 @@
 	//
 	//Creating Metadata and Identifier nodes
 	//read out all metadata entries for specific layer
-
-
-	$subLayerId = $sub_layer_row['layer_id'];
+	$subLayerId = $layerRow['layer_id'];
 	$sql = <<<SQL
 
 SELECT metadata_id, uuid, link, linktype, md_format, origin, datasetid FROM mb_metadata 
@@ -1163,18 +1081,13 @@
 mb_metadata.metadata_id = relation.fkey_metadata_id WHERE mb_metadata.origin IN ('capabilities','external','metador','upload')
 
 SQL;
-	//$e = new mb_exception("wms.php: layerid: ".$sub_layer_row['layer_id']);
+	//$e = new mb_exception("wms.php: layerid: ".$layerRow['layer_id']);
 	$i = 0;
 	$res_metadata = db_query($sql);
-
-
-
-		
-
 	while ($row_metadata = db_fetch_array($res_metadata)) {
 		//check id datasetid is set, if not use metadataid
 		if ($row_metadata["datasetid"] == '' || !isset($row_metadata["datasetid"])) {
-			//this column is empty, if metador was used and the identifier for dataset id is equal to the identifier of the metadata fileidentifier. In this case we expand a standard codespace http://www.geoportal.rlp.de TODO: use a define in mapbender.conf to pull the standard codespace from!
+			//this column is empty, if metador was used and the identifier for dataset id is equal to the identifier of the metadata fileidentifier. In this case we expand a standard codespace http://www.geoportal.rlp.de 
 			if (defined('METADATA_DEFAULT_CODESPACE')) {
 				$datasetId = METADATA_DEFAULT_CODESPACE."#".$row_metadata["uuid"];
 			} else {
@@ -1185,18 +1098,17 @@
 		}
 		//create Identifier tags
 		$Identifier = $doc->createElement("Identifier");
-		$Identifier = $sub_layer->appendChild($Identifier);
+		$Identifier = $layer->appendChild($Identifier);
 		$Identifier->setAttribute('authority', $AuthorityName);
 		$IdentifierText = $doc->createTextNode($datasetId);
     		$IdentifierText = $Identifier->appendChild($IdentifierText);
-	
 		//$e = new mb_exception("i: ".$i);
 		//push entries into xml structure	
 		//check for kind of link - push the right one into the link field	
 		switch ($row_metadata['origin']) {
 			case 'capabilities':
 				$metadataUrl = $doc->createElement("MetadataURL");
-				$metadataUrl = $sub_layer->appendChild($metadataUrl);
+				$metadataUrl = $layer->appendChild($metadataUrl);
 				$metadataUrl->setAttribute('type', $row_metadata['linktype']);
 				$format = $doc->createElement("Format");
     				$format = $metadataUrl->appendChild($format);
@@ -1209,7 +1121,7 @@
 			break;
 			case 'external':
 				$metadataUrl = $doc->createElement("MetadataURL");
-				$metadataUrl = $sub_layer->appendChild($metadataUrl);
+				$metadataUrl = $layer->appendChild($metadataUrl);
 				$metadataUrl->setAttribute('type', 'ISO19115:2003');
 				$format = $doc->createElement("Format");
     				$format = $metadataUrl->appendChild($format);
@@ -1223,7 +1135,7 @@
 			break;
 			case 'upload':
 				$metadataUrl = $doc->createElement("MetadataURL");
-				$metadataUrl = $sub_layer->appendChild($metadataUrl);
+				$metadataUrl = $layer->appendChild($metadataUrl);
 				$metadataUrl->setAttribute('type', 'ISO19115:2003');
 				$format = $doc->createElement("Format");
     				$format = $metadataUrl->appendChild($format);
@@ -1237,7 +1149,7 @@
 			break;
 			case 'metador':
 				$metadataUrl = $doc->createElement("MetadataURL");
-				$metadataUrl = $sub_layer->appendChild($metadataUrl);
+				$metadataUrl = $layer->appendChild($metadataUrl);
 				$metadataUrl->setAttribute('type', 'ISO19115:2003');
 				$format = $doc->createElement("Format");
     				$format = $metadataUrl->appendChild($format);
@@ -1251,7 +1163,7 @@
 			break;
 			default:
 				$metadataUrl = $doc->createElement("MetadataURL");
-				$metadataUrl = $sub_layer->appendChild($metadataUrl);
+				$metadataUrl = $layer->appendChild($metadataUrl);
 				$metadataUrl->setAttribute('type', 'ISO19115:2003');
 				$format = $doc->createElement("Format");
     				$format = $metadataUrl->appendChild($format);
@@ -1268,23 +1180,19 @@
 		$onlineResource->setAttribute("xlink:type", "simple");
 		//Add linkage to Capabilities
 		$i++;
-		//$e = new mb_exception("i: ".$i);
 	}
-	
-	#Creating DataURL Node - use it from database if it will exist!
-		
+	#Creating DataURL Node - use it from database if it will exist!	
 	$dataUrl = $doc->createElement("DataURL");
-	$dataUrl = $sub_layer->appendChild($dataUrl);
+	$dataUrl = $layer->appendChild($dataUrl);
 	$format = $doc->createElement("Format");
     	$format = $dataUrl->appendChild($format);
     	$formatText = $doc->createTextNode('text/html');
    	$formatText = $format->appendChild($formatText); 
-
-	if ($sub_layer_row['layer_dataurl'] <> "" AND $sub_layer_row['layer_dataurl'] <> NULL) {
+	if ($layerRow['layer_dataurl'] <> "" AND $layerRow['layer_dataurl'] <> NULL) {
 	    	$onlineResource = $doc->createElement("OnlineResource");
 	    	$onlineResource = $dataUrl->appendChild($onlineResource);
 		$onlineResource->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink" );
-		$onlineResource->setAttribute("xlink:href", $sub_layer_row['layer_dataurl']);
+		$onlineResource->setAttribute("xlink:href", $layerRow['layer_dataurl']);
 		$onlineResource->setAttribute("xlink:type", "simple");
     	}
 	else
@@ -1292,10 +1200,9 @@
  		$onlineResource = $doc->createElement("OnlineResource");
              	$onlineResource = $dataUrl->appendChild($onlineResource);
                 $onlineResource->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink" );
-                $onlineResource->setAttribute("xlink:href", $mapbenderMetadataUrl.$sub_layer_row['layer_id']);
+                $onlineResource->setAttribute("xlink:href", $mapbenderMetadataUrl.$layerRow['layer_id']);
 		$onlineResource->setAttribute("xlink:type", "simple");
 	}	
-	
 	//Creating Style Node by pulling style and format from database!
 	//for each possible style
 	//check for number of styles, check for name 'default'
@@ -1305,12 +1212,10 @@
 SELECT * FROM layer_style WHERE fkey_layer_id = $subLayerId 
 
 SQL;
-
 	$res_style = db_query($sql);
-
 	while ($row_style = db_fetch_array($res_style)) {
 		$style = $doc->createElement("Style");
-		$style = $sub_layer->appendChild($style);
+		$style = $layer->appendChild($style);
 		$name = $doc->createElement("Name");
     		$name = $style->appendChild($name);
 		if ($row_style['name'] != '') {
@@ -1328,7 +1233,7 @@
 		}
     		$titleText = $title->appendChild($titleText);
 		//if server supports get legend graphic	
-		if(($wms_row['wms_getlegendurl'] <> "" AND $wms_row['wms_getlegendurl'] <> NULL) || ($row_style['legendurl'] <> "" AND $row_style['legendurl'] <> NULL)){	
+		if(($wmsRow['wms_getlegendurl'] <> "" AND $wmsRow['wms_getlegendurl'] <> NULL) || ($row_style['legendurl'] <> "" AND $row_style['legendurl'] <> NULL)){	
 			$legendUrl = $doc->createElement("LegendURL");
 			$legendUrl = $style->appendChild($legendUrl);
 			$legendUrl->setAttribute("width", "10" );
@@ -1344,12 +1249,12 @@
 			$onlineResource = $doc->createElement("OnlineResource");
 			$onlineResource = $legendUrl->appendChild($onlineResource);
 			$onlineResource->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink" );
-			if ($wms_row['wms_getlegendurl'] <> "" AND $wms_row['wms_getlegendurl'] <> NULL) {
-				$onlineResource->setAttribute("xlink:href", $wms_row['wms_getlegendurl']."version=1.1.1&service=WMS&request=GetLegendGraphic&layer=".$sub_layer_row['layer_name']."&format=image/png");
+			if ($wmsRow['wms_getlegendurl'] <> "" AND $wmsRow['wms_getlegendurl'] <> NULL) {
+				$onlineResource->setAttribute("xlink:href", $wmsRow['wms_getlegendurl']."version=1.1.1&service=WMS&request=GetLegendGraphic&layer=".$layerRow['layer_name']."&format=image/png");
 			} else {
 				//other stupid check - TODO: make it better
 				if (strpos($row_style['legendurl'], "http:") === false) {
-					$onlineResource->setAttribute("xlink:href", $wms_row['wms_getlegendurl'].$row_style['legendurl']);
+					$onlineResource->setAttribute("xlink:href", $wmsRow['wms_getlegendurl'].$row_style['legendurl']);
 				} else {
 					$onlineResource->setAttribute("xlink:href", $row_style['legendurl']);
 				}
@@ -1358,13 +1263,54 @@
 		}
 	}
 	//Creating "ScaleHint" node
-	if ($sub_layer_row['layer_minscale'] <> "" AND $sub_layer_row['layer_minscale'] <> NULL) {
+	if ($layerRow['layer_minscale'] <> "" AND $layerRow['layer_minscale'] <> NULL) {
 		$scaleHint = $doc->createElement("ScaleHint");
-		$scaleHint = $sub_layer->appendChild($scaleHint);
-		$scaleHint->setAttribute('min', (floatval($sub_layer_row['layer_minscale'])/2004.3976484406788493955738891127));
-		$scaleHint->setAttribute('max', (floatval($sub_layer_row['layer_maxscale'])/2004.3976484406788493955738891127));
-	}	
+		$scaleHint = $layer->appendChild($scaleHint);
+		$scaleHint->setAttribute('min', (floatval($layerRow['layer_minscale'])/2004.3976484406788493955738891127));
+		$scaleHint->setAttribute('max', (floatval($layerRow['layer_maxscale'])/2004.3976484406788493955738891127));
+	}
+	return $layer;	
+} //end of function to create single layer object
+
+//*************************************************
+
+function createLayerTree($parent, $withChilds, $layerId, &$layer, $wmsId, $doc, $wms_row) {
+	$sub_layer_sql = "SELECT * FROM layer WHERE fkey_wms_id = $1 AND layer_parent = $2 ORDER BY layer_pos";
+	$v = array($wmsId, $parent);
+	$t = array("i","s");
+	if (!$withChilds) {	
+		$sub_layer_sql .= " AND layer_id = $2";
+		array_push($v, $layerId);
+		array_push($t, "i");
+	}
+	//$e = new mb_exception($sub_layer_sql);
+	$res_sub_layer_sql = db_prep_query($sub_layer_sql, $v, $t);
+	while ($sub_layer_row = db_fetch_array($res_sub_layer_sql)) {
+		$subLayer = createLayerElement($doc, $wmsId, $sub_layer_row, $wms_row);
+		//recursive creation
+		createLayerTree($sub_layer_row['layer_pos'], $withChilds, $layerId, &$subLayer, $wmsId, $doc, $wms_row);
+		$layer->appendChild($subLayer);
+	}
 }
+
+//get layer_pos for requested layer id before beginning with tree creation
+$layerSql = "SELECT * FROM layer WHERE layer_id = $1";
+$v = array($layerId);
+$t = array("i");
+$res_layer = db_prep_query($layerSql, $v, $t);
+$row = db_fetch_array($res_layer);
+$layerPos = $row['layer_pos'];
+//TODO: root layer is always there but the following pulls only the sublayer and not the requested layer by its own!! - todo: don't use the root layer every time!!! pull the requested layer instead but pull all srs and things which are inherited from the root layer or the parents from this layer - it is not always easy if the hirarchy is nested much - pull all parents - maybe a thing for class_administration!
+if ($withChilds) {
+	//create layer itself first!
+	$subLayer = createLayerElement($doc, $wmsId, $row, $wms_row);
+	
+	createLayerTree($layerPos, $withChilds, $layerId, $subLayer, $wms_row['wms_id'], $doc, $wms_row);
+} else {
+	//only create one layer
+	$subLayer = createLayerElement($doc, $wmsId, $row, $wms_row);
+}
+$layer->appendChild($subLayer);
 header("Content-type: application/xhtml+xml; charset=UTF-8");
 echo $doc->saveXml();
 ?>



More information about the Mapbender_commits mailing list