[Mapbender-commits] r5489 - trunk/mapbender/http/classes
svn_mapbender at osgeo.org
svn_mapbender at osgeo.org
Tue Feb 9 04:14:10 EST 2010
Author: armin11
Date: 2010-02-09 04:14:10 -0500 (Tue, 09 Feb 2010)
New Revision: 5489
Added:
trunk/mapbender/http/classes/class_metadata_new.php
Log:
new class for metadata searching in the mapbender database (registry) merged from geoportal.rlp
Added: trunk/mapbender/http/classes/class_metadata_new.php
===================================================================
--- trunk/mapbender/http/classes/class_metadata_new.php (rev 0)
+++ trunk/mapbender/http/classes/class_metadata_new.php 2010-02-09 09:14:10 UTC (rev 5489)
@@ -0,0 +1,1158 @@
+<?php
+#Script to call this class: http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php
+#Class for getting results out of the mapbender service registry
+#Resulttypes: WMS, WMS-Layer, (WFS), WFS-Featurtyps, WFS-Conf, WMC, GeoRSS-Feeds, ...
+#Possible filters: registrating organizations, time, bbox (fully inside, intersects, fully outside), ISO Topic Categories, INSPIRE themes, INSPIRE: keywords, classification of data/service ... - maybe relevant for the german broker not for one instance, quality and actuality (maybe spatial and temporal), bbox, deegree of conformity with ir, access and use constraints, responsible parties - maybe one is enough? We must have a look at the INSPIRE Metadata IR
+#Metadata we need to fullfil the demands of INSPIRE:
+#1. INSPIRE conformity classification for WMS/WFS/WCS
+#2. Temporal Extents at WMS/WMS-Layer/WFS/WFS-Featuretype levels - for datasets if demanded - til now there is no demand defined in the guidance-paper for metadata ir
+#3. Classified access and use contraints - which classes? - Check IR Data Sharing and IR Metadata
+#4.
+#Every ressource which should be send to INSPIRE can be filtered - but is not neccessary for a standardized approach
+#Another problem is the ranking of the different ressources. The ranking should be homogeneus.
+#Till now we rank the using of WMS Layers when Caps are requested and when s.o. load one layer into the geoportal.
+#The same things have to be done for the wfs-conf, wmc and georssfeeds
+#The searching for metadata should be parallel done. We need different classes for doing the search. They should be requested by one central class (class_metadata.php).
+#Classes for filtering after the results have been send to the portal:
+#1. ISO Topic Categories
+#2. INSPIRE Themes
+#3. Access and use classification
+#4. departments which provides the ressources - we need the new concept for the administration of this departments - store the addresses in the group table and give the relation - originating group in table mb_user_mb_group
+#Cause we have a authorization layer, we need the id of the requesting user which is defined in the session. If no session is set, it should be the anonymous user of the portal.
+#We need a parameter for internationalization - it should be send with the search request! Some of the Classes can be provided with different languages.
+#WMC and GeoRSS-Feeds have no or a to complex authorization info - maybe we need to test if wmc consists of info which is fully or only partually available to the anonymous user.
+
+require_once(dirname(__FILE__)."/../../conf/mapbender.conf");
+require_once(dirname(__FILE__)."/class_administration.php");
+require_once(dirname(__FILE__)."/class_mb_exception.php");
+require_once(dirname(__FILE__)."/class_json.php");
+
+//definition for the things which are common to all kind of metadata ressources
+
+class searchMetadata {
+ var $userId;
+ var $searchId;
+ var $searchText;
+ var $registratingDepartments;
+ var $isoCategories;
+ var $inspireThemes;
+ var $customCategories;
+ var $timeBegin;
+ var $timeEnd;
+ var $regTimeBegin;
+ var $regTimeEnd;
+ var $maxResults;
+ var $searchBbox;
+ var $searchTypeBbox;
+ var $accessRestrictions;
+ var $languageCode;
+ var $searchStartTime;
+ var $searchView;
+ var $searchURL;
+ var $searchEPSG;
+ var $searchResources;
+ var $searchPages;
+ var $outputFormat;
+ var $resultTarget;
+ var $tempFolder;
+ var $orderBy;
+
+ function __construct($userId, $searchId, $searchText, $registratingDepartments, $isoCategories, $inspireThemes, $timeBegin, $timeEnd, $regTimeBegin, $regTimeEnd, $maxResults, $searchBbox, $searchTypeBbox, $accessRestrictions, $languageCode, $searchEPSG, $searchResources, $searchPages, $outputFormat, $resultTarget, $searchURL, $customCategories){
+ $this->userId = (integer)$userId;
+ $this->searchId = $searchId;
+ $this->searchText = $searchText;
+ $this->registratingDepartments = $registratingDepartments; //array with ids of the registrating groups in the mb database
+ $this->registratingDepartmentsArray = explode(",",$this->registratingDepartments);
+ $this->isoCategories = $isoCategories;
+ $this->inspireThemes = $inspireThemes;
+ $this->customCategories = $customCategories;
+ $this->timeBegin = $timeBegin;
+ $this->timeEnd = $timeEnd;
+ $this->regTimeBegin = $regTimeBegin;
+ $this->regTimeEnd = $regTimeEnd;
+ $this->maxResults = (integer)$maxResults;
+ $this->searchBbox = $searchBbox;
+ $this->searchTypeBbox = $searchTypeBbox;
+ $this->accessRestrictions = $accessRestrictions;
+ $this->languageCode = $languageCode;
+ $this->searchEPSG = $searchEPSG;
+ $this->searchResources = $searchResources;
+ $this->searchPages = $searchPages;
+ $this->outputFormat = $outputFormat;
+ $this->resultTarget = $resultTarget;
+ $this->searchURL = $searchURL;
+ $this->tempFolder = "/tmp"; //TODO define another path - maybe the one which is given in mapbender.conf
+ if ($this->outputFormat == 'json'){
+ $this->json = new Mapbender_JSON;
+ }
+ //set a time to find time consumers
+ $this->searchStartTime = $this->microtime_float();
+ //Defining of the different database categories
+ $this->resourceClassifications = array();
+ $this->resourceClassifications[0]['title'] = "ISO 19115"; //TODO: define the translations somewhere? - This is done in call_metadata.php before. Maybe we can get them from there? - It will be shown in the rightside categories table
+ $this->resourceClassifications[0]['tablename'] = 'md_topic_category';
+ $this->resourceClassifications[0]['requestName'] = 'isoCategories';
+ $this->resourceClassifications[0]['id_wms'] = 'layer_id';
+ $this->resourceClassifications[0]['id_wfs'] = 'featuretype_id';
+ $this->resourceClassifications[0]['relation_wms'] = 'layer_md_topic_category';
+ $this->resourceClassifications[0]['relation_wfs'] = 'featuretype_md_topic_category';//TODO: define this in mapbender
+
+ $this->resourceClassifications[1]['title'] = "INSPIRE"; //TODO: define the translations somewhere? - This is done in call_metadata.php before. Maybe we can get them from there? - It will be shown in the rightside categories table
+ $this->resourceClassifications[1]['tablename'] = 'inspire_category';
+ $this->resourceClassifications[1]['requestName'] = 'inspireThemes';
+ $this->resourceClassifications[1]['id_wms'] = 'layer_id';
+ $this->resourceClassifications[1]['id_wfs'] = 'featuretype_id';
+ $this->resourceClassifications[1]['relation_wms'] = 'layer_inspire_category';
+ $this->resourceClassifications[1]['relation_wfs'] = 'featuretype_inspire_category';//TODO: define this in mapbender
+
+ $this->resourceClassifications[2]['title'] = "Custom"; //TODO: define the translations somewhere? - This is done in call_metadata.php before. Maybe we can get them from there? - It will be shown in the rightside categories table
+ $this->resourceClassifications[2]['tablename'] = 'custom_category';
+ $this->resourceClassifications[2]['requestName'] = 'customCategories';
+ $this->resourceClassifications[2]['id_wms'] = 'layer_id';
+ $this->resourceClassifications[2]['id_wfs'] = 'featuretype_id';
+ $this->resourceClassifications[2]['relation_wms'] = 'layer_custom_category';
+ $this->resourceClassifications[2]['relation_wfs'] = 'featuretype_custom_category';//TODO: define this in mapbender
+
+
+
+
+
+
+
+ //Defining of the different result categories
+ $this->resourceCategories = array();
+ $this->resourceCategories[0]['name'] = 'WMS';
+ $this->resourceCategories[1]['name'] = 'WFS';
+ $this->resourceCategories[2]['name'] = 'WMC';
+ $this->resourceCategories[3]['name'] = 'GeoRSS';
+ switch($this->languageCode){
+ case 'de':
+ $this->resourceCategories[0]['name2show'] = 'Darstellungsdienste';
+ $this->resourceCategories[1]['name2show'] = 'Such- und Downloaddienste';
+ $this->resourceCategories[2]['name2show'] = 'Kartenzusammenstellungen';
+ $this->resourceCategories[3]['name2show'] = 'Geokodierte Newsfeeds';
+ break;
+ case 'en':
+ $this->resourceCategories[0]['name2show'] = 'Viewingservices';
+ $this->resourceCategories[1]['name2show'] = 'Search- and Downloadservices';
+ $this->resourceCategories[2]['name2show'] = 'Combined Maps';
+ $this->resourceCategories[3]['name2show'] = 'Geocodet Newsfeeds';
+ break;
+ case 'fr':
+ $this->resourceCategories[0]['name2show'] = 'Viewingservices';
+ $this->resourceCategories[1]['name2show'] = 'Search- and Downloadservices';
+ $this->resourceCategories[2]['name2show'] = 'Combined Maps';
+ $this->resourceCategories[3]['name2show'] = 'Geocodet Newsfeeds';
+ break;
+ default:
+ $this->resourceCategories[0]['name2show'] = 'Darstellungsdienste';
+ $this->resourceCategories[1]['name2show'] = 'Such- und Downloaddienste';
+ $this->resourceCategories[2]['name2show'] = 'Kartenzusammenstellungen';
+ $this->resourceCategories[3]['name2show'] = 'Geokodierte Newsfeeds';
+ }
+ //not needed til now - maybe usefull for georss output
+ if ($this->outputFormat == "xml") {
+ //Initialize XML documents
+ if (isset($this->searchResources) & strtolower($this->searchResources) === "wms") {
+ $this->wmsDoc = new DOMDocument('1.0');
+ }
+ if (isset($this->searchResources) & strtolower($this->searchResources) === "wfs") {
+ $this->wfsDoc = new DOMDocument('1.0');
+ $this->generateWFSMetadata($this->wfsDoc);
+ }
+ if (isset($this->searchResources) & strtolower($this->searchResources) === "wmc") {
+ $this->wmcDoc = new DOMDocument('1.0');
+ }
+ if (isset($this->searchResources) & strtolower($this->searchResources) === "georss") {
+ $this->georssDoc = new DOMDocument('1.0');
+ }
+ }
+
+ if ($this->outputFormat === "json") {
+ if (isset($this->searchResources) & strtolower($this->searchResources) === "wfs") {
+ $this->searchView = 'search_wfs_view';
+ $this->orderBy = " ORDER BY wfs_id,featuretype_id,wfs_conf_id ";
+ $this->resourceClasses = NULL;
+ $this->generateWFSMetadata($this->wfsDoc);
+ }
+ if (isset($this->searchResources) & strtolower($this->searchResources) === "wms") {
+ $this->searchView = 'wms_search_table_test';
+ $this->orderBy = " ORDER BY load_count DESC";
+ $this->resourceClasses = array(0,1,2);
+ $this->generateWMSMetadata($this->wmsDoc);
+ }
+ }
+
+ }
+
+ private function microtime_float() {
+ list($usec, $sec) = explode(" ", microtime());
+ return ((float)$usec + (float)$sec);
+ }
+ private function generateXMLHead($xmlDoc) {
+ $xmlDoc->encoding = CHARSET;
+ $result = $xmlDoc->createElement("result");
+ $xmlDoc->appendChild($result);
+ //Result Count
+ $overLimit = $xmlDoc->createElement("overLimit");
+ $result->appendChild($overLimit);
+ //$tr_text = $xmlDoc->createTextNode($this->isOverLimit);
+ $tr_text = $xmlDoc->createTextNode("really?");
+ $overLimit->appendChild($tr_text);
+ $rd = $xmlDoc->createElement("redirect");
+ $result->appendChild($rd);
+ $trd = $xmlDoc->createTextNode("not yet ready...");
+ $rd->appendChild($trd);
+ }
+ private function generateXMLFoot($xmlDoc){
+ $results = $xmlDoc->getElementsByTagName("result");
+ foreach ($results as $result) {
+ $result->appendChild($ready);
+ }
+ }
+ private function flipDiagonally($arr) {
+ $out = array();
+ foreach ($arr as $key => $subarr) {
+ foreach ($subarr as $subkey => $subvalue) {
+ $out[$subkey][$key] = $subvalue;
+ }
+ }
+ return $out;
+ }
+
+ private function generateWFSMetadataJSON($res, $n) {
+ //initialize object
+ $this->wfsJSON = new stdClass;
+ $this->wfsJSON->wfs = (object) array(
+ 'md' => (object) array(
+ 'nresults' => $n,
+ 'p' => $this->searchPages,
+ 'rpp' => $this->maxResults
+ ),
+ 'srv' => array()
+ );
+
+ //read out records
+ $serverCount = 0;
+ $wfsMatrix = db_fetch_all($res);
+ //sort result for accessing the right services
+ $wfsMatrix = $this->flipDiagonally($wfsMatrix);
+ //TODO check if order by db or order by php is faster!
+ #array_multisort($wfsMatrix['wfs_id'], SORT_ASC,$wfsMatrix['featuretype_id'], SORT_ASC,$wfsMatrix['wfs_conf_id'], SORT_ASC); //have some problems - the database version is more stable
+ #print_r($wfsMatrix);
+ $wfsMatrix = $this->flipDiagonally($wfsMatrix);
+ //read out first server entry - maybe this a little bit timeconsuming TODO
+ $j = 0; //count identical wfs_id => double featuretype
+ $l = 0; //index featuretype and or modul per wfs
+ $m = 0; //index modul per featuretype
+ for($i=0; $i<count($wfsMatrix);$i++){
+ $this->wfsJSON->wfs->srv[$i-$j]->id = $wfsMatrix[$i]['wfs_id'];
+ $this->wfsJSON->wfs->srv[$i-$j]->title = $wfsMatrix[$i]['wfs_title'];
+ $this->wfsJSON->wfs->srv[$i-$j]->abstract = $wfsMatrix[$i]['wfs_abstract'];
+ $this->wfsJSON->wfs->srv[$i-$j]->date = date("d.m.Y",$wfsMatrix[$i]['wfs_timestamp']);
+ $this->wfsJSON->wfs->srv[$i-$j]->respOrg = $wfsMatrix[$i]['mb_group_name'];
+ $this->wfsJSON->wfs->srv[$i-$j]->mdLink = $_SERVER['HOSTNAME']."/mapbender/x_geoportal/showWFSMetadata.php?id=".$wfsMatrix[$i]['wfs_id'];
+ $spatialSource = "";
+ $stateOrProvince = $wfsMatrix[$i]['administrativearea'];
+ if ($stateOrProvince == "NULL" || $stateOrProvince == "") {
+ $spatialSource = $wfsMatrix[$i]['country'];
+ } else {
+ $spatialSource = $wfsMatrix[$i]['administrativearea'];
+ }
+ $this->wfsJSON->wfs->srv[$i-$j]->iso3166 = $spatialSource;
+ $this->wfsJSON->wfs->srv[$i-$j]->respOrg = $wfsMatrix[$i]['mb_group_name'];
+ $this->wfsJSON->wfs->srv[$i-$j]->tou = $wfsMatrix[$i]['termsofuse'];
+ //TODO check the field accessconstraints - which should be presented?
+ $this->wfsJSON->wfs->srv[$i-$j]->status = NULL; //$wfsMatrix[$i][''];
+ $this->wfsJSON->wfs->srv[$i-$j]->avail = NULL; //$wfsMatrix[$i][''];
+ $this->wfsJSON->wfs->srv[$i-$j]->logged = NULL; //$wfsMatrix[$i][''];
+ $this->wfsJSON->wfs->srv[$i-$j]->price = NULL; //$wfsMatrix[$i][''];
+ $this->wfsJSON->wfs->srv[$i-$j]->nwaccess = NULL; //$wfsMatrix[$i][''];
+ $this->wfsJSON->wfs->srv[$i-$j]->bbox = array(-180.0,-90.0,180.0,90.0); //$wfsMatrix[$i][''];
+ //if featuretype hasn't been created - do it
+ if (!isset($this->wfsJSON->wfs->srv[$i-$j]->ftype)) {
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype = array();
+ }
+ //fill in featuretype infos
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->id = $wfsMatrix[$i]['featuretype_id'];
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->title = $wfsMatrix[$i]['featuretype_title'];
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->abstract = $wfsMatrix[$i]['featuretype_abstract'];
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->mdLink = $_SERVER['HOST']."/mapbender/x_geoportal/showWFeatureTypeMetadata.php?id=".$wfsMatrix[$i]['featuretype_id'];
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->geomtype = $wfsMatrix[$i]['element_type'];
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->bbox = array(-180.0,-90.0,180.0,90.0);//TODO: $wfsMatrix[$i]['bbox'];
+ //fill in categories
+ if (!isset($this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat)) {
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat = array();
+ }
+ if (isset($wfsMatrix[$i]['iso_categories'])) {
+ }
+ //if (isset($wfsMatrix[$i]['inspire_category'])) {
+ //TODO write the categories as JSON into Database!
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat[0]->type = 'INSPIRE Kategorie';
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat[0]->value = 'Umwelt';
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat[0]->symbol = 'umwelt.png';
+ //}
+ if (isset($wfsMatrix[$i]['custom_categories'])) {
+ }
+ //if modul hasn't been created - do it
+ if (!isset($this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul)) {
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul = array();
+ }
+ //fill in modul infos
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->id = $wfsMatrix[$i]['wfs_conf_id'];
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->title = $wfsMatrix[$i]['wfs_conf_description'];
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->abstract = $wfsMatrix[$i]['wfs_conf_abstract'];
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->type = $wfsMatrix[$i]['modultype'];
+ $equalEPSG = $wfsMatrix[$i]['featuretype_srs'];
+ $isEqual = "true";
+ //control if EPSG is supported by Client
+ if ($equalEPSG == $this->searchEPSG){
+ $isEqual = "false";
+ }
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->srsProblem = $isEqual;
+ //generate Link to show metadata
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->mdLink = $_SERVER['HOST']."/mapbender/x_geoportal/showWFSConfMetadata.php?id=".$wfsMatrix[$i]['wfs_conf_id'];
+ $perText = $this->getPermissionValueForWFS($wfsMatrix[$i]['wfs_id'], $wfsMatrix[$i]['wfs_conf_id']);
+ $this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->permission = $perText;
+ if ($wfsMatrix[$i]['wfs_id'] == $wfsMatrix[$i+1]['wfs_id']){
+ $j++; //next record is the same service
+ $l++;
+ }
+ else
+ {
+ $l = 0;
+ }
+
+ if ($wfsMatrix[$i]['featuretype_id'] == $wfsMatrix[$i+1]['featuretype_id']){
+ $m++;
+ }
+ else
+ {
+ $m = 0;
+ }
+ }
+
+ }
+ private function generateWMSMetadataJSON($res, $n) {
+ //initialize object
+ $this->wmsJSON = new stdClass;
+ $this->wmsJSON->wms = (object) array(
+ 'md' => (object) array(
+ 'nresults' => $n,
+ 'p' => $this->searchPages,
+ 'rpp' => $this->maxResults
+ ),
+ 'srv' => array()
+ );
+ //read out records
+ $serverCount = 0;
+ $wmsMatrix = db_fetch_all($res);
+ $layerIdArray = array();
+ //read out array with unique wms_ids in wmsMatrix
+ $wmsIdArray = array();
+ //initialize root layer id;
+ $rootLayerId = -1;
+ $j = 0;
+ #$countWmsMatrix = count($wmsMatrix);
+ #echo $countWmsMatrix;
+ if ($n != 0) {
+ for($i=0; $i<count($wmsMatrix);$i++){
+ $layerID = $wmsMatrix[$i]['layer_id'];
+ #echo "<br>LayerID: ".$layerID."<br>";
+ $wmsID = $wmsMatrix[$i]['wms_id'];
+ if (!in_array($layerID, $layerIdArray) or !in_array($rootLayerId, $layerIdArray)) {
+ //Select all layers of with this wms_id into new array per WMS - the grouping should be done by wms!
+ $subLayers = $this->filter_by_value($wmsMatrix, 'wms_id', $wmsID);
+ #echo "<br>Sublayers: <br>";
+ #print_r($subLayers);
+ //Sort array by load_count - problem: maybe there are some groups between where count is to low (they have no load count because you cannot load them by name)? - Therefor we need some ideas - or pull them out of the database and show them greyed out. Another way will be to define a new group (or wms with the same id) for those layers which are more than one integer away from their parents
+ $subLayersFlip = $this->flipDiagonally($subLayers);
+ #var_dump($subLayers['layer_pos']);
+ #$subLayers = $this->flipDiagonally($subLayers);
+ //go backwards through the layerTree to get the layer with the highest position without gaps in between
+ #var_dump($subLayers['layer_id']);
+ #echo "<br>";
+ $index = array_search($layerID, $subLayersFlip['layer_id']);
+ #echo "<br>found layer_id= ".$layerID." at index: ".$index." in sublayerstable<br>";
+ $rootIndex = $this->getLayerParent($subLayersFlip, $index);
+ $rootLayerPos = $subLayers[$rootIndex]['layer_pos'];
+ $rootLayerId = $subLayers[$rootIndex]['layer_id'];
+ #echo "<br>LayerId:<br>";
+ #echo "<br>".$layerID."<br>";
+ #echo "<br>rootLayerPos:<br>";
+ #echo "<br>".$rootLayerPos."<br>";
+ #echo "<br>rootLayerId:<br>";
+ #echo "<br>".$rootLayerId."<br>";
+ //push root layer id in array
+ array_push($layerIdArray, $rootLayerId);
+ #echo "<br>root Layer ID: ".$rootLayerId."<br>";
+ #array_multisort($subLayers['layer_pos'], SORT_ASC);
+ #print_r($subLayers);
+ #$subLayers = $this->flipDiagonally($subLayers);
+ #print_r("<br>rootIndex: ".$rootIndex."<br>");
+ //Create object for wms service level
+ $this->wmsJSON->wms->srv[$i-$j]->id = $subLayers[$rootIndex]['wms_id'];
+ $this->wmsJSON->wms->srv[$i-$j]->title = $subLayers[$rootIndex]['wms_title'];
+ $this->wmsJSON->wms->srv[$i-$j]->abstract = $subLayers[$rootIndex]['wms_abstract'];
+ $this->wmsJSON->wms->srv[$i-$j]->date = date("d.m.Y",$subLayers[$rootIndex]['wms_timestamp']);
+ $this->wmsJSON->wms->srv[$i-$j]->respOrg = $subLayers[$rootIndex]['mb_group_name'];
+ $this->wmsJSON->wms->srv[$i-$j]->loadCount = $subLayers[$rootIndex]['load_count'];
+ $this->wmsJSON->wms->srv[$i-$j]->mdLink = $_SERVER['HOSTNAME']."/mapbender/x_geoportal/mod_layerMetadata.php?id=".$rootLayerId;
+ $spatialSource = "";
+ $stateOrProvince = $wmsMatrix[$i]['administrativearea'];
+ if ($stateOrProvince == "NULL" || $stateOrProvince == "") {
+ $spatialSource = $wmsMatrix[$i]['country'];
+ } else {
+ $spatialSource = $wmsMatrix[$i]['administrativearea'];
+ }
+ $this->wmsJSON->wms->srv[$i-$j]->iso3166 = $spatialSource;
+ $this->wmsJSON->wms->srv[$i-$j]->respOrg = $subLayers[$rootIndex]['mb_group_name'];
+ $this->wmsJSON->wms->srv[$i-$j]->tou = $subLayers[$rootIndex]['termsofuse'];
+ //TODO check the field accessconstraints - which should be presented?
+ $this->wmsJSON->wms->srv[$i-$j]->status = $subLayers[$rootIndex]['status']; //$wmsMatrix[$i][''];
+ $this->wmsJSON->wms->srv[$i-$j]->avail = $subLayers[$rootIndex]['availability']; //$wmsMatrix[$i][''];
+ $this->wmsJSON->wms->srv[$i-$j]->logged = NULL; //$wmsMatrix[$i][''];
+ $this->wmsJSON->wms->srv[$i-$j]->price = NULL; //$wmsMatrix[$i][''];
+ $this->wmsJSON->wms->srv[$i-$j]->nwaccess = NULL; //$wmsMatrix[$i][''];
+ $this->wmsJSON->wms->srv[$i-$j]->bbox = $subLayers[$rootIndex]['bbox']; //$wmsMatrix[$i][''];
+ //Call recursively the child elements, give and pull $layerIdArray to push the done elements in the array to avoid double results
+ #print_r($subLayers);
+ //generate the layer-entry for the so called root layer
+ $this->wmsJSON->wms->srv[$i-$j]->layer = array();
+ $this->wmsJSON->wms->srv[$i-$j]->layer[0]->id = $subLayers[$rootIndex]['layer_id'];
+ $this->wmsJSON->wms->srv[$i-$j]->layer[0]->title = $subLayers[$rootIndex]['layer_title'];
+ $this->wmsJSON->wms->srv[$i-$j]->layer[0]->abstract = $subLayers[$rootIndex]['layer_abstract'];
+ if ($subLayers[$rootIndex]['layer_name'] == ''){
+ $this->wmsJSON->wms->srv[$i-$j]->layer[0]->loadable = 0;
+ }
+ else {
+ $this->wmsJSON->wms->srv[$i-$j]->layer[0]->loadable = 1;
+ }
+ #if ($subLayers[$rootIndex]['layer_name'] == ''){
+ # $this->wmsJSON->wms->srv[$i-$j]->layer[0]->loadable = 0;
+ #}
+ #else {
+ # $this->wmsJSON->wms->srv[$i-$j]->layer[0]->loadable = 1;
+ #}
+ $this->wmsJSON->wms->srv[$i-$j]->layer[0]->loadCount = $subLayers[$rootIndex]['load_count'];
+ #$servObject->layer[$countsublayer]->mdLink = $_SERVER['HOST']."/mapbender/x_geoportal/showWFeatureTypeMetadata.php?id=".$wfsMatrix[$i]['featuretype_id'];
+ #$servObject->layer[$countsublayer]->geomtype = $wfsMatrix[$i]['element_type'];
+ $this->wmsJSON->wms->srv[$i-$j]->layer[0]->bbox = $subLayers[$rootIndex]['bbox'];
+ $this->wmsJSON->wms->srv[$i-$j]->layer[0]->permission = $this->getPermissionValueForLayer($subLayers[$rootIndex]['wms_id'], $subLayers[$rootIndex]['layer_id']);
+ $layerIdArray = $this->writeWMSChilds($layerIdArray, $rootLayerPos, $subLayers, $i, $j, $this->wmsJSON->wms->srv[$i-$j]->layer[0]);
+ //generate php object - if root layer was found - > layer_parent='' give hint to visualize folder symbol.
+ }
+ }
+ }
+ }
+
+ private function generateWMSMetadata($xmlDoc) {
+ $starttime = $this->microtime_float();
+ list($sql, $v, $t, $n) = $this->generateSearchSQL();
+ //call database search in limits
+ $res = db_prep_query($sql, $v, $t);
+ if ($this->outputFormat == 'json'){
+ //generate json
+ $this->generateWMSMetadataJSON($res,$n);
+ $this->wmsJSON = $this->json->encode($this->wmsJSON);
+ if ($this->resultTarget == 'file') {
+ if($wmsFileHandle = fopen($this->tempFolder."/".$this->searchId."_".$this->searchResources."_".$this->searchPages.".json","w")){
+ fwrite($wmsFileHandle,$this->wfsJSON);
+ fclose($wmsFileHandle);
+ }
+ }
+ if ($this->resultTarget == 'web' or $this->resultTarget == 'debug') {
+ echo $this->wmsJSON;
+ }
+ }
+ $usedTime = $this->microtime_float() - $starttime;
+ $e = new mb_exception("Time to generate WMS-Metadata: ".$usedTime);
+ $e = new mb_exception("Wrote the MD_WMS-File");
+ }
+
+
+
+ private function generateWFSMetadata($xmlDoc) {
+ $starttime = $this->microtime_float();
+ list($sql, $v, $t, $n) = $this->generateSearchSQL();
+ //call database search
+ $res = db_prep_query($sql, $v, $t);
+ if ($this->outputFormat == 'json'){
+ //generate json
+ $this->generateWFSMetadataJSON($res, $n);
+ $this->wfsJSON = $this->json->encode($this->wfsJSON);
+ if ($this->resultTarget == 'file') {
+ if($wfsFileHandle = fopen($this->tempFolder."/".$this->searchId."_".$this->searchResources."_".$this->searchPages.".json","w")){
+ fwrite($wfsFileHandle,$this->wfsJSON);
+ fclose($wfsFileHandle);
+ }
+ }
+ if ($this->resultTarget == 'web'or $this->resultTarget == 'debug') {
+ echo $this->wfsJSON;
+ }
+ }
+ if ($this->outputFormat == 'xml'){
+ //generate xml
+ $this->generateXMLHead($xmlDoc);
+ $this->generateXMLFoot($xmlDoc);
+ $this->generateWFSResultXML($xmlDoc,$res);
+ if ($this->resultTarget == 'file') {
+ if($wfsFileHandleXML = fopen($this->tempFolder."/".$this->searchId."_".$this->searchResources."_".$this->searchPages.".xml","w")){
+ fwrite($wfsFileHandleXML,$xmlDoc->saveXML());
+ fclose($wfsFileHandleXML);
+ }
+ }
+ if ($this->resultTarget == 'web') {
+ header("Content-type: application/xhtml+xml; charset=UTF-8");
+ echo $xmlDoc->saveXML();
+ }
+ }
+ $usedTime = $this->microtime_float() - $starttime;
+ $e = new mb_exception("Time to generate WFS-Metadata: ".$usedTime);
+ $e = new mb_exception("Wrote the MD_WFS-File");
+ }
+ private function replaceChars_all($text){
+ $search = array( "ä", "ö", "ü", "Ä", "Ö", "Ü", "ß");
+ $repWith = array("ae", "oe", "ue", "AE", "OE", "UE", "ss");
+ $replaced = str_replace($search, $repWith, $text);
+ return $replaced;
+ }
+ private function generateSearchSQL() {
+ //elements needed to exist in mb wfs view or table:
+ //1. textfield - all texts - searchText
+ //2. responsible organisations - given id
+ //3. bbox - is not explicit given in the wfs metadata? Since WFS 1.1.0 a latlonbbox is present
+ //4. isoTopicCategory - is not been saved til now
+ //5. ...
+ //parse searchText into different array elements to allow an AND search
+ $searchStringArray = $this->generateSearchStringArray();
+ $v = array();
+ $t = array();
+ $sql = "SELECT * from ".$this->searchView." where ";
+ #$sqlN = "SELECT count(".$this->searchResources."_id) from ".$this->searchView." where ";
+ $whereStr = "";
+ $whereCondArray = array();
+ $isTextSearch = "false";
+ $e = new mb_exception("Number of used searchstrings: ".count($searchStringArray));
+ //textsearch
+ if ($this->searchText != NULL) {
+ for($i=0; $i < count($searchStringArray); $i++){
+ $isTextSearch = "true";
+ if($i>0) {
+ $whereStr .= " AND ";
+ }
+ $whereStr .= "searchtext LIKE $".($i+1);
+ //output for debugging
+ $e = new mb_notice("Part of string".$i.": ".$searchStringArray[$i]);
+ $e = new mb_notice("converted: ".$this->replaceChars_all($searchStringArray[$i]));
+ $va = "%".trim(strtoupper($this->replaceChars_all($searchStringArray[$i])))."%";
+ $e = new mb_notice($this->searchResources." Searchtext in SQL: ".$va);
+ array_push($v,$va);
+ array_push($t,"s");
+ }
+ }
+/* This is only for the later postgis versions. The within and disjoint is to slow, cause there is no usage of the geometrical index in the old versions!
+ //spatial search filter - ist should be the first filter in the where clause, cause it is
+ //
+ if (strtolower($this->searchResources) === "wms" & $this->searchBbox != NULL) {
+ #$spatialFilter = "(the_geom ";
+ #echo "<br> spatial operator: ".$this->searchTypeBbox."<br>";
+ if ($this->searchTypeBbox == 'outside') {
+ $spatialFilter = ' disjoint(';
+ } elseif ($this->searchTypeBbox == 'inside') {
+ $spatialFilter = ' within(';
+ } else {
+ $spatialFilter = ' intersects(';
+ }
+ //define spatial filter
+ if(count(explode(',',$this->searchBbox)) == 4){ //if searchBbox has 4 entries
+
+ $spatialFilterCoords = explode(',',$this->searchBbox);//read out searchBbox
+ //definition of the spatial filter
+ $spatialFilter .= 'GeomFromText(\'POLYGON(('.$spatialFilterCoords[0];//minx
+ $spatialFilter .= ' '.$spatialFilterCoords[1].',';//miny
+ $spatialFilter .= $spatialFilterCoords[0];//minx
+ $spatialFilter .= ' '.$spatialFilterCoords[3].',';//maxy
+ $spatialFilter .= $spatialFilterCoords[2];//maxx
+ $spatialFilter .= ' '.$spatialFilterCoords[3].',';//maxy
+ $spatialFilter .= $spatialFilterCoords[2];//maxx
+ $spatialFilter .= ' '.$spatialFilterCoords[1].',';//miny
+ $spatialFilter .= $spatialFilterCoords[0];//minx
+ $spatialFilter .= ' '.$spatialFilterCoords[1].'))\',4326)';//miny
+ $spatialFilter .= ",the_geom)";
+ array_push($whereCondArray, $spatialFilter);
+ }
+ #array_push($whereCondArray, $spatialFilter);
+ }
+*/
+ //spatial search filter - ist should be the first filter in the where clause, cause it is
+ //
+ if (strtolower($this->searchResources) === "wms" & $this->searchBbox != NULL) {
+ #$spatialFilter = "(the_geom ";
+ #echo "<br> spatial operator: ".$this->searchTypeBbox."<br>";
+ #if ($this->searchTypeBbox == 'outside') {
+ # $spatialFilter = ' disjoint(';
+ #} elseif ($this->searchTypeBbox == 'inside') {
+ # $spatialFilter = ' within(';
+ #} else {
+ # $spatialFilter = ' intersects(';
+ #}
+ $spatialFilter = ' the_geom && ';
+ //define spatial filter
+ if(count(explode(',',$this->searchBbox)) == 4){ //if searchBbox has 4 entries
+
+ $spatialFilterCoords = explode(',',$this->searchBbox);//read out searchBbox
+ //definition of the spatial filter
+ $spatialFilter .= 'GeomFromText(\'POLYGON(('.$spatialFilterCoords[0];//minx
+ $spatialFilter .= ' '.$spatialFilterCoords[1].',';//miny
+ $spatialFilter .= $spatialFilterCoords[0];//minx
+ $spatialFilter .= ' '.$spatialFilterCoords[3].',';//maxy
+ $spatialFilter .= $spatialFilterCoords[2];//maxx
+ $spatialFilter .= ' '.$spatialFilterCoords[3].',';//maxy
+ $spatialFilter .= $spatialFilterCoords[2];//maxx
+ $spatialFilter .= ' '.$spatialFilterCoords[1].',';//miny
+ $spatialFilter .= $spatialFilterCoords[0];//minx
+ $spatialFilter .= ' '.$spatialFilterCoords[1].'))\',4326)';//miny
+ #$spatialFilter .= ",the_geom)";
+ array_push($whereCondArray, $spatialFilter);
+ }
+ #array_push($whereCondArray, $spatialFilter);
+ }
+
+
+
+
+
+ //search filter for md_topic_categories
+ //
+ if (strtolower($this->searchResources) === "wms" & $this->isoCategories != NULL) {
+
+ $isoArray = explode(',',$this->isoCategories);
+ $topicCond = "(";
+ for($i=0; $i < count($isoArray); $i++){
+ if ($i == 0) {
+ $topicCond .= "(md_topic_cats LIKE '%{".$isoArray[$i]."}%') ";
+ } else {
+ $topicCond .= "OR (md_topic_cats LIKE '%{".$isoArray[$i]."}%') ";
+ }
+ }
+ $topicCond .= ")";
+ array_push($whereCondArray, $topicCond);
+ }
+ //search filter for inspire_categories
+ //
+ if (strtolower($this->searchResources) === "wms" & $this->inspireThemes != NULL) {
+
+ $inspireArray = explode(',',$this->inspireThemes);
+ $inspireCond = "(";
+ for($i=0; $i < count($inspireArray); $i++){
+ if ($i == 0) {
+ $inspireCond .= "(md_inspire_cats LIKE '%{".$inspireArray[$i]."}%') ";
+ } else {
+ $inspireCond .= "OR (md_inspire_cats LIKE '%{".$inspireArray[$i]."}%') ";
+ }
+ }
+ $inspireCond .= ")";
+ array_push($whereCondArray, $inspireCond);
+ }
+ //search filter for custom_categories
+ //
+ if (strtolower($this->searchResources) === "wms" & $this->customCategories != NULL) {
+
+ $customArray = explode(',',$this->customCategories);
+ $customCond = "(";
+ for($i=0; $i < count($customArray); $i++){
+ if ($i == 0) {
+ $customCond .= "(md_custom_cats LIKE '%{".$customArray[$i]."}%') ";
+ } else {
+ $customCond .= "OR (md_custom_cats LIKE '%{".$customArray[$i]."}%') ";
+ }
+ }
+ $customCond .= ")";
+ array_push($whereCondArray, $customCond);
+ }
+
+
+
+ //date condition
+ //if begin and end are set
+ //echo "<br> regTimeBegin: ".$this-> regTimeBegin." regTimeEnd: ".$this-> regTimeEnd."<br>";
+
+ if ($this->regTimeBegin != NULL && $this->regTimeEnd != NULL){
+ $time ="(TO_TIMESTAMP(".$this->searchResources."_timestamp) BETWEEN '".$this->regTimeBegin."' AND '".$this->regTimeEnd."')";
+ array_push($whereCondArray, $time);
+ //only begin is set
+ }
+ if ($this->regTimeBegin != NULL && $this->regTimeEnd == NULL){
+ $time ="(TO_TIMESTAMP(".$this->searchResources."_timestamp) > '".$this->regTimeBegin."')";
+ array_push($whereCondArray, $time);
+ }
+ if ($this->regTimeBegin == NULL && $this->regTimeEnd != NULL){
+ $time ="(TO_TIMESTAMP(".$this->searchResources."_timestamp) < '".$this->regTimeEnd."')";
+ array_push($whereCondArray, $time);
+ }
+
+
+ //department condition
+ //TODO: generate filter for new sql check if at least some department is requested
+ //generate array
+ //$this->registratingDepartments = explode(',',$this->registratingDepartments);
+ #if(count($this->registratingDepartments) > 0 & $this->registratingDepartments){
+ if($this->registratingDepartments != NULL){
+ $dep = " department IN (".$this->registratingDepartments.") ";
+ array_push($whereCondArray, $dep);
+ }
+ // Creating the WHERE clause, based on a array
+ if(count($whereCondArray) > 0){
+ $txt_whereCond = "";
+ for ($index = 0; $index < sizeof($whereCondArray); $index++) {
+ $array_element = $whereCondArray[$index];
+ if($isTextSearch == "true") {
+ $txt_whereCond .= " AND ".$array_element;
+ } else {
+ if($index>0){
+ $txt_whereCond .= " AND ".$array_element;
+ } else {
+ $txt_whereCond .= " ".$array_element;
+ }
+ }
+ }
+ $whereStr .= $txt_whereCond;
+ }
+ //Add WHERE condition to search
+ $sql .= $whereStr;
+ //TODO ORDER BY in SQL - not necessary for counting things:
+ $sql .= $this->orderBy;
+ //Calculate Paging for OFFSET and LIMIT values:
+ $offset = ((integer)$this->maxResults) * ((integer)$this->searchPages -1);
+ $limit = (integer)$this->maxResults;
+ //defining range for paging
+ $sql .= " LIMIT ".$limit." OFFSET ".$offset."";
+ //Print out search SQL term
+ $e = new mb_exception("class_metadata.php: Search => SQL-Request of ".$this->searchResources." service metadata: ".$sql."");
+ //parameter: searchId -> can be used global, searchResources -> is only one type per instance!!-> global,which categories -> can be defined global! $whereStr
+ $n = $this->writeCategories($whereStr, $v, $t);
+ //write counts to filesystem to avoid to many database connections
+ //only write them, if searchId is given - problem: searches with same searchId's maybe get wrong information
+ return array($sql, $v, $t, $n);
+ }
+
+ private function writeCategories($whereStr, $v, $t) {
+ //generate count sql
+ //generate count of all entries
+ $sqlN = "SELECT count(".$this->searchResources."_id) from ".$this->searchView." where ";
+ $sqlN .= $whereStr;
+ //Get total number of results
+ $count = db_prep_query($sqlN, $v, $t);
+ $n = db_fetch_all($count);
+ #echo "<br>N: ".var_dump($n)."<br>";
+ $n = $n[0]['count'];
+ $e = new mb_notice("class_metadata.php: Search => SQL-Request of ".$this->searchResources." service metadata N: ".$sqlN." Number of found objects: ".$n);
+ if ($this->searchId != 'dummysearch') { //searchId is not the default id! - it has been explicitly defined
+ //check if cat file already exists:
+ //filename to search for:
+ $filename = $this->tempFolder."/".$this->searchId."_".$this->searchResources."_cat.json";
+ if (!file_exists($filename) or $this->resultTarget == 'debug') { //TODO at the moment the cat file will be overwritten - change this in production system
+ //open category file for wfs results
+ $this->catJSON = new stdClass;
+ $this->catJSON->searchMD = (object) array(
+ 'searchId' => $this->searchId,
+ 'n' => $n
+ );
+ //generate the list of category counts
+ $sqlCat = array();
+ //check if categories are defined for the resource
+ if ($this->resourceClasses != NULL) {
+ $this->catJSON->searchMD->category = array();
+ for ($i = 0; $i < count($this->resourceClasses); $i++) {
+ //TODO: not to set the classification?
+ $this->catJSON->searchMD->category[$i]->title = $this->resourceClassifications[$i]['title'];
+ $sqlCat[$i] = "SELECT ".$this->resourceClassifications[$i]['tablename'];
+ $sqlCat[$i] .= ".".$this->resourceClassifications[$i]['tablename']."_id, ";
+ $sqlCat[$i] .= " ".$this->resourceClassifications[$i]['tablename'].".";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_code_";
+ $sqlCat[$i] .= $this->languageCode.", COUNT(*) FROM ".$this->searchView;
+
+ //first join for connection table
+ $sqlCat[$i] .= " INNER JOIN ".$this->resourceClassifications[$i]['relation_'.$this->searchResources];
+ $sqlCat[$i] .= " ON (";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['relation_'.$this->searchResources].".fkey_";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['id_'.$this->searchResources]."=".$this->searchView;
+ $sqlCat[$i] .= ".".$this->resourceClassifications[$i]['id_'.$this->searchResources];
+ $sqlCat[$i] .= ") INNER JOIN ";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']." ON (";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename'].".";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_id=";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['relation_'.$this->searchResources].".fkey_";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_id)";
+ $sqlCat[$i] .= " WHERE ".$whereStr." GROUP BY ";
+
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename'].".";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_id,";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename'].".";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_code_".$this->languageCode." ORDER BY ";
+ $sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_id";
+ $sqlCategory = $sqlCat[$i];
+
+ //call sql for count of category
+ $res = db_prep_query($sqlCategory, $v, $t);
+ $categoryCounts = db_fetch_all($res);
+ //if none found: $categoryCounts=false
+ #echo "<br>count sub categories :".$categoryCounts."<br>";
+ if ($categoryCounts) {
+ //write results in json object
+ if (count($categoryCounts) > 0) {
+ #echo "<br>count main categories".count($categoryCounts)."<br>";
+ #echo "<br>vardump main categories".var_dump($categoryCounts)."<br>";
+ $this->catJSON->searchMD->category[$i]->subcat = array();
+ for ($j = 0; $j < count($categoryCounts); $j++) {
+ $this->catJSON->searchMD->category[$i]->subcat[$j]->id = $categoryCounts[$j][$this->resourceClassifications[$i]['tablename']."_id"];
+ $this->catJSON->searchMD->category[$i]->subcat[$j]->title = $categoryCounts[$j][$this->resourceClassifications[$i]['tablename']."_code_".$this->languageCode];
+ $this->catJSON->searchMD->category[$i]->subcat[$j]->count = $categoryCounts[$j]['count'];
+ //delete requestParam for this category and for id - cause a new search is started from searchURL
+ $filteredSearchString = $this->delTotalFromQuery('searchId',$this->searchURL);
+ $filteredSearchString = $this->delTotalFromQuery($this->resourceClassifications[$i]['requestName'],$filteredSearchString);
+ //set filter for this categoryid
+ $filteredSearchString .= "&".$this->resourceClassifications[$i]['requestName']."=".$categoryCounts[$j][$this->resourceClassifications[$i]['tablename']."_id"];
+ $this->catJSON->searchMD->category[$i]->subcat[$j]->filterLink = $filteredSearchString;
+ }
+ }
+ } else {
+ #$this->catJSON->searchMD->category[$i]->subcat = array();
+ }
+ $e = new mb_notice("class_metadata: countsql: ".$sqlCat[$i]);
+ }
+ }
+
+ $this->catJSON = $this->json->encode($this->catJSON);
+ //write categories files only when file is requested and the searchid was not used before!
+ if ($this->resultTarget == 'file') {
+ if($catFileHandle = fopen($filename, "w")){
+ fwrite($catFileHandle,$this->catJSON);
+ fclose($catFileHandle);
+ $e = new mb_notice("class_metadata: new ".$this->searchResources."_class_file created!");
+ } else {
+ $e = new mb_notice("class_metadata: cannot create ".$this->searchResources."_cat_file!");
+ }
+ }
+ if ($this->resultTarget == 'debug') {
+ echo "<br>DEBUG: show categories: <br>".$this->catJSON."<br><br>";
+ }
+ } else {
+ $e = new mb_exception("class_metadata: ".$this->searchResources."_class_file: ".$filename." already exists - no new one is generated!");
+ }
+ } else {
+ if ($this->resultTarget == 'debug') {
+ echo "<br>DEBUG: Standard ID dummysearch was invoked - classifications won't be counted!<br>";
+ }
+ $e = new mb_exception("class_metadata: standard dummysearch was invoked - classifications won't be counted!");
+ }
+ return $n;
+ }
+
+
+
+
+ private function generateWFSResultXML($wfsDoc, $res) {
+ $c = $this->wfsDoc->createElement("category");
+ $results = $this->wfsDoc->getElementsByTagName("result");
+ foreach ($results as $result) {
+ $result->appendChild($c);
+ $c->setAttribute('name', "WFS");
+ $c->setAttribute('count', "0");
+ }
+ $i = 0;
+ while($row = db_fetch_array($res)){
+ $m = $this->wfsDoc->createElement('member');
+ $m->setAttribute('wfs_id', $row['wfs_id']);
+ $m->setAttribute('layer_pos', "");
+ $c->appendChild($m); // member categorie 1 (first member)
+ // epsg - TODO adopt
+ $epsg = $this->wfsDoc->createElement('epsg');
+ $m->appendChild($epsg);
+ $equalEPSG = $row['featuretype_srs'];
+ $isequal = "false";
+ if ($equalEPSG == $this->search_epsg){
+ $isequal = "true";
+ }
+ //Insert end
+ $epsg_text = $this->wfsDoc->createTextNode($isequal);
+ $epsg->appendChild($epsg_text);
+ // country codes
+ $state = $this->wfsDoc->createElement('federalstate');
+ $m->appendChild($state);
+ $spatialSource = "";
+ $stateorprovince = $row['administrativearea'];
+ if ($stateorprovince == "NULL" || $stateorprovince == "") {
+ $spatialSource = $row['country'];
+ } else {
+ $spatialSource = $row['administrativearea'];
+ }
+ $countr_code_text = $this->wfsDoc->createTextNode($spatialSource);
+ $state->appendChild($countr_code_text);
+ //type
+ $type = $this->wfsDoc->createElement('type');
+ $m->appendChild($type);
+ $ttype = $this->wfsDoc->createTextNode("wfs");
+ $type->appendChild($ttype);
+ //wfs_id
+ $wfsid = $this->wfsDoc->createElement('wfs_id');
+ $m->appendChild($wfsid);
+ $twfsid = $this->wfsDoc->createTextNode($row['wfs_id']);
+ $wfsid->appendChild($twfsid);
+ //id
+ $id = $this->wfsDoc->createElement('featuretype_id');
+ $m->appendChild($id);
+ $tid = $this->wfsDoc->createTextNode($row['featuretype_id']);
+ $id->appendChild($tid);
+ //title
+ $title = $this->wfsDoc->createElement('featuretype_title');
+ $m->appendChild($title);
+ $ttitle = $this->wfsDoc->createTextNode($row['featuretype_title']);
+ $title->appendChild($ttitle);
+ //abstract
+ $abst = $this->wfsDoc->createElement('featuretype_abstract');
+ $m->appendChild($abst);
+ $tabst = $this->wfsDoc->createTextNode($row['featuretype_abstract']);
+ $abst->appendChild($tabst);
+ // accesscontraints
+ $ac = $this->wfsDoc->createElement('accessconstraints');
+ $m->appendChild($ac);
+// $myac = $this->getAccessConstraints($this->cat[$i]['member'][$ii]['wms_id'], $this->cat[$i]['member'][$ii]['accessconstraints'], $this->cat[$i]['member'][$ii]['layer_id']);
+ $myac = $this->wfsDoc->createTextNode($row['accessconstraints']);
+ $ac->appendChild($myac);
+ // termsofuse
+ $ter = $this->wfsDoc->createElement('termsofuse');
+ $m->appendChild($ter);
+ $myter = $this->wfsDoc->createTextNode($row['termsofuse']);
+ $ter->appendChild($myter);
+ //date
+ $date = $this->wfsDoc->createElement('date');
+ $m->appendChild($date);
+ $tdate = $this->wfsDoc->createTextNode(date("d.m.Y",$row['wfs_timestamp']));
+ $date->appendChild($tdate);
+ // Geomtype
+ $geo = $this->wfsDoc->createElement('geomtype');
+ $m->appendChild($geo);
+ //$geo_text = $this->getGeoType($row['wfs_id'], $row['featuretype_id']);
+ $geo_text = $this->wfsDoc->createTextNode($row['element_type']);
+ //$ge = $this->wfsDoc->createTextNode($geo_text);
+ $geo->appendChild($geo_text);
+ //department
+ $dm = $this->wfsDoc->createElement('department');
+ $m->appendChild($dm);
+ $tdm = $this->wfsDoc->createTextNode($row['mb_group_name']);
+ $dm->appendChild($tdm);
+ //permission Leseberechtigung des Benutzers(true), sonst Email zur Beantragung(email)
+ $per = $this->wfsDoc->createElement('permission');
+ $m->appendChild($per);
+ $per_text = $this->getPermissionValueForWFS($row['wfs_id'], $row['wfs_conf_id']);
+ $pe = $this->wfsDoc->createTextNode($per_text);
+ $per->appendChild($pe);
+ //wfs_conf_id
+ $conf_id = $this->wfsDoc->createElement('wfs_conf_id');
+ $m->appendChild($conf_id);
+ $c_id = $this->wfsDoc->createTextNode($row['wfs_conf_id']);
+ $conf_id->appendChild($c_id);
+ //wfs_conf_title
+ $conf_title = $this->wfsDoc->createElement('wfs_conf_title');
+ $m->appendChild($conf_title);
+ $conf_title_text = $this->wfsDoc->createTextNode($row['wfs_conf_abstract']);
+ $conf_title->appendChild($conf_title_text);
+ //wfs_conf_abstract
+ $conf_abstract = $this->wfsDoc->createElement('wfs_conf_abstract');
+ $m->appendChild($conf_abstract);
+ $c_abstract = $this->wfsDoc->createTextNode($row['wfs_conf_description']);
+ $conf_abstract->appendChild($c_abstract);
+ //wfs_conf_modul
+ $conf_modul = $this->wfsDoc->createElement('wfs_conf_modul');
+ $m->appendChild($conf_modul);
+ $c_modul = $this->wfsDoc->createTextNode($row['modultype']);
+ $conf_modul->appendChild($c_modul);
+ $i++;
+ }
+ $c->setAttribute('count', $i);
+ }
+
+ private function getPermissionValueForWFS($wfs_id, $wfs_conf_id){
+ //TODO: Set Email of owner into view for ressource - so it don't have to be searched?
+ $return_permission = "";
+ //get permission
+ $admin = new administration();
+ $myWFSconfs = $admin->getWfsConfByPermission($this->userId);
+ $this->myWFSConfs = $myWFSconfs;
+ for ($index = 0; $index < sizeof($this->myWFSConfs); $index++) {
+ $array_element = $this->myWFSConfs[$index];
+ }
+ if (in_array($wfs_conf_id, $this->myWFSConfs)){
+ $return_permission = "true";
+ } else {
+ $sql = "SELECT wfs.wfs_id, mb_user.mb_user_email as email FROM wfs, mb_user where wfs.wfs_owner=mb_user.mb_user_id "."and wfs.wfs_id=$1";
+ $v = array($wfs_id);
+ $t = array('i');
+ $res = db_prep_query($sql, $v, $t);
+ // get email
+ $mail = "";
+ while($row = db_fetch_array($res)){
+ $mail = $row['email'];
+ $return_permission = $mail;
+ }
+ }
+ return $return_permission;
+ }
+
+ private function getPermissionValueForLayer($wms_id, $layer_id){
+ //TODO: Set Email of owner into view for ressource - so it don't have to be searched?
+ $return_permission="";
+ $admin = new administration();
+ $permission = $admin->getLayerPermission($wms_id, $layer_id, $this->userId);
+ if ($permission){
+ $return_permission = "true";
+ return $return_permission;
+ } else {
+ $sql = "SELECT wms.wms_id, mb_user.mb_user_email as email FROM wms, mb_user WHERE wms.wms_owner=mb_user.mb_user_id";
+ $sql .= " AND wms.wms_id=$1";
+ $v = array($wms_id);
+ $t = array('i');
+ $res = db_prep_query($sql, $v, $t);
+ // get email
+ $mail="";
+ while($row = db_fetch_array($res)){
+ $mail = $row['email'];
+ $return_permission = $mail;
+ }
+ return $return_permission;
+ }
+ }
+
+
+
+ private function generateSearchStringArray() {
+ //'wfs test array' -> ('wfs' 'test' 'array')
+ $asstr = array();
+ if ($this->searchText != "false"){
+ $asstr = split(",",$this->searchText);
+ }
+ return $asstr;
+ }
+
+ //out of php doc - test if it is faster than normal array_search
+ private function fast_in_array($elem, $array) {
+ $top = sizeof($array) -1;
+ $bot = 0;
+ while($top >= $bot) {
+ $p = floor(($top + $bot) / 2);
+ if ($array[$p] < $elem) $bot = $p + 1;
+ elseif ($array[$p] > $elem) $top = $p - 1;
+ else return TRUE;
+ }
+ return FALSE;
+ }
+ /*
+ * filtering an array
+ */
+ private function filter_by_value ($array, $index, $value){
+ if(is_array($array) && count($array)>0) {
+ foreach(array_keys($array) as $key){
+ $temp[$key] = $array[$key][$index];
+ if ($temp[$key] == $value){
+ $newarray[$key] = $array[$key];
+ }
+ }
+ }
+ return $newarray;
+ }
+
+ //function to get the parent of the given layer by crawling the layertree upwards
+ private function getLayerParent ($layerArray, $index){
+ //only layers of one service should be in $layerArray
+ #$parentExists = false;
+ #var_dump($layerArray);
+ $layerIDKey = $layerArray['layer_id'][$index];
+ #echo ("layerIDKey= ".$layerIDKey."<br>");
+ $layerParentPos = $layerArray['layer_parent'][$index];
+ if ($layerParentPos == '') {
+ //root layer directly found
+ return $index;
+ }
+ #echo ("layerParentPos= ".$layerParentPos."<br>");
+ //Initialize index of layer parent - first it references the layer itself
+ $layerParentIndex = $index;
+ for ($i=0; $i<count($layerArray);$i++) {
+ #echo("<br>i= ".$i."<br>");
+ #echo("<br>layerParentPos= ".$layerParentPos."<br>");
+ $layerParentIndexNew = array_search($layerParentPos, $layerArray['layer_pos']);
+ #echo("<br>layerParentIndexNew= ".$layerParentIndexNew."<br>");
+ if ($layerParentIndexNew != false) {
+ //one parent has been found
+ $layerParentIndex = $layerParentIndexNew;
+ $layerParentPos = $layerArray['layer_parent'][$layerParentIndex];
+ if ($layerParentPos == '') {
+ return $layerParentIndex;
+ }
+ #$layerParentIndex = array_search($layerParentPos, $layerArray['layer_pos']);
+ } else {
+ #$layerParentIndex = $index; //no parent has been found
+ return $layerParentIndex;
+ }
+ }
+ return $layerParentIndex;
+ }
+
+
+ //function to write the child elements to the resulting wms object -> object is given by reference
+ private function writeWMSChilds($layerIdArray, $rootLayerPos, $subLayers, $i, $j, &$servObject) {
+ #echo "test";
+ #echo "<br>subLayers:<br>";
+ #var_dump($subLayers);
+ #echo "<br>";
+ $childLayers = $this->filter_by_value($subLayers, 'layer_parent', $rootLayerPos); //TODO anpassen
+ #echo "<br<childLayers:<br>";
+ #var_dump($childLayers);
+ #echo "test";
+ #print_r($childLayers);
+ #print_r($childLayers);
+ $countsublayer = 0;
+ //if child exists create a array for these
+ if (count($childLayers) != 0) {
+ $servObject->layer = array();
+ }
+ foreach ($childLayers as $child){
+ #echo "<br>countsublayer: ".$countsublayer."<br>";
+ #echo "<br>Child id: ".$child['layer_id']."<br>";
+ #echo "<br>Child pos: ".$child['layer_pos']."<br>";
+ $servObject->layer[$countsublayer]->id = $child['layer_id'];
+ $servObject->layer[$countsublayer]->title = $child['layer_title'];
+ $servObject->layer[$countsublayer]->abstract = $child['layer_abstract'];
+ if ($child['layer_name'] == ''){
+ $servObject->layer[$countsublayer]->loadable = 0;
+ } else {
+ $servObject->layer[$countsublayer]->loadable = 1;
+ }
+ $servObject->layer[$countsublayer]->loadCount = $child['load_count'];
+ #$servObject->layer[$countsublayer]->mdLink = $_SERVER['HOST']."/mapbender/x_geoportal/showWFeatureTypeMetadata.php?id=".$wfsMatrix[$i]['featuretype_id'];
+ #$servObject->layer[$countsublayer]->geomtype = $wfsMatrix[$i]['element_type'];
+ $servObject->layer[$countsublayer]->bbox = $child['bbox'];
+ $servObject->layer[$countsublayer]->permission = $this->getPermissionValueForLayer($child['wms_id'], $$child['layer_id']);
+ //call this function itself
+ $layerIdArray = $this->writeWMSChilds($layerIdArray, $child['layer_pos'], $subLayers, $i, $j, $servObject->layer[$countsublayer]);//TODO create a timeout condition !
+ array_push($layerIdArray, $child['layer_id']); //child have been identified and recursively written
+ #var_dump($layerIdArray);#
+ #echo "<br>";
+ $countsublayer ++;
+ }
+ return $layerIdArray;
+ }
+
+
+ private function delTotalFromQuery($paramName,$queryString) {
+ $queryString = "&".$queryString;
+ #echo "<br>queryString: ".$queryString."<br>";
+ $queryStringNew = preg_replace('/\b'.$paramName.'\=[^&]+&?/',"",$queryString);
+ $queryStringNew = ltrim($queryStringNew,'&');
+ $queryStringNew = rtrim($queryStringNew,'&');
+ return $queryStringNew;
+ }
+
+}
+?>
\ No newline at end of file
More information about the Mapbender_commits
mailing list