__init__.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. logging.debug(self.capabilities.contents)
  25. for name in self.capabilities.contents:
  26. layer = self.capabilities.contents[name]
  27. logging.debug("Creating layer %s" % name)
  28. lyrobj = mapscript.layerObj(mapobj)
  29. lyrobj.name = name.replace(":","_")
  30. #lyrobj.name = name
  31. lyrobj.title = layer.title
  32. if layer.title:
  33. lyrobj.setMetaData("wms_title",layer.title)
  34. #if layer.abstract:
  35. # lyrobj.setMetaData("ows_abstract", layer.abstract)
  36. lyrobj.setMetaData("wfs_typename", name)
  37. lyrobj.setMetaData("wfs_version",self.capabilities.version)
  38. lyrobj.setMetaData("gml_include_items","all")
  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(layer,layer.crsOptions[0])
  45. if extent:
  46. lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
  47. (extent[0],extent[1],extent[2],extent[3]))
  48. lyrobj.type = self._getLayerType(ogrLayer)
  49. else:
  50. mapobj.removeLayer(mapobj.numlayers-1)
  51. logging.debug("No ogrDataSource found")
  52. continue
  53. lyrobj.setProjection(layer.crsOptions[0])
  54. lyrobj.dump = mapscript.MS_TRUE
  55. lyrobj.template = "foo"
  56. cls = mapscript.classObj(lyrobj)
  57. style = mapscript.styleObj(cls)
  58. style.outlinecolor=mapscript.colorObj(134,81,0)
  59. style.color=mapscript.colorObj(238,153,0)
  60. style.size=5
  61. style.width=5
  62. self.saveMapfile(mapobj,mapfilename)
  63. return mapobj
  64. def getGeomName(self,geomname):
  65. if geomname.find("LINE") > -1:
  66. return mapscript.MS_LAYER_LINE
  67. elif geomname.find("POLYGON") > -1:
  68. return mapscript.MS_LAYER_POLYGON
  69. else:
  70. return mapscript.MS_LAYER_POINT
  71. def setMapName(self,mapobj):
  72. mapobj.name = self.config.get("MapServer","name")
  73. if self.capabilities.identification.title:
  74. mapobj.setMetaData("wms_title",self.capabilities.identification.title)
  75. if self.capabilities.identification.abstract:
  76. mapobj.setMetaData("wms_abstract",self.capabilities.identification.abstract)
  77. def _getLayerType(self,layer):
  78. """Returns MS layer type based on ogr.Layer.GetGeomType
  79. with ogr:
  80. wkbGeometryCollection = 7
  81. wkbGeometryCollection25D = -2147483641
  82. wkbLineString = 2
  83. wkbLineString25D = -2147483646
  84. wkbLinearRing = 101
  85. wkbMultiLineString = 5
  86. wkbMultiLineString25D = -2147483643
  87. wkbMultiPoint = 4
  88. wkbMultiPoint25D = -2147483644
  89. wkbMultiPolygon = 6
  90. wkbMultiPolygon25D = -2147483642
  91. wkbNDR = 1
  92. wkbNone = 100
  93. wkbPoint = 1
  94. wkbPoint25D = -2147483647
  95. wkbPolygon = 3
  96. wkbPolygon25D = -2147483645
  97. wkbUnknown = 0
  98. """
  99. geomType = layer.GetGeomType()
  100. if geomType in [ogr.wkbPolygon,
  101. ogr.wkbMultiPolygon,
  102. ogr.wkbLinearRing]:
  103. return mapscript.MS_LAYER_POLYGON
  104. elif geomType in [ogr.wkbLineString,
  105. ogr.wkbMultiLineString]:
  106. return mapscript.MS_LAYER_LINE
  107. else:
  108. return mapscript.MS_LAYER_POINT