From MapbenderWiki
<?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);
}
?>