[Mapbender-commits] r9800 - trunk/mapbender/http/classes
svn_mapbender at osgeo.org
svn_mapbender at osgeo.org
Mon Oct 9 08:32:55 PDT 2017
Author: armin11
Date: 2017-10-09 08:32:55 -0700 (Mon, 09 Oct 2017)
New Revision: 9800
Modified:
trunk/mapbender/http/classes/class_crs.php
Log:
Fix
Modified: trunk/mapbender/http/classes/class_crs.php
===================================================================
--- trunk/mapbender/http/classes/class_crs.php 2017-10-06 13:21:21 UTC (rev 9799)
+++ trunk/mapbender/http/classes/class_crs.php 2017-10-09 15:32:55 UTC (rev 9800)
@@ -1,3 +1,4 @@
+<<<<<<< .mine
<?php
# http://www.mapbender2.org/index.php/class_crs.php
#
@@ -58,6 +59,250 @@
*/
//handles ows identifier: wms_1.0.0, wms_1.1.1, wms_1.3.0, wfs_1.0.0, wfs_1.1.0, wfs_2.0.0, wfs_2.0.2
public function alterAxisOrder ($targetOws) {
+ $owsWithSpecialOrder = array("wms_1.0.0","wms_1.1.1","wfs_1.0.0");//lon/lat,east/north
+ $owsWithOrderAsDefined = array("wms_1.3.0","wfs_1.1.0","wfs_2.0.0","wfs_2.0.2");
+ $order = "east,north"; //dummy postgis/oracle spatial order
+ if (in_array($targetOws, $owsWithSpecialOrder) && $this->identifierType == 'epsg' && $this->axisOrder !== $order) {
+ return false; //cause it is hardcoded in the specs to user lon/lat as this is so in postgis
+ } else {
+ if (in_array($targetOws, $owsWithOrderAsDefined) && $this->axisOrder !== $order) {
+ return true;
+ }
+ return false;
+ }
+ }
+
+ private function extractIdentifierType ($identifier) {
+ //check for type
+ if (substr(strtoupper($identifier), 0, 5) === "EPSG:") {
+ $this->identifier = $identifier;
+ $this->identifierType = 'epsg';
+ $this->identifierCode = explode(':',$identifier)[1];
+ return;
+ } else {
+ //check for urn based version - example: urn:ogc:def:crs:EPSG:
+ if (substr(strtoupper($identifier), 0, 21) === "URN:OGC:DEF:CRS:EPSG:") {
+ //delete this part from original identifier
+ $identifierNew = str_replace('URN:OGC:DEF:CRS:EPSG:','',strtoupper($identifier));
+ $this->identifier = $identifier;
+ $this->identifierType = 'urn';
+ $this->identifierCode = explode(':',$identifierNew)[1];
+ return;
+ } else {
+ if (substr($identifier, 0, 31) === 'http://www.opengis.net/def/crs/') {
+ $identifierNew = str_replace('http://www.opengis.net/def/crs/','',$identifier);
+ //remaining string: ({OGC|EPSG}/{0}/{code})
+ $this->identifier = $identifier;
+ $this->identifierType = 'url';
+ $this->identifierCode = explode('/',$identifierNew)[2];
+ return;
+ } else {
+ $this->identifier = $identifier;
+ $this->identifierType = 'other';
+ $this->identifierCode = $identifier;
+ }
+ }
+ }
+ }
+
+ private function resolveCrsInfo () {
+ $cache = new Cache();
+ //try to read from cache if already exists
+ if ($cache->isActive && $cache->cachedVariableExists(md5($this->identifier))) {
+ $cachedObject = json_decode($cache->cachedVariableFetch(md5($this->identifier)));
+ $this->gmlRepresentation = $cachedObject->gmlRepresentation;
+ $this->epsgType = $cachedObject->epsgType;
+ $this->axisOrder = $cachedObject->axisOrder;
+ $this->name = $cachedObject->name;
+ $e = new mb_notice("http/classes/class_crs.php - read crs info from cache!");
+ return true;
+ }
+ //built urls to get information from registries
+ switch ($this->identifierType) {
+ case "epsg":
+ $registryBaseUrl = "http://www.epsg-registry.org/export.htm?gml=";
+ $registryUrl = $registryBaseUrl.urlencode("urn:ogc:def:crs:EPSG::".$this->identifierCode);
+ break;
+ case "urn":
+ $registryBaseUrl = "http://www.epsg-registry.org/export.htm?gml=";
+ $registryUrl = $registryBaseUrl.urlencode($this->identifier);
+ /*$xpathCrsType = "";
+ $xpathAxis = "";*/
+ break;
+ case "url":
+ $registryBaseUrl = "http://www.epsg-registry.org/export.htm?gml=";
+ $registryUrl = $registryBaseUrl.urlencode("urn:ogc:def:crs:EPSG::".$this->identifierCode);
+ /*$xpathCrsType = "";
+ $xpathAxis = "";*/
+ break;
+ default:
+ break;
+ }
+ $crsConnector = new connector($registryUrl);
+ $crsConnector->set("timeOut", "2");
+ if ($crsConnector->timedOut == true) {
+ return false;
+ }
+ $this->gmlRepresentation = $crsConnector->file;
+ //generate separate jsonObject
+ $jsonCrsInfo->gmlRepresentation = $this->gmlRepresentation;
+ //parse relevant information
+ libxml_use_internal_errors(true);
+ try {
+ $crsXml = simplexml_load_string($this->gmlRepresentation);
+ if ($crsXml === false) {
+ foreach(libxml_get_errors() as $error) {
+ $err = new mb_exception("class_crs:".$error->message);
+ }
+ throw new Exception("class_crs:".'Cannot parse crs gml!');
+ return false;
+ }
+ }
+ catch (Exception $e) {
+ $err = new mb_exception("class_crs:".$e->getMessage());
+ return false;
+ }
+ //if parsing was successful
+ if ($crsXml !== false) {
+ $crsXml->registerXPathNamespace("epsg", "urn:x-ogp:spec:schema-xsd:EPSG:1.0:dataset");
+ $crsXml->registerXPathNamespace("gml", "http://www.opengis.net/gml/3.2");
+ $crsXml->registerXPathNamespace("xlink", "http://www.w3.org/1999/xlink");
+ //switch for type of cs - distinguish between ellipsoidalCS and CartesianCS (begin with lowercase character in crs document)
+ $this->epsgType = $crsXml->xpath('//gml:metaDataProperty/epsg:CommonMetaData/epsg:type');
+ $this->epsgType = $this->epsgType[0];
+ $this->name = $crsXml->xpath('//gml:name');
+ $this->name = $this->name[0];
+ $e = new mb_notice("http/classes/class_crs.php - name of crs: ".$this->name);
+ $jsonCrsInfo->name = (string)$this->name;
+ $jsonCrsInfo->epsgType = (string)$this->epsgType;
+ //echo $this->name;
+ //echo $this->epsgType;
+ //get attribute for specific system
+ switch ($this->epsgType) {
+ case "projected":
+ $xpathIdentifierCs = "//gml:cartesianCS/@xlink:href";
+ break;
+ case "geographic 2D":
+ $xpathIdentifierCs = "//gml:ellipsoidalCS/@xlink:href";
+ break;
+ }
+ $csIdentifier = $crsXml->xpath($xpathIdentifierCs);
+ $csIdentifier = $csIdentifier[0];
+ //get axis order from further xml document
+ $urlToCsDefinition = $registryBaseUrl.urlencode($csIdentifier);
+ $csConnector = new connector($urlToCsDefinition);
+ $csConnector->set("timeOut", "2");
+ if ($csConnector->timedOut == true) {
+ return false;
+ }
+ $csGmlRepresentation = $csConnector->file;
+ try {
+ $csXml = simplexml_load_string($csGmlRepresentation);
+ if ($csXml === false) {
+ foreach(libxml_get_errors() as $error) {
+ $err = new mb_exception("class_crs:".$error->message);
+ }
+ throw new Exception("class_crs: Cannot parse cs gml!");
+ return false;
+ }
+ }
+ catch (Exception $e) {
+ $err = new mb_exception("class_cs:".$e->getMessage());
+ return false;
+ }
+ if ($csXml !== false) {
+ $csXml->registerXPathNamespace("epsg", "urn:x-ogp:spec:schema-xsd:EPSG:1.0:dataset");
+ $csXml->registerXPathNamespace("gml", "http://www.opengis.net/gml/3.2");
+ $csXml->registerXPathNamespace("xlink", "http://www.w3.org/1999/xlink");
+ //switch for type of cs - distinguish between ellipsoidalCS and CartesianCS (begin with lowercase character in crs document)
+ $axis = $csXml->xpath('//gml:axis/gml:CoordinateSystemAxis/gml:axisDirection');
+ //TODO - think about it? switch for crs lookup table of crs which axis order was swapped from earlier ogc standards to newer - identify them by the usage og EPSG:XXXX notation - no good idea
+ /*if (DEFINED("OLD_EPSG_AXIS_ORDER_ALTERED") && OLD_EPSG_AXIS_ORDER_ALTERED !== "") {
+ $old_epsg_axis_order_altered = explode(",", OLD_EPSG_AXIS_ORDER_ALTERED);
+ } else {
+ $old_epsg_axis_order_altered = array();
+ }
+ if ($this->identifierType == 'epsg' && in_array($this->identifierCode, $old_epsg_axis_order_altered)) {
+ $this->axisOrder = $axis[1].",".$axis[0];
+ } else {
+ $this->axisOrder = $axis[0].",".$axis[1];
+ }*/
+ $this->axisOrder = $axis[0].",".$axis[1];
+ $jsonCrsInfo->axisOrder = $this->axisOrder;
+ }
+ }
+ //store information - maybe to cache, if it does not already exists!
+ if ($cache->isActive && $cache->cachedVariableExists(md5($this->identifier)) == false) {
+ $cache->cachedVariableAdd(md5($this->identifier), json_encode($jsonCrsInfo));
+ $e = new mb_notice("http/classes/class_crs.php - store crs info to cache!");
+ return true;
+ }
+ return true;
+ }
+}
+
+?>
+=======
+<?php
+# http://www.mapbender2.org/index.php/class_crs.php
+#
+# 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__)."/../../core/globalSettings.php");
+require_once(dirname(__FILE__)."/../../conf/altered_axis_epsg.php");
+require_once(dirname(__FILE__)."/class_connector.php");
+require_once(dirname(__FILE__)."/class_cache.php");
+
+/**
+ * A class to handle information about different CoordinateReferenceSystems. The class tries to call the epsg registry an pulls some
+ * information from it. The handling of CRS axis in different ows is not really homogeneous.
+ * Further information:
+ * https://themes.jrc.ec.europa.eu/discussion/view/109106/fyi-interpreted-coordinate-order-flipped-in-gml-files-with-uri-format-srsname
+ * http://postgis.net/2013/08/18/tip_lon_lat/
+ * https://github.com/deegree/deegree3/wiki/Axis-order-handling
+ * http://docs.geotools.org/latest/userguide/library/referencing/order.html
+ * http://mapserver.org/ogc/wms_server.html
+ */
+
+class Crs {
+ var $identifierType; //'epsg', 'urn', 'url', 'other'
+ var $identifierCode;
+ var $identifier;
+ var $name;
+ var $gmlRepresentation;
+ var $epsgType; // false, 'geographic 2D', 'projected', '...'
+ var $axisOrder; //different types:'east,north' - ('lon,lat') or 'north,east' - ('lat,lon')
+ //preasume, that the old order is always lon/lat for geo and east/north for projected systems
+ var $resolveSuccess;
+ var $resolveOrigin;
+ var $resolveErrorMessage;
+
+ public function __construct ($identifier) {
+ $this->resolveSuccess = false;
+ $this->resolveErrorMessage = false;
+ $this->extractIdentifierType($identifier);
+ if ($this->resolveCrsInfo() == true) {
+ $this->resolveSuccess = true;
+ }
+ }
+/**
+ * A public function whith a parameter for {owstype}_{version}. If the ows needs a swap of the crs axis order true is returned,
+ * otherwise - if the axis are handled as they are defined in the epsg registry - the function returns false
+ */
+ //handles ows identifier: wms_1.0.0, wms_1.1.1, wms_1.3.0, wfs_1.0.0, wfs_1.1.0, wfs_2.0.0, wfs_2.0.2
+ public function alterAxisOrder ($targetOws) {
$owsWithSpecialOrder = array("wms_1.0.0","wms_1.1.1","wfs_1.0.0");
$order = "east,north";
if (in_array($targetOws, $owsWithSpecialOrder) && $this->identifierType == 'epsg' && $this->axisOrder !== $order) {
@@ -237,3 +482,4 @@
}
?>
+>>>>>>> .r9799
More information about the Mapbender_commits
mailing list