[Mapbender-commits] r1790 - trunk/mapbender/http/classes
svn_mapbender at osgeo.org
svn_mapbender at osgeo.org
Fri Nov 9 07:20:45 EST 2007
Author: christoph
Date: 2007-11-09 07:20:40 -0500 (Fri, 09 Nov 2007)
New Revision: 1790
Added:
trunk/mapbender/http/classes/class_metadata.php
Log:
new wfs metadata module
Added: trunk/mapbender/http/classes/class_metadata.php
===================================================================
--- trunk/mapbender/http/classes/class_metadata.php (rev 0)
+++ trunk/mapbender/http/classes/class_metadata.php 2007-11-09 12:20:40 UTC (rev 1790)
@@ -0,0 +1,1465 @@
+<?php
+# $Id$
+# http://www.mapbender.org/index.php/class_administration
+# Copyright (C) 2002 CCGIS
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+#require_once(dirname(__FILE__)."/../../conf/mapbender.conf");
+require_once(dirname(__FILE__)."/class_administration.php");
+require_once(dirname(__FILE__)."/class_mb_exception.php");
+
+include_once(dirname(__FILE__)."/../../conf/mapbender.conf");
+$con = db_connect(DBSERVER,OWNER,PW);
+db_select_db(DB,$con);
+
+/**
+ * class to handle keywords for services
+ */
+
+class class_metadata{
+
+ private $user_id;
+
+ private $departments = array();
+ private $categories = array();
+ private $searchtext;
+ private $timestamp_beg;
+ private $timestamp_end;
+ private $limit;
+ private $search_bbox = array();
+ private $search_epsg;
+
+ private $obj_members = array();
+
+ private $availabilityTime;
+
+ private $doc;
+
+ /*
+ * Constructor of the class_metadata-class
+ *
+ * @$user_id integer users ID
+ * @$departments array departments
+ * @$categories array categories
+ * @$searchtext string searchtext (with blanks => more searchwords)
+ * @$timestamp_beg integer Timebegin of the Search in TIMESTAMP-Format
+ * @$timestamp_end integer Timeend of the Search in TIMESTAMP-Format
+ * @$limit integer Limit of the whole Result of the Metadata Search
+ * @$search_bbox array BoundingBox
+ * @$search_epsg string EPSG like: "EPSG:4326"
+ */
+ function logit($text){
+ if($h = fopen("/data/mapbender/http/tmp/gregor.txt","a")){
+ $content = $text .chr(13).chr(10);
+ if(!fwrite($h,$content)){
+ #exit;
+ }
+ fclose($h);
+ }
+
+ }
+
+ function __construct($user_id, $departments, $categories, $searchtext, $timestamp_beg, $timestamp_end, $limit, $search_bbox, $search_epsg){
+ $this->user_id = $user_id;
+
+ $this->departments = $departments;
+ $this->categories = $categories;
+ $this->searchtext = $searchtext;
+ $this->timestamp_beg = $timestamp_beg;
+ $this->timestamp_end = $timestamp_end;
+ $this->limit = $limit;
+ $this->search_bbox = $search_bbox;
+ $this->search_epsg = $search_epsg;
+
+ $this->availabilityTime = 60*60*24*90; // sec*min*hour*days
+
+// $e = new mb_notice("Search extended => user_id: ".$this->user_id."");
+// $e = new mb_notice("Search extended => searchtext: ".$this->searchtext."");
+// $e = new mb_notice("Search extended => timestamp_beg: ".$this->timestamp_beg."");
+// $e = new mb_notice("Search extended => timestamp_end: ".$this->timestamp_end."");
+// $e = new mb_notice("Search extended => limit: ".$this->limit."");
+// $e = new mb_notice("Search extended => search_epsg: ".$this->search_epsg."");
+//
+// $e = new mb_notice("Search extended => count departments: ".count($this->departments)."");
+// $e = new mb_notice("Search extended => count categories: ".count($this->categories)."");
+// $e = new mb_notice("Search extended => count search_bbox: ".count($this->search_bbox)."");
+
+// echo "Search extended => user_id: ".$this->user_id."<br>";
+// echo "Search extended => searchtext: ".$this->searchtext."<br>";
+// echo "Search extended => timestamp_beg: ".$this->timestamp_beg."<br>";
+// echo "Search extended => timestamp_end: ".$this->timestamp_end."<br>";
+// echo "Search extended => limit: ".$this->limit."<br>";
+// echo "Search extended => search_epsg: ".$this->search_epsg."<br>";
+// echo "Search extended => count search_bbox: ".count($this->search_bbox)."<br>";
+//
+// echo "Search extended => count departments: ".count($this->departments)."<br>";
+// echo "Search extended => count categories: ".count($this->categories)."<br>";
+// echo "Search extended => count search_bbox: ".count($this->search_bbox)."<br>";
+//
+// echo "Search extended => count departments: ".$this->departments[0]."<br>";
+// echo "Search extended => count categories: ".$this->categories[0]."<br>";
+// echo "Search extended => count search_bbox: ".$this->search_bbox[0]."<br>";
+
+
+ $this->logit("searchtext: ".$this->searchtext);
+ $this->logit("count categories: ".count($this->categories));
+ $this->logit("count departments: ".count($this->departments));
+ $this->logit("count search_bbox: ".count($this->search_bbox));
+
+ $cat_id="";
+ for ($index = 0; $index < sizeof($this->categories); $index++) {
+ $array_element = $this->categories[$index];
+
+ $cat_id .= $array_element.", ";
+ }
+
+ $this->isOverLimit;
+
+ $this->anz_wms=0;
+ $this->anz_wfs=0;
+
+ $cat = array();
+ $this->cat = $cat;
+
+ $this->user_authorization();
+
+ $this->set_categories();
+
+ $this->doc = new DOMDocument('1.0');
+
+ $this->generate_xml_output();
+
+ }
+
+ /*
+ * user authorization
+ */
+ function user_authorization(){
+
+ $n = new administration();
+ $this->n = $n;
+ $myguis = $this->n->getGuisByPermission($this->user_id,true);
+ $mywms = $this->n->getWmsByOwnGuis($myguis);
+
+ $myWFSconfs = $this->n->getWfsConfByPermission($this->user_id);
+
+
+
+ $this->myWFSConfs = $myWFSconfs;
+
+
+ for ($index = 0; $index < sizeof($this->myWFSConfs); $index++) {
+ $array_element = $this->myWFSConfs[$index];
+// echo $index."wfs_conf_id: ".$array_element."<br>";
+ }
+
+
+ $mylayer = array();
+
+ $this->mylayer = $mylayer;
+ if($mywms == false){
+ $mywms = array();
+ }
+
+ }
+
+ /* set categories as array */
+ function set_categories(){
+ $sql = "SELECT * FROM md_topic_category ";
+
+ $sql .= " ORDER BY md_topic_category_id";
+
+ $res = db_query($sql);
+ $this->cat[0] = array();
+ $this->cat[0]['md_topic_category_code_de'] = '';
+ $this->cat[0]['member'] = array();
+ $cnt = 1;
+ while($row = db_fetch_array($res)){
+ $this->cat[$cnt] = array();
+ $this->cat[$cnt]['md_topic_category_code_de'] = $row['md_topic_category_code_de'];
+ $this->cat[$cnt]['member'] = array();
+ $cnt++;
+// echo " => ".$row['md_topic_category_code_de'];
+// echo " => ".$row['md_topic_category_id']."<br>";
+
+ }
+
+
+ $cat_de="";
+
+ for ($index = 0; $index < sizeof($this->cat); $index++) {
+ $array_element = $this->cat[$index];
+
+ $cat_de .= "'".$this->cat[$index]['md_topic_category_code_de']."', ";
+
+ }
+
+// $this->logit("set cat => count categories in [][]: ".count($this->cat));
+// $this->logit("set cat => categories: ".$cat_de);
+
+ }
+
+ /*
+ * replace german letters (for example ä => ae)
+ */
+ function replaceChars($text){
+ $search = array( "ä", "ö", "ü", "Ä", "Ö", "Ü", "ß");
+ $repwith = array("ae", "oe", "ue", "AE", "OE", "UE", "ss");
+
+ if(CHARSET=="UTF-8")
+ $text = utf8_decode($text);
+
+ $ret = str_replace($search, $repwith, $text);
+
+ if(CHARSET=="UTF-8")
+ $ret = utf8_encode($ret);
+
+ return $ret;
+ }
+
+
+ function replaceString($string , $replaceString, $newString){
+
+ $newstr = str_replace($string, $replaceString, $newString);
+
+ return $newstr;
+
+ }
+
+
+ function generate_xml_output(){
+ $this->writeXmlhead();
+ $this->writeXmlWMSPart();
+ $this->writeXmlWFSPart();
+ $this->writeXmlEnd();
+ }
+
+ function writeXmlhead(){
+
+ $this->doc->encoding = CHARSET;
+ $result = $this->doc->createElement("result");
+ $this->doc->appendChild($result);
+
+ //Trefferanzahl
+ $overLimit = $this->doc->createElement('overLimit');
+ $result->appendChild($overLimit);
+ $tr_text = $this->doc->createTextNode($this->isOverLimit);
+ $overLimit->appendChild($tr_text);
+
+ $rd = $this->doc->createElement("redirect");
+ $result->appendChild($rd);
+ $trd = $this->doc->createTextNode("muss noch...");
+ $rd->appendChild($trd);
+
+ }
+
+ function writeXmlEnd(){
+
+ $overLimitText = $this->doc->createTextNode($this->isOverLimit);
+ $overLimits = $this->doc->getElementsByTagName("overLimit");
+ foreach ($overLimits as $overLimit) {
+
+ $overLimit->appendChild($overLimitText);
+ }
+
+
+ $ready = $this->doc->createElement('ready');
+ $tready = $this->doc->createTextNode("true");
+ $ready->appendChild($tready);
+
+ $results = $this->doc->getElementsByTagName("result");
+ foreach ($results as $result) {
+
+ $result->appendChild($ready);
+
+ }
+
+ echo $this->doc->saveXML(); // Ausgabe
+
+ $e = new mb_notice("Wrote the XML-File");
+ }
+
+
+ /*
+ * generats categories with members in the xml-File
+ */
+
+ function writeXmlWMSPart(){
+
+ $asstr = array();
+
+ if ($this->searchtext!="false"){
+ $asstr = split(" ",$this->searchtext);
+ }
+
+
+ $isTextSearch = "false";
+
+
+ for ($index = 0; $index < count($asstr); $index++) {
+ $array_element = $asstr[$index];
+ $e = new mb_notice("Search-Text: ".$index.". ".$array_element."");
+ }
+
+ $v = array();
+ $t = array();
+
+ $sql = "SELECT DISTINCT * from service_metadata where ";
+
+
+
+
+
+ for($i=0; $i<count($asstr); $i++){
+ $isTextSearch = "true";
+ if($i>0){$sql .= " AND ";}
+ $sql .= "searchtext LIKE $".($i+1);
+ $va = "%".trim(strtoupper($this->replaceChars($asstr[$i])))."%";
+ array_push($v,$va);
+ array_push($t,"s");
+ }
+
+
+ $whereBedArray = array();
+ //layer_searchable condition
+ array_push($whereBedArray, "(layer_searchable = 1)");
+
+
+ //date condition
+ if ($this->timestamp_beg!="false" && $this->timestamp_end!="false"){
+
+ $time ="(wms_timestamp BETWEEN ".$this->timestamp_beg." AND ".$this->timestamp_end.")";
+ array_push($whereBedArray, $time);
+
+ } else if ($this->timestamp_beg!="false" && $this->timestamp_end=="false"){
+
+ $time ="(wms_timestamp > ".$this->timestamp_beg.")";
+ array_push($whereBedArray, $time);
+
+ } else if ($this->timestamp_beg=="false" && $this->timestamp_end!="false"){
+
+ $time ="(wms_timestamp < ".$this->timestamp_end.")";
+ array_push($whereBedArray, $time);
+ }
+
+
+ //department condition
+ if(count($this->departments)>0){
+
+ $txt = $this->getDepartmentBed("wms_owner", "mb_user_department", $this->departments, "OR");
+ $dep = " (". $txt . ") ";
+ array_push($whereBedArray, $dep);
+
+ }
+
+
+
+// //Testausgabe
+// for ($index = 0; $index < sizeof($this->whereBedArray); $index++) {
+// $array_element = $this->whereBedArray[$index];
+// echo $index." el: ".$array_element."<br>";
+//
+// }
+
+ //Creating the Where Clausel, based on a Array
+ if(count($whereBedArray)>0){
+ $txt_whereBed="";
+
+ for ($index = 0; $index < sizeof($whereBedArray); $index++) {
+ $array_element = $whereBedArray[$index];
+
+
+ if($isTextSearch=="true") {
+ $txt_whereBed .=" AND ".$array_element;
+ } else {
+ if($index>0){
+ $txt_whereBed .=" AND ".$array_element;
+ } else {
+ $txt_whereBed .=" ".$array_element;
+ }
+ }
+
+ }
+
+ $sql .= $txt_whereBed;
+ }
+
+ //order by
+ $sql .= " ORDER BY load_count DESC";
+
+
+ //Beschränkung
+ $lim = $this->limit;
+ $overLimit = $lim+1;
+ $sql .= " LIMIT ".$overLimit;
+
+
+ for ($index = 0; $index < sizeof($asstr); $index++) {
+ $array_element = $asstr[$index];
+
+ $this->logit($index.".Suchwort : ".$array_element);
+ }
+
+ $this->logit("SQL_WMS: ".$sql);
+
+ $e = new mb_notice("Search extended => SQL-Request of view service_metadata: ".$sql."");
+ $res = db_prep_query($sql, $v, $t);
+
+ // spatial search
+
+
+
+// for ($index = 0; $index < sizeof($this->cat); $index++) {
+// $array_element = $this->cat[$index];
+//
+// $this->logit("0. vor Kategorieeinordnung => Kategorie: ".$this->cat[$index]['md_topic_category_code_de'].", Anzahl Member: ".count($this->cat[$index]['member']));
+// }
+
+
+ if(count($this->search_bbox)>0){
+ $anz = 0;
+ $resultColumns = array();
+ $resultColumns = $this->generateNewReaArray($res);
+
+ $e = new mb_notice("count service_metadata: ".count($resultColumns)."");
+
+ for ($index = 0; $index < count($resultColumns); $index++) {
+ $row = $resultColumns[$index];
+
+ if ($this->n->getLayerPermission($row['wms_id'], $row['layer_name'], $this->user_id)) {
+ array_push($this->mylayer,$row['layer_id']);
+ }
+ //accessconstraints -> email subadmin
+// $sql_ac = "SELECT mb_user_email FROM mb_user WHERE mb_user_id = $1";
+// $v = array($row["wms_owner"]);
+// $t = array('i');
+// $res_ac = db_prep_query($sql_ac, $v, $t);
+// if($row_ac = db_fetch_array($res_ac)){
+// $row["accessconstraints"] = $row_ac["mb_user_email"];
+// }
+ $ns = $this->make_members($row);
+ $anz++;
+ }
+ $e = new mb_notice("count service_metadata(spatial-search): ".$anz."");
+ $this->logit("ANZ_WMS mit bbox: ".$anz);
+ } else {
+ $anz = 0;
+
+ while($row = db_fetch_array($res)){
+
+ if ($this->n->getLayerPermission($row['wms_id'], $row['layer_name'], $this->user_id)) {
+ array_push($this->mylayer,$row['layer_id']);
+ }
+ //accessconstraints -> email subadmin
+// $sql_ac = "SELECT mb_user_email FROM mb_user WHERE mb_user_id = $1";
+// $v = array($row["wms_owner"]);
+// $t = array('i');
+// $res_ac = db_prep_query($sql_ac, $v, $t);
+//
+// if ($row_ac = db_fetch_array($res_ac)){
+// $row["accessconstraints"] = $row_ac["mb_user_email"];
+// }
+
+ $ns = $this->make_members($row);
+ $anz++;
+ }
+
+ $e = new mb_notice("count service_metadata(no spatial-search): ".$anz."");
+ $this->logit("ANZ_WMS ohne bbox: ".$anz);
+ }
+
+
+
+// for ($index = 0; $index < sizeof($this->cat); $index++) {
+// $array_element = $this->cat[$index];
+//
+// $this->logit("1.nach Kategorieeinordnung => Kategorie: ".$this->cat[$index]['md_topic_category_code_de'].", Anzahl Member: ".count($this->cat[$index]['member']));
+// }
+
+ if ($this->limit < $anz ){
+ $this->isOverLimit="true";
+ } else {
+ $this->isOverLimit="false";
+ }
+
+ $ns = $this->make_xml();
+ }
+
+ /*
+ * fills an array[][] with members based on categories
+ */
+ function make_members($r){
+
+// $sql = "SELECT fkey_md_topic_category_id FROM layer_md_topic_category WHERE fkey_layer_id = $1";
+
+ $sql = "SELECT fkey_md_topic_category_id, md_topic_category_code_de, fkey_layer_id " .
+ "FROM layer_md_topic_category, md_topic_category " .
+ "WHERE layer_md_topic_category.fkey_md_topic_category_id = md_topic_category.md_topic_category_id " .
+ "AND fkey_layer_id = $1";
+
+ $sql .= " ORDER BY fkey_md_topic_category_id";
+
+ $v = array($r['layer_id']);
+ $t = array('i');
+ $res = db_prep_query($sql, $v, $t);
+ $c = 0;
+
+ //layer with category
+ while($row = db_fetch_array($res)){
+
+ if (count($this->categories)>0){
+ if (in_array($row['fkey_md_topic_category_id'], $this->categories) ){
+ $this->cat[$row['fkey_md_topic_category_id']]['member'][count($this->cat[$row['fkey_md_topic_category_id']]['member'])] = $r;
+ }
+ } else {
+ $this->cat[$row['fkey_md_topic_category_id']]['member'][count($this->cat[$row['fkey_md_topic_category_id']]['member'])] = $r;
+ }
+
+// $this->cat[$row['fkey_md_topic_category_id']]['member'][count($this->cat[$row['fkey_md_topic_category_id']]['member'])] = $r;
+// $catID = $row['fkey_md_topic_category_id'];
+// array_push($this->cat[$catID]['member'],$r);
+ $c++;
+ }
+
+ // no category for this layer
+ if($c == 0){
+ array_push($this->cat[0]['member'],$r);
+ }
+ return true;
+ }
+
+
+
+ /*
+ * generats the xml-document
+ */
+ function make_xml(){
+
+// for ($index = 0; $index < sizeof($this->cat); $index++) {
+// $array_element = $this->cat[$index];
+//
+// echo "Kategorie: ".$this->cat[$index]['md_topic_category_code_de'].", Anzahl Member: ".count($this->cat[$index]['member'])."<br>";
+// }
+
+
+ $i=0;
+ if (count($this->categories) == 0){ // Wenn eine Kategorieauswahl werde WMSe/Layer die keiner Kategorie zugeordnet sind nicht angezeigt
+ $i=0;
+ } else {
+ $i=1;
+ }
+
+ for($i; $i<count($this->cat); $i++){
+ if(count($this->cat[$i]['member'])>0){
+
+
+
+ $c = $this->doc->createElement("category");
+ $results = $this->doc->getElementsByTagName("result");
+
+ foreach ($results as $result) {
+
+ $result->appendChild($c);
+
+ $c->setAttribute('name',$this->cat[$i]['md_topic_category_code_de']);
+ $c->setAttribute('count',count($this->cat[$i]['member']));
+ }
+
+ $this->logit("IM XML-Aufbau: category: ".$this->cat[$i]['md_topic_category_code_de'].", Anzahl: ".count($this->cat[$i]['member']));
+
+ for($ii=0; $ii<count($this->cat[$i]['member']); $ii++){
+
+// ###################
+// Schachtelung Start
+ $m = $this->doc->createElement('member');
+ $m->setAttribute('wms_id',$this->cat[$i]['member'][$ii]['wms_id']); // Attribut muss gesetzt werden um es wieder zu finden
+ $m->setAttribute('layer_pos',$this->cat[$i]['member'][$ii]['layer_pos']); // Attribut muss gesetzt werden um es wieder zu finden
+// $m->setAttribute('layer_parent',$this->cat[$i]['member'][$ii]['layer_parent']);
+
+ if ($ii != 0){
+
+ $members = $c->getElementsByTagName('member');
+ $sub = "false";
+ $mem = null;
+
+ foreach ($members as $member) {
+ $tmp_wms_id = $member -> getAttribute('wms_id');
+ $tmp_layer_pos = $member -> getAttribute('layer_pos');
+
+ /*
+ * Wiederfinden des Members über die Attribute
+ */
+ if ($this->cat[$i]['member'][$ii]['wms_id'] == $tmp_wms_id){
+
+ if ($this->cat[$i]['member'][$ii]['layer_parent'] == $tmp_layer_pos){
+ $sub = "true";
+ $member->appendChild($m); // dem member $member wird ein weiteres member $m hinzugefügt
+ break;
+
+ } else {
+ $sub = "false";
+ }
+ }
+ }
+
+ if ($sub == "true"){
+ // member konnte schon in der foreach-schleife eingefuegt werden
+ } else {
+ $c->appendChild($m); // member kategorie 1 (anderer WMS)
+ }
+ } else {
+
+ $c->appendChild($m); // member kategorie 1 (erstes member)
+
+ }
+
+// Schachtelung Ende
+// ###################
+
+ // LayerName
+ $state = $this->doc->createElement('layername');
+ $m->appendChild($state);
+
+ $name = "";
+ $layname = $this->cat[$i]['member'][$ii]['layer_name'];
+ if ($layname == "NULL" || $layname == "") {
+ $name = "";
+ } else {
+ $name = $layname;
+ }
+ $lay_name_text = $this->doc->createTextNode($name);
+ $state->appendChild($lay_name_text);
+
+
+ //Abfragbarkeit
+ $queryable = $this->doc->createElement('queryable');
+ $m->appendChild($queryable);
+
+ if ($this->cat[$i]['member'][$ii]['layer_queryable']==1){
+ $lay_queryable = "true";
+ } else {
+ $lay_queryable = "false";
+ }
+
+ $abf_text = $this->doc->createTextNode($lay_queryable);
+ $queryable->appendChild($abf_text);
+
+ // Epsg
+ $epsg = $this->doc->createElement('epsg');
+ $m->appendChild($epsg);
+
+ $equalEPSG = $this->checkEPSG($this->cat[$i]['member'][$ii]['wms_id']);
+
+ $epsg_text = $this->doc->createTextNode($equalEPSG);
+ $epsg->appendChild($epsg_text);
+
+ // Länderkennung
+ $state = $this->doc->createElement('federalstate');
+ $m->appendChild($state);
+
+ $spatialSource = "";
+ $stateorprovince = $this->cat[$i]['member'][$ii]['stateorprovince'];
+ if ($stateorprovince == "NULL" || $stateorprovince == "") {
+
+ $spatialSource = $this->cat[$i]['member'][$ii]['country'];
+ } else {
+ $spatialSource = $this->cat[$i]['member'][$ii]['stateorprovince'];
+ }
+
+ $countr_code_text = $this->doc->createTextNode($spatialSource);
+ $state->appendChild($countr_code_text);
+
+ // Satus des letzten Monitorings
+ $last_monitoring = $this->doc->createElement('last_monitoring');
+ $m->appendChild($last_monitoring);
+
+ $lastMonitoring = $this->getLastMonitoringDate($this->cat[$i]['member'][$ii]['wms_id']);
+
+ $last_monitoring_text = $this->doc->createTextNode($lastMonitoring);
+ $last_monitoring->appendChild($last_monitoring_text);
+
+ // Verfügbarkeit - Prozentzahl
+ $availability = $this->doc->createElement('availability');
+ $m->appendChild($availability);
+
+ $availabilityPercent = $this->getWMSavailability($this->cat[$i]['member'][$ii]['wms_id'], $this->availabilityTime);
+
+ $availability_text = $this->doc->createTextNode($availabilityPercent);
+
+
+
+ $availability->appendChild($availability_text);
+
+ // Relevanz / Count
+ $relevance = $this->doc->createElement('relevance');
+ $m->appendChild($relevance);
+
+ $lay_count=0;
+ if($this->cat[$i]['member'][$ii]['load_count'] != null){
+ $lay_count=$this->cat[$i]['member'][$ii]['load_count'];
+ }
+ $relevance_text = $this->doc->createTextNode($lay_count);
+ $relevance->appendChild($relevance_text);
+
+
+ //type
+ $type = $this->doc->createElement('type');
+ $m->appendChild($type);
+ if($this->cat[$i]['member'][$ii]['layer_pos'] > 0){
+ $ttype = $this->doc->createTextNode("layer");
+ }
+ else{
+ $ttype = $this->doc->createTextNode("wms");
+ }
+ $type->appendChild($ttype);
+
+ //wms_id
+ $wms__id = $this->doc->createElement('wms_id');
+ $m->appendChild($wms__id);
+ $id_text = $this->doc->createTextNode($this->cat[$i]['member'][$ii]['wms_id']);
+ $wms__id->appendChild($id_text);
+ //layer_id
+ $id = $this->doc->createElement('id');
+ $m->appendChild($id);
+ $tid = $this->doc->createTextNode($this->cat[$i]['member'][$ii]['layer_id']);
+ $id->appendChild($tid);
+ //title
+ $title = $this->doc->createElement('title');
+ $m->appendChild($title);
+ $ttitle = $this->doc->createTextNode($this->cat[$i]['member'][$ii]['layer_title']);
+ $title->appendChild($ttitle);
+ //abstract
+ $abst = $this->doc->createElement('abstract');
+ $m->appendChild($abst);
+ $tabst = $this->doc->createTextNode($this->cat[$i]['member'][$ii]['layer_abstract']);
+ $abst->appendChild($tabst);
+
+ // accesscontraints
+ $ac = $this->doc->createElement('accessconstraints');
+ $m->appendChild($ac);
+ $myac = $this->doc->createTextNode($this->cat[$i]['member'][$ii]['accessconstraints']);
+ $ac->appendChild($myac);
+
+ //data
+ $date = $this->doc->createElement('date');
+ $m->appendChild($date);
+ $tdate = $this->doc->createTextNode(date("d.m.Y",$this->cat[$i]['member'][$ii]['wms_timestamp']));
+ $date->appendChild($tdate);
+ //department
+ $dm = $this->doc->createElement('department');
+ $m->appendChild($dm);
+ $tdm = $this->doc->createTextNode($this->cat[$i]['member'][$ii]['mb_group_name']);
+ $dm->appendChild($tdm);
+
+ //permission // Leseberechtigung des Benutzers(true), sonst Email zur Beantragung(email)
+ $per = $this->doc->createElement('permission');
+ $m->appendChild($per);
+ $per_text = $this->getPermissionValue( $this->cat[$i]['member'][$ii]['wms_id'], $this->cat[$i]['member'][$ii]['layer_id']);
+ $pe = $this->doc->createTextNode($per_text);
+ $per->appendChild($pe);
+
+
+ // termsofuse
+ $ter = $this->doc->createElement('termsofuse');
+ $m->appendChild($ter);
+ $myter_text = $this->getTermOfUse($this->cat[$i]['member'][$ii]['wms_id']);
+ $myter = $this->doc->createTextNode($myter_text);
+ $ter->appendChild($myter);
+
+
+
+// $this->logit("Ende member: ".$ii);
+// echo "ende member: ".$ii."<br>";
+ }
+ }
+ }
+
+ }
+
+
+ function writeXmlWFSPart(){
+
+// $asstr = split(" ",$this->searchtext);
+
+ $asstr = array();
+
+ if ($this->searchtext!="false"){
+ $asstr = split(" ",$this->searchtext);
+ }
+
+ for ($index = 0; $index < count($asstr); $index++) {
+ $array_element = $asstr[$index];
+ $e = new mb_notice("Search-Text: ".$index.". ".$array_element."");
+ }
+
+ $v = array();
+ $t = array();
+
+ $sql = "SELECT DISTINCT * from wfs_service_metadata where ";
+ $whereBedArray = array();
+
+
+ $isTextSearch="false";
+ //textsearch
+ for($i=0; $i<count($asstr); $i++){
+ $isTextSearch="true";
+ if($i>0){$sql .= " AND ";}
+ $sql .= "searchtext LIKE $".($i+1);
+ $va = "%".trim(strtoupper($this->replaceChars($asstr[$i])))."%";
+ array_push($v,$va);
+ array_push($t,"s");
+
+ }
+
+ //date condition
+ if ($this->timestamp_beg!="false" && $this->timestamp_end!="false"){
+ $time ="(wfs_timestamp BETWEEN ".$this->timestamp_beg." AND ".$this->timestamp_end.")";
+ array_push($whereBedArray, $time);
+
+ } else if ($this->timestamp_beg!="false" && $this->timestamp_end=="false"){
+
+ $time ="(wfs_timestamp > ".$this->timestamp_beg.")";
+ array_push($whereBedArray, $time);
+
+ } else if ($this->timestamp_beg=="false" && $this->timestamp_end!="false"){
+
+ $time ="(wfs_timestamp < ".$this->timestamp_end.")";
+ array_push($whereBedArray, $time);
+ }
+
+
+ //department condition
+ if(count($this->departments)>0){
+
+ $txt = $this->getDepartmentBed("wfs_owner", "mb_user_department", $this->departments, "OR");
+ $dep = " (". $txt . ") ";
+ array_push($whereBedArray, $dep);
+
+ }
+
+ //featuretype_searchable condition
+ array_push($whereBedArray, "(featuretype_searchable = 1)");
+
+
+
+ // Creating the Where Clausel, based on a Array
+ if(count($whereBedArray)>0){
+ $txt_whereBed="";
+ for ($index = 0; $index < sizeof($whereBedArray); $index++) {
+ $array_element = $whereBedArray[$index];
+
+ if($isTextSearch=="true") {
+ $txt_whereBed .=" AND ".$array_element;
+ } else {
+ if($index>0){
+ $txt_whereBed .=" AND ".$array_element;
+ } else {
+ $txt_whereBed .=" ".$array_element;
+ }
+ }
+
+// $txt_whereBed .=" AND ".$array_element;
+ }
+ $sql .= $txt_whereBed;
+ }
+
+
+ //order by
+ $sql .= " ORDER BY featuretype_id ";
+
+// echo "WFS-SQL:<br>".$sql."<br>";
+
+ $this->logit("WFS_SQL: ".$sql);
+
+ $e = new mb_notice("Search extended => SQL-Request of view service_metadata: ".$sql."");
+
+ $res = db_prep_query($sql, $v, $t);
+ $c = $this->doc->createElement("category");
+ $results = $this->doc->getElementsByTagName("result");
+
+ foreach ($results as $result) {
+
+ $result->appendChild($c);
+
+ $c->setAttribute('name', "Geometriedienste");
+ $c->setAttribute('count', "0");
+ }
+
+ $i = 0;
+
+ while($row = db_fetch_array($res)){
+
+ $m = $this->doc->createElement('member');
+ $m->setAttribute('wfs_id', $row['wfs_id']);
+ $m->setAttribute('layer_pos', "");
+
+ $c->appendChild($m); // member kategorie 1 (erstes member)
+
+ //Abfragbarkeit
+ $queryable = $this->doc->createElement('queryable');
+ $m->appendChild($queryable);
+
+
+ if ($row['featuretype_searchable'] == "1"){
+ $lay_queryable = "true";
+ } else {
+ $lay_queryable = "false";
+ }
+
+ $search_text = $this->doc->createTextNode($lay_queryable);
+ $queryable->appendChild($search_text);
+
+ // Epsg
+ $epsg = $this->doc->createElement('epsg');
+ $m->appendChild($epsg);
+
+ $equalEPSG = $row['featuretype_srs'];
+
+ $epsg_text = $this->doc->createTextNode($equalEPSG);
+ $epsg->appendChild($epsg_text);
+
+ // Länderkennung
+ $state = $this->doc->createElement('federalstate');
+ $m->appendChild($state);
+
+ $spatialSource = "";
+ $stateorprovince = $row['administrativearea'];
+ if ($stateorprovince == "NULL" || $stateorprovince == "") {
+
+ $spatialSource = $row['country'];
+ } else {
+ $spatialSource = $row['administrativearea'];
+ }
+
+ $countr_code_text = $this->doc->createTextNode($spatialSource);
+ $state->appendChild($countr_code_text);
+
+
+ //type
+ $type = $this->doc->createElement('type');
+ $m->appendChild($type);
+ $ttype = $this->doc->createTextNode("wfs");
+ $type->appendChild($ttype);
+
+// // FeaturetypeName
+// $state = $this->doc->createElement('name');
+// $m->appendChild($state);
+//
+// $name = "";
+// $stateorprovince = $row['featuretype_name'];
+// if ($stateorprovince == "NULL" || $stateorprovince == "") {
+//
+//// $name = $row[''];
+// } else {
+// $name = $row['featuretype_name'];
+// }
+//
+// $countr_code_text = $this->doc->createTextNode($name);
+// $state->appendChild($countr_code_text);
+
+ //id
+ $id = $this->doc->createElement('featuretype_id');
+ $m->appendChild($id);
+ $tid = $this->doc->createTextNode($row['featuretype_id']);
+ $id->appendChild($tid);
+
+ //wfs_conf_id
+ $conf_id = $this->doc->createElement('wfs_conf_id');
+ $m->appendChild($conf_id);
+ $c_id = $this->doc->createTextNode($row['wfs_conf_id']);
+ $conf_id->appendChild($c_id);
+
+ //title
+ $title = $this->doc->createElement('title');
+ $m->appendChild($title);
+ $ttitle = $this->doc->createTextNode($row['wfs_conf_abstract']);
+
+ //title
+ $title = $this->doc->createElement('title');
+ $m->appendChild($title);
+ $ttitle = $this->doc->createTextNode($row['wfs_conf_abstract']);
+
+ $title->appendChild($ttitle);
+ //abstract
+ $abst = $this->doc->createElement('abstract');
+ $m->appendChild($abst);
+ $tabst = $this->doc->createTextNode($row['wfs_conf_description']);
+ $abst->appendChild($tabst);
+
+
+ // Geomtype
+ $geo = $this->doc->createElement('geomtype');
+ $m->appendChild($geo);
+ $geo_text = $this->getGeoType($row['wfs_id'], $row['featuretype_id']);
+ $ge = $this->doc->createTextNode($geo_text);
+ $geo->appendChild($ge);
+
+
+ // accesscontraints
+ $ac = $this->doc->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->doc->createTextNode($row['accessconstraints']);
+ $ac->appendChild($myac);
+
+ //data
+ $date = $this->doc->createElement('date');
+ $m->appendChild($date);
+ $tdate = $this->doc->createTextNode(date("d.m.Y",$row['wfs_timestamp']));
+ $date->appendChild($tdate);
+ //department
+ $dm = $this->doc->createElement('department');
+ $m->appendChild($dm);
+ $tdm = $this->doc->createTextNode($row['mb_group_name']);
+ $dm->appendChild($tdm);
+
+ //permission Leseberechtigung des Benutzers(true), sonst Email zur Beantragung(email)
+ $per = $this->doc->createElement('permission');
+ $m->appendChild($per);
+ $per_text = $this->getPermissionValueForWFS($row['wfs_id'], $row['wfs_conf_id']);
+ $pe = $this->doc->createTextNode($per_text);
+ $per->appendChild($pe);
+
+// // termsofuse
+// $ter = $this->doc->createElement('termsofuse');
+// $m->appendChild($ter);
+//// $myter = $this->getAccessConstraints($this->cat[$i]['member'][$ii]['wms_id'], $this->cat[$i]['member'][$ii]['accessconstraints'], $this->cat[$i]['member'][$ii]['layer_id']);
+// $myter_text = "";
+// $myter = $this->doc->createTextNode($myter_text);
+// $ter->appendChild($myter);
+
+ $i++;
+ }
+
+ $c->setAttribute('count', $i);
+
+ $this->anz_wfs = $i;
+ }
+
+
+
+ function getLastMonitoringDate($wms_id){
+
+ $sql = "SELECT max(upload_id) as last_time, status FROM mb_monitor WHERE fkey_wms_id=$1 GROUP BY (status)";
+ $v = array($wms_id);
+ $t = array('i');
+ $res = db_prep_query($sql, $v, $t);
+ $c = 0;
+
+ $status = "";
+ while($row = db_fetch_array($res)){
+
+ $status = $row['status'];
+ $c++;
+
+ }
+
+ return $status;
+ }
+
+ /*
+ * Returns the availability of a WMS/Layer during a period of time
+ * in percent
+ */
+ function getWMSavailability ($wms_id, $time_period){
+
+ $timestamp = time();
+ $datum = date("d.m.Y - H:i", $timestamp);
+
+ $last_timestamp = $timestamp - $time_period;
+
+ $last_date = date("d.m.Y - H:i", $last_timestamp);
+
+// Vorrübergehend auskommentiert da keine aktuellen (auf Timestamp basierten) Daten vorliegen
+// $sql = "SELECT upload_id as time, status FROM mb_monitor WHERE fkey_wms_id=$1 AND upload_id > ".$last_timestamp;
+
+ $sql = "SELECT upload_id as time, status FROM mb_monitor WHERE fkey_wms_id=$1";
+
+ $v = array($wms_id);
+ $t = array('i');
+ $res = db_prep_query($sql, $v, $t);
+ $c = 0;
+ $positivStatus=0;
+
+ while($row = db_fetch_array($res)){
+
+ if ($row['status'] == "1" || $row['status'] == "0"){
+ $positivStatus++;
+ }
+ $c++;
+
+ }
+
+ $percent=0;
+
+ if ($c!=0){
+ $percent = ($positivStatus*100) / $c;
+ } else {
+ $percent = 0;
+ }
+
+ return number_format($percent,0, ",", ".") ;
+
+ }
+
+ function checkEPSG ($wms_id){
+
+ $sql = "SELECT wms.wms_id, wms_srs.wms_srs FROM wms, wms_srs where wms.wms_id=fkey_wms_id and wms.wms_id=$1";
+ $v = array($wms_id);
+ $t = array('i');
+ $res = db_prep_query($sql, $v, $t);
+ $c = 0;
+
+ $isequal = "false";
+ while($row = db_fetch_array($res)){
+
+ $wms_epsg = $row['wms_srs.wms_srs'];
+ $c++;
+
+ }
+
+ if ($wms_epsg==$this->epsg){
+ $isequal="true";
+ }
+ return $isequal;
+ }
+
+
+ function isPermissioned() {
+
+
+
+ }
+
+ function getPermissionValue($wms_id, $lay_id){
+ $return_permission="";
+ // get permission
+ if (in_array($lay_id, $this->mylayer)){
+ $return_permission = "true";
+ } 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 " .
+ "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;
+ }
+
+ function getPermissionValueForWFS($wfs_id, $wfs_conf_id){
+ $return_permission="";
+ // get permission
+ 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;
+ }
+
+
+ function getTermOfUse($wms_id){
+
+ $return_tou_id="";
+
+ $sql = "SELECT wms.wms_id, wms_termsofuse.fkey_wms_id, wms_termsofuse.fkey_termsofuse_id, termsofuse.termsofuse_id as tid " .
+ "FROM wms, wms_termsofuse, termsofuse " .
+ "where wms.wms_id=wms_termsofuse.fkey_wms_id " .
+ "and wms_termsofuse.fkey_termsofuse_id=termsofuse.termsofuse_id " .
+ "and wms.wms_id=$1";
+
+ $v = array($wms_id);
+ $t = array('i');
+ $res = db_prep_query($sql, $v, $t);
+
+ // get termsofuse_id
+ $termsofuse_id="";
+ while($row = db_fetch_array($res)){
+ $termsofuse_id = $row['tid'];
+// $return_tou_id = "mapbender/php/mod_termsofuse_service.php?id=".$termsofuse_id;
+ $return_tou_id = $termsofuse_id;
+
+ }
+
+ return $return_tou_id;
+
+ }
+
+ function generateNewReaArray($result){
+ global $con;
+// echo "func generateNewReaArray<br>";
+
+// $this->search_bbox;
+// $this->search_epsg;
+
+ $delColumns = array();
+
+ $columnsResult = array();
+
+ $db_epsg="";
+ $db_minx="";
+ $db_miny="";
+ $db_maxx="";
+ $db_maxy="";
+
+ $isIntersecting = "";
+
+ $anz = 0;
+
+ while($row = db_fetch_array($result)){
+
+
+ $status="";
+// echo $anz.". layer_id: ".$row['layer_id'];
+
+ //EPSG Vergleich
+ $sql_ac = "SELECT * FROM layer_epsg WHERE fkey_layer_id = $1";
+ $v = array($row["layer_id"]);
+ $t = array('i');
+ $res_ac = db_prep_query($sql_ac, $v, $t);
+
+ $tra_epsg="";
+ $tra_minx="";
+ $tra_miny="";
+ $tra_maxx="";
+ $tra_maxy="";
+
+
+
+ $i=0;
+ while($row_ac = db_fetch_array($res_ac)){
+
+ if ($row_ac["epsg"]=="EPSG:4326"){ // maybe for transformation needed
+ $db_epsg=$row_ac["epsg"];
+ $db_minx=$row_ac["minx"];
+ $db_miny=$row_ac["miny"];
+ $db_maxx=$row_ac["maxx"];
+ $db_maxy=$row_ac["maxy"];
+ }
+
+ if ($row_ac["epsg"]==$this->search_epsg){
+// if ($row_ac["epsg"]=="EPSG:31467"){
+
+ $db_epsg=$row_ac["epsg"];
+ $db_minx=$row_ac["minx"];
+ $db_miny=$row_ac["miny"];
+ $db_maxx=$row_ac["maxx"];
+ $db_maxy=$row_ac["maxy"];
+
+
+ $status="match";
+ break;
+
+ } else {
+
+
+ }
+ $i++;
+ }
+
+ if ($status=="match"){
+
+// echo "match<br>";
+
+ $temp = $this->search_bbox;
+
+ $isIntersecting = $this->intersect($temp[0], $temp[1], $temp[2], $temp[3], $db_minx, $db_miny, $db_maxx, $db_maxy, $this->search_epsg);
+
+
+ } else if ($status != "match" && $i>0){
+
+// echo "Transformation<br>";
+// Transformation
+
+ $temp = $this->search_bbox;
+
+ $sqlMinx = "SELECT X(transform(GeometryFromText('POINT(".$temp[0]." ".$temp[1].")',".str_replace("EPSG:","",$this->search_epsg)."), 4326)) as minx";
+
+ $resMinx = @pg_query($con,$sqlMinx);
+ $s_minx = pg_result($resMinx,0,"minx");
+
+ $sqlMiny = "SELECT Y(transform(GeometryFromText('POINT(".$temp[0]." ".$temp[1].")',".str_replace("EPSG:","",$this->search_epsg)."), 4326)) as miny";
+ $resMiny = @pg_query($con,$sqlMiny);
+ $s_miny = pg_result($resMiny,0,"miny");
+
+ $sqlMaxx = "SELECT X(transform(GeometryFromText('POINT(".$temp[2]." ".$temp[3].")',".str_replace("EPSG:","",$this->search_epsg)."), 4326)) as maxx";
+ $resMaxx = @pg_query($con,$sqlMaxx);
+ $s_maxx = pg_result($resMaxx,0,"maxx");
+
+ $sqlMaxy = "SELECT Y(transform(GeometryFromText('POINT(".$temp[2]." ".$temp[3].")',".str_replace("EPSG:","",$this->search_epsg)."), 4326)) as maxy";
+ $resMaxy = @pg_query($con,$sqlMaxy);
+ $s_maxy = pg_result($resMaxy,0,"maxy");
+
+ $isIntersecting = $this->intersect($s_minx, $s_miny, $s_maxx, $s_maxy, $db_minx, $db_miny, $db_maxx, $db_maxy, "EPSG:4326");
+
+ } else {
+// "no intersection possible()<br>";
+ $isIntersecting="f";
+ }
+
+ if ($isIntersecting=="t"){
+
+// Datensatz loeschen
+ array_push($columnsResult, $row);
+
+ }
+
+ $anz++;
+
+ }
+ return $columnsResult;
+
+ }
+
+ function intersect($s_minx, $s_miny, $s_maxx, $s_maxy, $db_minx, $db_miny, $db_maxx, $db_maxy, $epsg){
+ global $con;
+
+ $result="";
+
+ $sqlint = "SELECT intersects(envelope(geometryFROMtext('LINESTRING(".$s_minx." ".$s_miny.", ".$s_maxx." ".$s_maxy.")',".str_replace("EPSG:","",$epsg).")) " .
+ ",envelope(geometryFROMtext('LINESTRING(".$db_minx." ".$db_miny.", ".$db_maxx." ".$db_maxy.")',".str_replace("EPSG:","",$epsg).")))";
+
+ $resInt = @pg_query($con,$sqlint);
+ $result = pg_result($resInt,0,"intersects");
+
+ return $result;
+
+ }
+
+
+
+ /*
+ * Checks whether the keyword exist in the table keywords
+ *
+ * @todo is UPPER() working with mysql
+ * @param string the keyword
+ * @return integer the ID of the keyword
+ */
+ function exists($keyword){
+ global $con;
+ $sql = "SELECT keyword_id FROM keyword WHERE UPPER(keyword) = UPPER($1)";
+ $v = array($keyword);
+ $t = array('s');
+ $res = db_prep_query($sql,$v,$t);
+ if($row = db_fetch_array($res)){
+ return $row['keyword_id'];
+ }
+ else{
+ return false;
+ }
+ }
+
+
+ function getSQLBedfromArray($culumnName, $columnValues, $additionalChar){
+
+
+ $a = array();
+ $a = $columnValues;
+
+ $a_char = $additionalChar;
+ $colName=$culumnName;
+
+
+
+ $resultSql="";
+
+ for ($index = 0; $index < sizeof($a); $index++) {
+ $array_element = $a[$index];
+
+ if ($index<1){
+ $resultSql .= $colName."='".$a[$index]."'";
+ }else{
+
+ $resultSql .= " ".$a_char." " .$colName."='".$a[$index]."'";
+
+ }
+ }
+
+ return $resultSql;
+ }
+
+ function getDepartmentBed ($columnFkey, $culumnName, $columnValues, $additionalChar){
+
+ $a = array();
+ $a = $columnValues;
+
+ $colName=$culumnName;
+ $a_char = $additionalChar;
+
+ $resultSql = $columnFkey." in (SELECT mb_user_id FROM mb_user WHERE ";
+
+ for ($index = 0; $index < count($a); $index++) {
+ $array_element = $a[$index];
+
+ if ($index<1){
+ $resultSql .= $colName."='".$a[$index]."'";
+ }else{
+
+ $resultSql .= " ".$a_char." " .$colName."='".$a[$index]."'";
+
+ }
+ }
+ $resultSql .=")";
+
+ return $resultSql;
+ }
+
+ function getGeoType($wfs_id, $featureType_id){
+
+ $return_geoType="";
+
+ $sql = "SELECT element_type FROM wfs_element, wfs_featuretype " .
+ "where wfs_featuretype.featuretype_id=wfs_element.fkey_featuretype_id " .
+ "and element_name='the_geom'" .
+ "and wfs_featuretype.fkey_wfs_id = $1" .
+ "and wfs_element.fkey_featuretype_id=$2";
+
+ $v = array($wfs_id, $featureType_id);
+ $t = array('i', 'i');
+ $res = db_prep_query($sql, $v, $t);
+
+ // get element_type
+ while($row = db_fetch_array($res)){
+ $return_geoType = $row['element_type'];;
+ }
+
+ return $return_geoType;
+
+ }
+
+}
+
+?>
More information about the Mapbender_commits
mailing list