| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- #!/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 pyproj
- import os
- import re
- class WFS(OWS):
- service = "WFS"
- wfsns = "http://www.opengis.net/wfs"
- layerDefFile = None
- lyrobj = None
- def __init__(self,url=None,qstring=None,configFile=None):
- OWS.__init__(self,url,qstring,configFile)
- 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)
- logging.debug(self.capabilities.contents)
- srss = []
- for name in self.capabilities.contents:
-
- mapobj.setMetaData("wms_srs",self.config.get("MapServer","srs"))
- mapobj.setMetaData("wfs_srs",self.config.get("MapServer","srs"))
- layer = self.capabilities.contents[name]
- logging.debug("Creating layer %s" % name)
- srss = srss+filter(lambda y: not y in srss,layer.crsOptions)
- lyrobj = mapscript.layerObj(mapobj)
- #lyrobj.name = name.replace(":","_")
- lyrobj.name = name
- lyrobj.title = layer.title
- if layer.title:
- lyrobj.setMetaData("wms_title",layer.title)
- lyrobj.setMetaData("wfs_title",layer.title)
- #if layer.abstract:
- # lyrobj.setMetaData("ows_abstract", layer.abstract)
- lyrobj.setMetaData("wfs_typename", name)
- logging.debug("WFS version %s",self.capabilities.version)
- lyrobj.setMetaData("wfs_version",self.capabilities.version)
- lyrobj.setMetaData("gml_include_items","all")
- lyrobj.setMetaData("wfs_request_method","GET")
- lyrobj.setConnectionType(mapscript.MS_WFS,'')
- lyrobj.connection = self.getLayerUrl()
- lyrobj.data = re.sub(r".*:","",name)
- if ds:
- ogrLayer = ds.GetLayerByName(name)
- extent = self.getLayerExtent(layer,layer.crsOptions[0])
- if extent:
- lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
- (extent[0],extent[1],extent[2],extent[3]))
- lyrobj.setMetaData("wfs_extent","%s %s %s %s" % \
- (extent[0],extent[1],extent[2],extent[3]))
- lyrobj.type = self._getLayerType(ogrLayer)
- else:
- mapobj.removeLayer(mapobj.numlayers-1)
- logging.debug("No ogrDataSource found")
- continue
- #lyrobj.setProjection(self.__getLayerCrs(layer.crsOptions))
- lyrobj.setProjection(layer.crsOptions[0].getcode())
- 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
- ## overwrite already set SRSs
- #if len(srss) > 0:
- # logging.debug("Overwriting SRS option")
- # mapobj.setMetaData("wms_srs"," ".join(srss))
- 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.identification.title:
- mapobj.setMetaData("wms_title",self.capabilities.identification.title)
- mapobj.setMetaData("wfs_title",self.capabilities.identification.title)
- if self.capabilities.identification.abstract:
- mapobj.setMetaData("wms_abstract",self.capabilities.identification.abstract)
- mapobj.setMetaData("wfs_abstract",self.capabilities.identification.abstract)
- def _getLayerType(self,layer):
- """Returns MS layer type based on ogr.Layer.GetGeomType
- with ogr:
- wkbGeometryCollection = 7
- wkbGeometryCollection25D = -2147483641
- wkbLineString = 2
- wkbLineString25D = -2147483646
- wkbLinearRing = 101
- wkbMultiLineString = 5
- wkbMultiLineString25D = -2147483643
- wkbMultiPoint = 4
- wkbMultiPoint25D = -2147483644
- wkbMultiPolygon = 6
- wkbMultiPolygon25D = -2147483642
- wkbNDR = 1
- wkbNone = 100
- wkbPoint = 1
- wkbPoint25D = -2147483647
- wkbPolygon = 3
- wkbPolygon25D = -2147483645
- wkbUnknown = 0
- """
- geomType = layer.GetGeomType()
- if geomType == 0: # unknown
- # brutal force way
- f = layer.GetNextFeature()
- if f:
- gr = f.GetGeometryRef()
- geomType = gr.GetGeometryType()
- if geomType in [ogr.wkbPolygon,
- ogr.wkbMultiPolygon,
- ogr.wkbLinearRing]:
- return mapscript.MS_LAYER_POLYGON
- elif geomType in [ogr.wkbLineString,
- ogr.wkbMultiLineString]:
- return mapscript.MS_LAYER_LINE
- else:
- return mapscript.MS_LAYER_POINT
- def __getLayerCrs(self,crss):
- """
- Returns bests (non-degree) coordinate system of the layer, which is
- available.
- Ofcourse, sometimes, there is no other option, there EPSG:4326, but
- take somethign else, if you can
- """
- for crs in crss:
- try:
- proj = pyproj.Proj("+init=%s"%crs)
- if proj.is_latlon():
- continue
- else:
- return crs
- except:
- pass
- return crss[0]
|