__init__.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. from OWS import OWS
  4. import mapscript
  5. import cgi
  6. from lxml import objectify
  7. import urllib
  8. import urlparse
  9. import logging
  10. from osgeo import ogr
  11. import os
  12. class WFS(OWS):
  13. service = "WFS"
  14. wfsns = "http://www.opengis.net/wfs"
  15. layerDefFile = None
  16. def __init__(self,url=None,qstring=None,configFiles=None):
  17. OWS.__init__(self,url,qstring)
  18. def makeMap(self,mapfilename=None):
  19. mapobj = self.getMapObj(mapfilename)
  20. self.layerDefFile = self.createLayerDefinitionFile("wfs",
  21. os.path.join( os.path.dirname(__file__), "templates",'wfs.xml'))
  22. ds = ogr.Open(self.layerDefFile)
  23. self.setMapName(mapobj)
  24. for layer in self.capabilities.FeatureTypeList.getchildren():
  25. if layer.tag != "{http://www.opengis.net/wfs}FeatureType":
  26. continue
  27. name = layer.Name.text
  28. logging.debug("Creating layer %s" % name)
  29. lyrobj = mapscript.layerObj(mapobj)
  30. lyrobj.name = name
  31. lyrobj.title = layer.Title.text
  32. lyrobj.setMetaData("wms_title",layer.Title.text)
  33. try:
  34. lyrobj.setMetaData("ows_abstract", layer["{%s}%s" % ("http://www.opengis.net/wfs","Abstract")].text)
  35. except:
  36. pass
  37. lyrobj.setMetaData("wfs_typename",layer.Name.text)
  38. lyrobj.setMetaData("wfs_version",self.capabilities.attrib["version"])
  39. lyrobj.setConnectionType(mapscript.MS_OGR,'')
  40. lyrobj.connection = self.layerDefFile
  41. lyrobj.data = name
  42. if ds:
  43. ogrLayer = ds.GetLayerByName(name)
  44. extent = self.getLayerExtent(ogrLayer)
  45. lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
  46. (extent[0],extent[1],extent[2],extent[3]))
  47. if ogrLayer:
  48. feature = ogrLayer.GetNextFeature()
  49. if feature:
  50. geom = feature.GetGeometryRef()
  51. if geom:
  52. lyrobj.type = self.getGeomName(geom.GetGeometryName())
  53. else:
  54. mapobj.removeLayer(mapobj.numlayers-1)
  55. logging.debug("No ogrGeometry found")
  56. continue
  57. else:
  58. mapobj.removeLayer(mapobj.numlayers-1)
  59. logging.debug("No ogrFeature found")
  60. continue
  61. else:
  62. mapobj.removeLayer(mapobj.numlayers-1)
  63. logging.debug("No ogrLayer found")
  64. continue
  65. else:
  66. mapobj.removeLayer(mapobj.numlayers-1)
  67. logging.debug("No ogrDataSource found")
  68. continue
  69. if self.capabilities.attrib["version"] == "1.0.0":
  70. lyrobj.setProjection(layer.SRS.text)
  71. else:
  72. lyrobj.setProjection(layer.DefaultSRS.text)
  73. lyrobj.dump = mapscript.MS_TRUE
  74. lyrobj.template = "foo"
  75. cls = mapscript.classObj(lyrobj)
  76. style = mapscript.styleObj(cls)
  77. style.outlinecolor=mapscript.colorObj(134,81,0)
  78. style.color=mapscript.colorObj(238,153,0)
  79. style.size=5
  80. style.width=5
  81. self.saveMapfile(mapobj,mapfilename)
  82. return mapobj
  83. def getGeomName(self,geomname):
  84. if geomname.find("LINE") > -1:
  85. return mapscript.MS_LAYER_LINE
  86. elif geomname.find("POLYGON") > -1:
  87. return mapscript.MS_LAYER_POLYGON
  88. else:
  89. return mapscript.MS_LAYER_POINT
  90. def setMapName(self,mapobj):
  91. mapobj.name = self.config.get("MapServer","name")
  92. if self.capabilities.attrib["version"] == "1.0.0":
  93. mapobj.setMetaData("wms_title",self.capabilities["{%s}%s"%(self.wfsns,"Service")].Title.text)
  94. mapobj.setMetaData("wms_abstract",self.capabilities.Service.Abstract.text)
  95. else:
  96. mapobj.setMetaData("wms_title",self.capabilities["{%s}%s"%(self.owsns,"ServiceIdentification")].Title.text)
  97. mapobj.setMetaData("wms_abstract",self.capabilities["{%s}%s"%(self.owsns,"ServiceIdentification")].Abstract.text)
  98. def getLayerExtent(self,layer):
  99. """Get extent of layer in form of minx, miny, maxx,maxy
  100. """
  101. # in WFS 1.1 is inverted axes orientation for some epsg
  102. # codes (4000-5000)
  103. # According to FrankW, python gdal-1.8.0 does not export
  104. # ReferenceSystem.GetAxis() method
  105. # so , if WFS version == 1.0.0 AND 4000<=ESPSG<=5000
  106. # invert the axes
  107. sr = layer.GetSpatialRef()
  108. sr.AutoIdentifyEPSG()
  109. e = layer.GetExtent()
  110. if 4000 <= int(sr.GetAuthorityCode('GEOGCS')) <= 5000 and \
  111. self.capabilities.attrib["version"] == "1.1.0":
  112. # invert X and Y
  113. extent = (e[2],e[0],e[3],e[1])
  114. else:
  115. extent = (e[0],e[2],e[1],e[3])
  116. logging.debug("Setting extent for layer <%s> to %s" %\
  117. (layer.GetName(),extent))
  118. return extent