Merge layers WMC

From MapbenderWiki

Jump to: navigation, search
<?php
require_once(dirname(__FILE__)."/../../conf/mapbender.conf");
require_once(dirname(__FILE__)."/../classes/class_administration.php");
require_once(dirname(__FILE__)."/../classes/class_mb_exception.php");
require_once(dirname(__FILE__)."/../classes/class_wmc.php");
require_once(dirname(__FILE__)."/../classes/class_bbox.php");
$con = db_connect();

$e = new mb_notice("merge_layers: arguments: portal_services: ". $_REQUEST['portal_services']);
	
$param = explode(",", $_REQUEST['portal_services']);
$new_layers = array();
$adm = new administration();
#$e = new mb_exception($_SESSION['mb_wmc']);

/**
 * gets the BBox in a given EPSG of a given layer from the database
 */
function getBBox($layer_id, $toEpsg) {
	$e = new mb_notice("merge_layers: getBBox of layer ". $layer_id . " in epsg " . $toEpsg);
	$result = array();
	$sql = "SELECT DISTINCT epsg, minx, miny, maxx, maxy 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)) {
		$min = new Mapbender_point($row['minx'], $row['miny'], $row['epsg']);
		$max = new Mapbender_point($row['maxx'], $row['maxy'], $row['epsg']);
		$newBox = new Mapbender_bbox($min, $max, $row['epsg']);
		if ($newBox->isValid()) {
			$result[$row['epsg']] = $newBox;
		}
		else {
			$e = new mb_notice("merge_layers: getBBox: discarding this layer...");
		}
	}
	if (count($result) == 0) {
		// get layer id of root layer
		$sql = "SELECT a.layer_id AS id FROM layer AS a INNER JOIN layer AS b ON a.fkey_wms_id = b.fkey_wms_id WHERE a.layer_pos = b.layer_parent AND b.layer_id = $1";
		$v = array($layer_id);
		$t = array("i");
		$res = db_prep_query($sql, $v, $t);
		if ($row = db_fetch_array($res)) {
			// return bbox of root layer
			return getBBox($row["id"], $toEpsg);			
		}
		return false;
	}
	// if bbox exists in desired epsg, return it 
	if (array_key_exists($toEpsg, $result)) {
		return $result[$toEpsg];
	}
	$epsgArray = array_keys($result);
	$fromEpsg = $epsgArray[0];
	
	// transform to the desired epsg
	$result[$fromEpsg]->transform($toEpsg);
	return $result[$fromEpsg];
}

function getEpsgByLayerId ($layer_id) {
	$result = "";
	$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)) {
		$result .= $row['epsg'] . " ";
	}
	return $result;
}

function getDataFormatByWmsId ($wms_id) {
	$dataformat_array = array();
	$sql = "SELECT DISTINCT data_format FROM wms_format WHERE fkey_wms_id = $1 AND data_type = 'map'";
	$v = array($wms_id);
	$t = array('i');
	$res = db_prep_query($sql, $v, $t);
	while($row = db_fetch_array($res)){
		$i = count($dataformat_array);
		$dataformat_array[$i] = $row['data_format'];
	}
	return $dataformat_array;
}

function getStyleByLayerId ($layer_id) {
	$style_array = array();
	$sql = "SELECT name, title, legendurl, legendurlformat FROM layer_style 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)){
		$i = count($style_array);
		$style_array[$i] = array();
		$style_array[$i]['name'] = mb_utf8_encode($row['name']);
		$style_array[$i]['title'] = mb_utf8_encode($row['title']);
		$style_array[$i]['legendurl'] = $row['legendurl'];
		$style_array[$i]['legendurlformat'] = $row['legendurlformat'];
	}
	return $style_array;
}

function getLayerPropertiesFromResult ($row) {
	$layer = array();
	$layer['id'] = $row['layer_id'];
	$e = new mb_notice("merge_layers: getLayerPropertiesFromResult: id: ". $layer['id']);
	$layer['name'] = mb_utf8_encode($row['layer_name']);
	$layer['title'] = mb_utf8_encode($row['layer_title']);
	$layer['minscale'] = $row['layer_minscale'];
	$layer['maxscale'] = $row['layer_maxscale'];
	$layer['queryable'] = $row['layer_queryable'];
	if($row['wms_owsproxy'] != ''){
		$layer['wms_getmap'] = OWSPROXY."/".session_id()."/".$row["wms_owsproxy"]."?"; 
	}
	else{
		$layer['wms_getmap'] = $row['wms_getmap'];	
	}
	$layer['wms_id'] = $row['wms_id'];
	$layer['wms_version'] = $row['wms_version'];
	$layer['wms_title'] = mb_utf8_encode($row['wms_title']);
	$layer['wms_abstract'] = mb_utf8_encode($row['wms_abstract']);
	$layer['dataurl'] = $row['layer_dataurl'];
	$layer['metadataurl'] = $row['layer_metadataurl'];
	$layer['epsg'] = getEpsgByLayerId($row['layer_id']);
	$layer['style'] = getStyleByLayerId($row['layer_id']);
	$layer['format'] = getDataFormatByWmsId($row['fkey_wms_id']);
	$layer['layer_pos'] = $row['layer_pos'];
	$layer['layer_parent'] = $row['layer_parent'];
#	$e = new mb_notice("found: " . $layer['bbox']->toString());
#	$e = new mb_exception("srs di dalam fungsi: " . $wmc_srs);
	return $layer;
} 

