| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #!/usr/bin/env python
- # coding=utf-8
- from OWS import OWS
- import mapscript
- import cgi
- from lxml import objectify
- import urllib
- import urlparse
- import logging
- from osgeo import ogr
- import os
- 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)
- def makeMap(self,mapfilename=None):
- mapobj = self.getMapObj(mapfilename)
- self.layerDefFile = self.createLayerDefinitionFile("wfs",
- os.path.join( os.path.dirname(__file__), "templates",'wfs.xml'))
- ds = ogr.Open(self.layerDefFile)
- self.setMapName(mapobj)
- for layer in self.capabilities.FeatureTypeList.getchildren():
- if layer.tag != "{http://www.opengis.net/wfs}FeatureType":
- continue
- name = layer.Name.text
- logging.debug("Creating layer %s" % name)
- lyrobj = mapscript.layerObj(mapobj)
- lyrobj.name = name
- lyrobj.title = layer.Title.text
- lyrobj.setMetaData("wms_title",layer.Title.text)
- 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 = self.layerDefFile
- lyrobj.data = name
- if ds:
- ogrLayer = ds.GetLayerByName(name)
- extent = self.getLayerExtent(ogrLayer)
- lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
- (extent[0],extent[1],extent[2],extent[3]))
- if ogrLayer:
- feature = ogrLayer.GetNextFeature()
- if feature:
- geom = feature.GetGeometryRef()
- if geom:
- lyrobj.type = self.getGeomName(geom.GetGeometryName())
- else:
- mapobj.removeLayer(mapobj.numlayers-1)
- logging.debug("No ogrGeometry found")
- continue
- else:
- mapobj.removeLayer(mapobj.numlayers-1)
- logging.debug("No ogrFeature found")
- continue
- else:
- mapobj.removeLayer(mapobj.numlayers-1)
- logging.debug("No ogrLayer found")
- continue
- else:
- mapobj.removeLayer(mapobj.numlayers-1)
- logging.debug("No ogrDataSource found")
- continue
- if self.capabilities.attrib["version"] == "1.0.0":
- lyrobj.setProjection(layer.SRS.text)
- else:
- lyrobj.setProjection(layer.DefaultSRS.text)
- lyrobj.dump = mapscript.MS_TRUE
- lyrobj.template = "foo"
- cls = mapscript.classObj(lyrobj)
- style = mapscript.styleObj(cls)
- style.outlinecolor=mapscript.colorObj(134,81,0)
- style.color=mapscript.colorObj(238,153,0)
- style.size=5
- style.width=5
- self.saveMapfile(mapobj,mapfilename)
- return mapobj
-
- def getGeomName(self,geomname):
- if geomname.find("LINE") > -1:
- return mapscript.MS_LAYER_LINE
- elif geomname.find("POLYGON") > -1:
- return mapscript.MS_LAYER_POLYGON
- else:
- return mapscript.MS_LAYER_POINT
- def setMapName(self,mapobj):
- mapobj.name = self.config.get("MapServer","name")
- if self.capabilities.attrib["version"] == "1.0.0":
- mapobj.setMetaData("wms_title",self.capabilities["{%s}%s"%(self.wfsns,"Service")].Title.text)
- mapobj.setMetaData("wms_abstract",self.capabilities.Service.Abstract.text)
- 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
|