__init__.py 3.3 KB

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