Jachym Cepicky 14 rokov pred
rodič
commit
cf17f2fc3c
4 zmenil súbory, kde vykonal 56 pridanie a 11 odobranie
  1. 10 0
      OWS.py
  2. 1 1
      tests/mapfiles/ows.map
  3. 10 4
      tests/test_wfs.py
  4. 35 6
      wfs/__init__.py

+ 10 - 0
OWS.py

@@ -66,6 +66,16 @@ class OWS:
         else:
             params["SERVICE"] = self.service
 
+        # HACK HACK HACK
+        # 1.0.0 works
+        # 1.1.0 reverses axes, while OGR is requesting the FeatureType
+        # using BBOX FILTER
+        if "version" in params:
+            params["version"] = "1.0.0"
+        else:
+            params["VERSION"] = "1.0.0"
+
+
         url = urlparse.urlunparse((self.parsedUrl[0],
                                     self.parsedUrl[1],
                                     self.parsedUrl[2],

+ 1 - 1
tests/mapfiles/ows.map

@@ -40,7 +40,7 @@ LAYER
   PROJECTION
     "init=epsg:4326"
   END
-  EXTENT 13.250490 48.958980 16.590330 50.409180
+  EXTENT 12.735342 48.152419 18.612816 51.431833
   DUMP TRUE           ## REQUIRED
   CLASS
     NAME "Linie"

+ 10 - 4
tests/test_wfs.py

@@ -2,7 +2,7 @@
 # coding=utf-8
 
 import os
-from test_ows import TestOWS
+from test_ows import *
 
 import wfs
 import unittest
@@ -10,6 +10,7 @@ import urllib
 import urlparse
 import mapscript
 from lxml import objectify
+from osgeo import ogr
 
 class TestWFS(TestOWS):
 
@@ -32,9 +33,14 @@ class TestWFS(TestOWS):
         self.assertEquals(self.capabilities.Capability.tag,"{http://www.opengis.net/wms}Capability")
         self.assertEquals(self.capabilities.Capability.Layer.Layer.Name.text, "line")
         self.assertEquals(self.capabilities.Capability.Layer.Layer.Abstract.text, "My abstract")
-
-        # http://localhost/cgi-bin/owsproxy.cgi?owsUrl=http%3A//localhost/cgi-bin/mapserv%3Fmap=/home/jachym/usr/src/hsrs/owsproxy/tests/mapfiles/ows.map&owsService=WFS&version=1.3.0
-        # http://localhost/cgi-bin/owsproxy.cgi?owsUrl=http%3A//bnhelp.cz/ows/crwfs&owsService=WFS&version=1.1.0
+        # test the wfs extent 
+        ds = ogr.Open(self.service.layerDefFile)
+        lineLayer = ds.GetLayer()
+        self.service.capabilities.attrib["version"] = "1.1.0"
+        self.assertEquals((48.152419, 12.735342, 51.431833, 18.612816),self.service.getLayerExtent(lineLayer))
+        self.service.capabilities.attrib["version"] = "1.0.0"
+        self.assertEquals((12.735342,48.152419,18.612816,51.431833),self.service.getLayerExtent(lineLayer))
+        self.service.capabilities.attrib["version"] = "1.1.0"
 
 if __name__ == "__main__":
     unittest.main()

+ 35 - 6
wfs/__init__.py

@@ -16,6 +16,7 @@ class WFS(OWS):
 
     service = "WFS"
     wfsns = "http://www.opengis.net/wfs"
+    layerDefFile = None
 
     def __init__(self,url=None,qstring=None,configFiles=None):
         OWS.__init__(self,url,qstring)
@@ -24,10 +25,10 @@ class WFS(OWS):
 
         mapobj = self.getMapObj(mapfilename)
 
-        layerDefFile = self.createLayerDefinitionFile("wfs",
+        self.layerDefFile = self.createLayerDefinitionFile("wfs",
                 os.path.join( os.path.dirname(__file__), "templates",'wfs.xml'))
 
-        ds = ogr.Open(layerDefFile)
+        ds = ogr.Open(self.layerDefFile)
 
         self.setMapName(mapobj)
 
@@ -42,19 +43,21 @@ class WFS(OWS):
             lyrobj.name = name
             lyrobj.title = layer.Title.text
             lyrobj.setMetaData("wms_title",layer.Title.text)
-            if "{%s}%s" % ("http://www.opengis.net/wfs","Abstract") in layer:
+            try:
                 lyrobj.setMetaData("ows_abstract",  layer["{%s}%s" % ("http://www.opengis.net/wfs","Abstract")].text)
+            except: 
+                pass
             lyrobj.setMetaData("wfs_typename",layer.Name.text)
             lyrobj.setMetaData("wfs_version",self.capabilities.attrib["version"])
             lyrobj.setConnectionType(mapscript.MS_OGR,'')
-            lyrobj.connection = layerDefFile
+            lyrobj.connection = self.layerDefFile
             lyrobj.data = name
 
             if ds:
                 ogrLayer = ds.GetLayerByName(name)
-                e = ogrLayer.GetExtent()
+                extent = self.getLayerExtent(ogrLayer)
                 lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
-                        (e[0],e[2],e[1],e[3]))
+                        (extent[0],extent[1],extent[2],extent[3]))
                 if ogrLayer:
                     feature = ogrLayer.GetNextFeature()
                     if feature:
@@ -113,3 +116,29 @@ class WFS(OWS):
         else:
             mapobj.setMetaData("wms_title",self.capabilities["{%s}%s"%(self.owsns,"ServiceIdentification")].Title.text)
             mapobj.setMetaData("wms_abstract",self.capabilities["{%s}%s"%(self.owsns,"ServiceIdentification")].Abstract.text)
+
+    def getLayerExtent(self,layer):
+        """Get extent of layer in form of minx, miny, maxx,maxy
+        """
+
+        # in WFS 1.1 is inverted axes orientation for some epsg
+        # codes (4000-5000)
+        # According to FrankW, python gdal-1.8.0 does not export
+        # ReferenceSystem.GetAxis() method
+        # so , if WFS version == 1.0.0 AND 4000<=ESPSG<=5000
+        # invert the axes
+        sr =  layer.GetSpatialRef()
+        sr.AutoIdentifyEPSG()
+        e = layer.GetExtent()
+        if 4000 <= int(sr.GetAuthorityCode('GEOGCS')) <= 5000 and \
+                self.capabilities.attrib["version"] == "1.1.0":
+            # invert X and Y
+            extent = (e[2],e[0],e[3],e[1])
+
+        else:
+            extent = (e[0],e[2],e[1],e[3])
+
+        logging.debug("Setting extent for layer <%s> to %s" %\
+                (layer.GetName(),extent))
+        return extent
+