__init__.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. def __init__(self,url=None,qstring=None,configFiles=None):
  16. OWS.__init__(self,url,qstring)
  17. def makeMap(self,mapfilename=None):
  18. mapobj = self.getMapObj(mapfilename)
  19. layerDefFile = self.createLayerDefinitionFile("wfs",
  20. os.path.join( os.path.dirname(__file__), "templates",'wfs.xml'))
  21. ds = ogr.Open(layerDefFile)
  22. self.setMapName(mapobj)
  23. for layer in self.capabilities.FeatureTypeList.getchildren():
  24. if layer.tag != "{http://www.opengis.net/wfs}FeatureType":
  25. continue
  26. name = layer.Name.text
  27. logging.debug("Creating layer %s" % name)
  28. lyrobj = mapscript.layerObj(mapobj)
  29. lyrobj.name = name
  30. lyrobj.title = layer.Title.text
  31. lyrobj.setMetaData("wms_title",layer.Title.text)
  32. if "{%s}%s" % ("http://www.opengis.net/wfs","Abstract") in layer:
  33. lyrobj.setMetaData("ows_abstract", layer["{%s}%s" % ("http://www.opengis.net/wfs","Abstract")].text)
  34. lyrobj.setMetaData("wfs_typename",layer.Name.text)
  35. lyrobj.setMetaData("wfs_version",self.capabilities.attrib["version"])
  36. lyrobj.setConnectionType(mapscript.MS_OGR,'')
  37. lyrobj.connection = layerDefFile
  38. lyrobj.data = name
  39. if ds:
  40. ogrLayer = ds.GetLayerByName(name)
  41. e = ogrLayer.GetExtent()
  42. lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
  43. (e[0],e[2],e[1],e[3]))
  44. if ogrLayer:
  45. feature = ogrLayer.GetNextFeature()
  46. if feature:
  47. geom = feature.GetGeometryRef()
  48. if geom:
  49. lyrobj.type = self.getGeomName(geom.GetGeometryName())
  50. else:
  51. mapobj.removeLayer(mapobj.numlayers-1)
  52. logging.debug("No ogrGeometry found")
  53. continue
  54. else:
  55. mapobj.removeLayer(mapobj.numlayers-1)
  56. logging.debug("No ogrFeature found")
  57. continue
  58. else:
  59. mapobj.removeLayer(mapobj.numlayers-1)
  60. logging.debug("No ogrLayer found")
  61. continue
  62. else:
  63. mapobj.removeLayer(mapobj.numlayers-1)
  64. logging.debug("No ogrDataSource found")
  65. continue
  66. if self.capabilities.attrib["version"] == "1.0.0":
  67. lyrobj.setProjection(layer.SRS.text)
  68. else:
  69. lyrobj.setProjection(layer.DefaultSRS.text)
  70. lyrobj.dump = mapscript.MS_TRUE
  71. lyrobj.template = "foo"
  72. cls = mapscript.classObj(lyrobj)
  73. style = mapscript.styleObj(cls)
  74. style.outlinecolor=mapscript.colorObj(134,81,0)
  75. style.color=mapscript.colorObj(238,153,0)
  76. style.size=5
  77. style.width=5
  78. self.saveMapfile(mapobj,mapfilename)
  79. return mapobj
  80. def getGeomName(self,geomname):
  81. if geomname.find("LINE") > -1:
  82. return mapscript.MS_LAYER_LINE
  83. elif geomname.find("POLYGON") > -1:
  84. return mapscript.MS_LAYER_POLYGON
  85. else:
  86. return mapscript.MS_LAYER_POINT
  87. def setMapName(self,mapobj):
  88. mapobj.name = self.config.get("MapServer","name")
  89. if self.capabilities.attrib["version"] == "1.0.0":
  90. mapobj.setMetaData("wms_title",self.capabilities["{%s}%s"%(self.wfsns,"Service")].Title.text)
  91. mapobj.setMetaData("wms_abstract",self.capabilities.Service.Abstract.text)
  92. else:
  93. mapobj.setMetaData("wms_title",self.capabilities["{%s}%s"%(self.owsns,"ServiceIdentification")].Title.text)
  94. mapobj.setMetaData("wms_abstract",self.capabilities["{%s}%s"%(self.owsns,"ServiceIdentification")].Abstract.text)