function getSublayer($row){
	
}
//$e = new mb_exception($_SESSION['mb_wmc']);

// get WMC from session
$wmc = $_SESSION['mb_wmc'];
// create DOM from String
$doc = new DOMDocument('1.0');
$doc->encoding = CHARSET;
$doc->preserveWhiteSpace = false;
$doc->loadXML($wmc);

// get current epsg
$wmc_srs_nodes = $doc->getElementsByTagName('BoundingBox');
foreach ($wmc_srs_nodes as $wmc_srs_node) {
	$wmc_srs = $wmc_srs_node->getAttribute('SRS'); 
#	$e = new mb_exception("srs: " . $wmc_srs);
}


for ($i=0 ; $i < count($param) ; $i++) {
	
	// get the WMS id of the current layer
	$sql_select = "SELECT ";
	$sql_select .= "layer.layer_id, layer.layer_title, layer.layer_minscale, layer.layer_maxscale, ";
	$sql_select .= "layer.layer_pos, layer.layer_parent, layer.fkey_wms_id, ";
	$sql_select .= "layer.layer_name, layer.layer_queryable, layer.layer_dataurl, layer.layer_metadataurl, ";
	$sql_select .= "wms.wms_id, wms.wms_owsproxy, wms.wms_getmap, wms.wms_version, wms.wms_title, wms.wms_abstract ";
	$sql_select .= "FROM layer, wms ";
	$sql_where = "WHERE layer.fkey_wms_id = wms.wms_id AND layer.layer_id = $1 LIMIT 1";
	$v = array($param[$i]);
	$t = array('i');
	$res = db_prep_query($sql_select . $sql_where,$v,$t);
	$row = db_fetch_array($res);
	$temp_wms_id = $row['fkey_wms_id']; 
	
	// if the layer is the root layer, also load the child layers
	if ($row['layer_pos'] == "0" && $row['layer_parent'] == "") {
		$e = new mb_notice("merge_layers: layer ". $param[$i] . " is a root layer, loading child layers...");

		$sql_where = "WHERE ";
		$sql_where .= "layer.fkey_wms_id = wms.wms_id AND layer.fkey_wms_id = $1 AND ";
		$sql_where .= "layer.layer_pos NOT IN ('0')";
		$v = array($temp_wms_id);
		$t = array('i');
		$res = db_prep_query($sql_select . $sql_where, $v, $t);
		while($row = db_fetch_array($res)){
			if ($adm->getLayerPermission($temp_wms_id, $row['layer_name'], $_SESSION['mb_user_id'])) { 
				$new_layers[count($new_layers)] = getLayerPropertiesFromResult($row);
			} 
			else {
				echo "alert('layer " .$row['layer_name'] . ": permission denied');";
			} 
		}		
	}
	// if the layer is a child layer...
	else {
		$e = new mb_notice("merge_layers: layer ". $param[$i] . " is a child layer.");
		
		// check permission and add to list
		if ($adm->getLayerPermission($temp_wms_id, $row['layer_name'], $_SESSION['mb_user_id'])) { 
			$new_layers[count($new_layers)] = getLayerPropertiesFromResult($row);
			//Set parent to "0" because original parent will not be loaded
			$new_layers[count($new_layers)-1]['layer_parent']="0";
		}
		else {
			echo "alert('layer " .$row['layer_name'] . ": permission denied');";
		}
		
		//look for childlayers
		$sql_select = "SELECT ";
		$sql_select .= "layer_id, layer_title, layer_minscale, layer_maxscale, ";
		$sql_select .= "layer_pos, layer_parent, fkey_wms_id, ";
		$sql_select .= "layer_name, layer_queryable, layer_dataurl, layer_metadataurl, ";
		$sql_select .= "wms.wms_id, wms.wms_owsproxy, wms.wms_getmap, wms.wms_version, wms.wms_title, wms.wms_abstract ";
		$sql_select .= "FROM getSublayer($1, $2), wms ";
		$sql_where = "WHERE fkey_wms_id = wms.wms_id";
		$v = array($temp_wms_id,$row['layer_pos']);
		$t = array('i','s');
		$res = db_prep_query($sql_select . $sql_where, $v, $t);
		
		while($row = db_fetch_array($res)){
			if ($adm->getLayerPermission($temp_wms_id, $row['layer_name'], $_SESSION['mb_user_id'])) { 
				$new_layers[count($new_layers)] = getLayerPropertiesFromResult($row);
			} 
			else {
				echo "alert('layer " .$row['layer_name'] . ": permission denied');";
			} 
		}	
	}

}
if (count($new_layers) > 0) {
	for ($i=0; $i < count($new_layers); $i++) {
		$e = new mb_notice("merge_layers: adding layer " . $new_layers[$i]['id'] . " to WMC...");
		$exists = false;
		$allnodes = $doc->getElementsByTagName('Layer');
		foreach ($allnodes as $node) {
	
			if ($exists == FALSE) {
			    $children = $node->childNodes;
				foreach($children as $child) {
					if (strtoupper($child->nodeName) == "SERVER") {
						$grandchildren = $child->childNodes;
						foreach($grandchildren as $grandchild) { 
							if (strtoupper($grandchild->nodeName) == "ONLINERESOURCE") {
			 					$wms_getmap = $grandchild->getAttribute('href');
							}
						}
					}
					if (strtoupper($child->nodeName) == "NAME") {
						$layername = $child->nodeValue;
					}
				}
				if ($new_layers[$i]['name'] == $layername && $new_layers[$i]['wms_getmap'] == $wms_getmap) {
					$exists = TRUE;

					//modify layer
					$node->setAttribute('hidden', '0');
				}
			}
		}
		if ($exists == false) {
			// create new layer subtree
			$e_layer = $doc->createElement('Layer');
			$e_layer->setAttribute('hidden', '0');
			$e_layer->setAttribute('queryable', $new_layers[$i]['queryable']);
			
			// Name and title
			$e_name = $doc->createElement('Name', $new_layers[$i]['name']);
			$e_title = $doc->createElement('Title', $new_layers[$i]['title']);
			$e_abstract = $doc->createElement('Abstract', $new_layers[$i]['abstract']);
			$e_layer->appendChild($e_name);
			$e_layer->appendChild($e_title);
			$e_layer->appendChild($e_abstract);
				
			// WMS OnlineResource
			$e_server = $doc->createElement('Server');
			$e_server->setAttribute('service', 'OGC:WMS');
			$e_server->setAttribute('title', $new_layers[$i]['wms_title']);
			$e_server->setAttribute('version', $new_layers[$i]['wms_version']);
			$e_server_onlineres = $doc->createElement('OnlineResource');
			$e_server_onlineres->setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', $new_layers[$i]['wms_getmap']);
			$e_server_onlineres->setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:type', 'simple');
			$e_server->appendChild($e_server_onlineres);
			$e_layer->appendChild($e_server);

			// SRS
			$e_srs = $doc->createElement('SRS', $new_layers[$i]['epsg']);
			$e_layer->appendChild($e_srs);

			// DataURL
			$e_dataurl = $doc->createElement('DataURL');
			$e_dataurl_onlineres = $doc->createElement('OnlineResource');
			$e_dataurl_onlineres->setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', $new_layers[$i]['dataurl']);
			$e_dataurl_onlineres->setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:type', 'simple');
			$e_dataurl->appendChild($e_dataurl_onlineres);
			$e_layer->appendChild($e_dataurl);

			// MetadataURL
			$e_metadataurl = $doc->createElement('MetadataURL');
			$e_metadataurl_onlineres = $doc->createElement('OnlineResource');
			$e_metadataurl_onlineres->setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', $new_layers[$i]['metadataurl']);
			$e_metadataurl_onlineres->setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:type', 'simple');
			$e_metadataurl->appendChild($e_metadataurl_onlineres);
			$e_layer->appendChild($e_metadataurl);
				
			$e_extension = $doc->createElement('Extension');
			
			// ScaleHint
			$e_scalehint = $doc->createElement('mapbender:ScaleHint');			
			$e_scalehint->setAttribute('min', $new_layers[$i]['minscale']);
			$e_scalehint->setAttribute('max', $new_layers[$i]['maxscale']);
			$e_extension->appendChild($e_scalehint);

			// Layerid
			$e_layer_id = $doc->createElement('mapbender:layer_id', $new_layers[$i]['id']);			
			$e_extension->appendChild($e_layer_id);

			// WMS id
			$e_wms_id = $doc->createElement('mapbender:wms_id', $new_layers[$i]['wms_id']);			
			$e_extension->appendChild($e_wms_id);

			//Structure
			//Layer_pos
			$e_layer_pos = $doc->createElement("mapbender:layer_pos", $new_layers[$i]['layer_pos']);
			$e_extension->appendChild($e_layer_pos);
		
			//Layer_parent
			$e_layer_parent = $doc->createElement("mapbender:layer_parent", $new_layers[$i]['layer_parent']);
			$e_extension->appendChild($e_layer_parent);
			
			$e_layer->appendChild($e_extension);
				
			// FormatList
			$e_formatlist = $doc->createElement('FormatList');
			$current = false;
			$cnt = 0;
			foreach ($new_layers[$i]['format'] as $f) {
				$cnt++;
				$e_formatlist_format = $doc->createElement('Format', $f);
				if ($current == false && ($f == "image/png" || count($new_layers[$i]['format']) == $cnt)) {
					$current = true;
					$e_formatlist_format->setAttribute('current', 1);
				}
				$e_formatlist->appendChild($e_formatlist_format);
			}
			$e_layer->appendChild($e_formatlist);
			
			// StyleList
			$e_stylelist = $doc->createElement('StyleList');
			$current = 1;
			foreach ($new_layers[$i]['style'] as $s) {
				$e_stylelist_style = $doc->createElement('Style');
				$e_stylelist_style->setAttribute('current', $current);
				$current = 0;
				
				// Style name and title
				$e_style_name = $doc->createElement('Name', $s['name']);
				$e_style_title = $doc->createElement('Title', $s['title']);
				$e_stylelist_style->appendChild($e_style_name);
				$e_stylelist_style->appendChild($e_style_title);
					
				// Style LegendURL
				$e_style_legendurl = $doc->createElement('LegendUrl');
				$e_style_legendurl->setAttribute('width', '');
				$e_style_legendurl->setAttribute('height', '');
				$e_style_legendurl->setAttribute('format', $s['legendurlformat']);
				$e_style_legendurl_onlineres = $doc->createElement('OnlineResource');
				$e_style_legendurl_onlineres->setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', $s['legendurl']);
				$e_style_legendurl_onlineres->setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:type', 'simple');
				$e_style_legendurl->appendChild($e_style_legendurl_onlineres);
				$e_stylelist_style->appendChild($e_style_legendurl);
				$e_stylelist->appendChild($e_stylelist_style);
			}
			$e_layer->appendChild($e_stylelist);
				
			//append to layerlist
			$layerlist_tags = $doc->getElementsByTagName('LayerList');
			foreach ($layerlist_tags as $tags) {
				$tags->appendChild($e_layer);
			}
		}
	}
	
	// count how often a layer has been loaded
	$monitor = new Layer_load_count();
	for ($i = 0; $i < count($new_layers); $i++) {
		$monitor->increment($new_layers[$i]['id']);
	}	
	
	// if "zoom to layer" is selected
	if ($_REQUEST["zoomToLayer"]) {
		
		// determine the bbox of the WMC by unifying all layer BBoxes
		$bboxArray = array();
		for ($i=0; $i < count($new_layers); $i++) {
			array_push($bboxArray, getBBox($new_layers[$i]['id'], $wmc_srs));
			$e = new mb_notice("merge_layers: zoom to layer: " . $new_layers[$i]['id']);
		}
		$newbox = Mapbender_bbox::union($bboxArray);
		$e = new mb_notice("merge_layers: new box after union: [" . $newbox->min->x . "," . $newbox->min->y . " " . $newbox->max->x . "," . $newbox->max->y . " " . $newbox->epsg . "]");
	
	
	#	$e = new mb_exception("newbox: " . $newbox->toString());
		// set the bbox (meaning: zoom to layer)
		if ($newbox != null) {
			$allnodes = $doc->getElementsByTagName('BoundingBox');
			foreach ($allnodes as $node) {
				$node->setAttribute('SRS', "EPSG:31466");
				$node->setAttribute('minx', $newbox->min->x);
				$node->setAttribute('miny', $newbox->min->y);
				$node->setAttribute('maxx', $newbox->max->x);
				$node->setAttribute('maxy', $newbox->max->y);
			}	
		}
	}
	$_SESSION['mb_wmc'] = $doc->saveXML();
	//print_r($_SESSION);
}
?>
Views
Personal tools