__init__.py 4.4 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.setMetaData("wfs_request_method","GET")
  40. lyrobj.setConnectionType(mapscript.MS_WFS,'')
  41. lyrobj.connection = self.getLayerUrl()
  42. lyrobj.data = name
  43. if ds:
  44. ogrLayer = ds.GetLayerByName(name)
  45. extent = self.getLayerExtent(layer,layer.crsOptions[0])
  46. if extent:
  47. lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
  48. (extent[0],extent[1],extent[2],extent[3]))
  49. lyrobj.type = self._getLayerType(ogrLayer)
  50. else:
  51. mapobj.removeLayer(mapobj.numlayers-1)
  52. logging.debug("No ogrDataSource found")
  53. continue
  54. lyrobj.setProjection(layer.crsOptions[0])
  55. lyrobj.dump = mapscript.MS_TRUE
  56. lyrobj.template = "foo"
  57. cls = mapscript.classObj(lyrobj)
  58. style = mapscript.styleObj(cls)
  59. style.outlinecolor=mapscript.colorObj(134,81,0)
  60. style.color=mapscript.colorObj(238,153,0)
  61. style.size=5
  62. style.width=5
  63. self.saveMapfile(mapobj,mapfilename)
  64. return mapobj
  65. def getGeomName(self,geomname):
  66. if geomname.find("LINE") > -1:
  67. return mapscript.MS_LAYER_LINE
  68. elif geomname.find("POLYGON") > -1:
  69. return mapscript.MS_LAYER_POLYGON
  70. else:
  71. return mapscript.MS_LAYER_POINT
  72. def setMapName(self,mapobj):
  73. mapobj.name = self.config.get("MapServer","name")
  74. if self.capabilities.identification.title:
  75. mapobj.setMetaData("wms_title",self.capabilities.identification.title)
  76. if self.capabilities.identification.abstract:
  77. mapobj.setMetaData("wms_abstract",self.capabilities.identification.abstract)
  78. def _getLayerType(self,layer):
  79. """Returns MS layer type based on ogr.Layer.GetGeomType
  80. with ogr:
  81. wkbGeometryCollection = 7
  82. wkbGeometryCollection25D = -2147483641
  83. wkbLineString = 2
  84. wkbLineString25D = -2147483646
  85. wkbLinearRing = 101
  86. wkbMultiLineString = 5
  87. wkbMultiLineString25D = -2147483643
  88. wkbMultiPoint = 4
  89. wkbMultiPoint25D = -2147483644
  90. wkbMultiPolygon = 6
  91. wkbMultiPolygon25D = -2147483642
  92. wkbNDR = 1
  93. wkbNone = 100
  94. wkbPoint = 1
  95. wkbPoint25D = -2147483647
  96. wkbPolygon = 3
  97. wkbPolygon25D = -2147483645
  98. wkbUnknown = 0
  99. """
  100. geomType = layer.GetGeomType()
  101. if geomType in [ogr.wkbPolygon,
  102. ogr.wkbMultiPolygon,
  103. ogr.wkbLinearRing]:
  104. return mapscript.MS_LAYER_POLYGON
  105. elif geomType in [ogr.wkbLineString,
  106. ogr.wkbMultiLineString]:
  107. return mapscript.MS_LAYER_LINE
  108. else:
  109. return mapscript.MS_LAYER_POINT