__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. import re
  13. class WFS(OWS):
  14. service = "WFS"
  15. wfsns = "http://www.opengis.net/wfs"
  16. layerDefFile = None
  17. lyrobj = None
  18. def __init__(self,url=None,qstring=None,configFiles=None):
  19. OWS.__init__(self,url,qstring)
  20. def makeMap(self,mapfilename=None):
  21. mapobj = self.getMapObj(mapfilename)
  22. self.layerDefFile = self.createLayerDefinitionFile("wfs",
  23. os.path.join( os.path.dirname(__file__), "templates",'wfs.xml'))
  24. ds = ogr.Open(self.layerDefFile)
  25. self.setMapName(mapobj)
  26. for name in self.capabilities.contents:
  27. layer = self.capabilities.contents[name]
  28. logging.debug("Creating layer %s" % name)
  29. lyrobj = mapscript.layerObj(mapobj)
  30. lyrobj.name = name.replace(":","_")
  31. #lyrobj.name = name
  32. lyrobj.title = layer.title
  33. if layer.title:
  34. lyrobj.setMetaData("wms_title",layer.title)
  35. #if layer.abstract:
  36. # lyrobj.setMetaData("ows_abstract", layer.abstract)
  37. lyrobj.setMetaData("wfs_typename", name)
  38. logging.debug("WFS version %s",self.capabilities.version)
  39. lyrobj.setMetaData("wfs_version",self.capabilities.version)
  40. lyrobj.setMetaData("gml_include_items","all")
  41. lyrobj.setMetaData("wfs_request_method","GET")
  42. lyrobj.setConnectionType(mapscript.MS_WFS,'')
  43. lyrobj.connection = self.getLayerUrl()
  44. lyrobj.data = re.sub(r".*:","",name)
  45. if ds:
  46. ogrLayer = ds.GetLayerByName(name)
  47. extent = self.getLayerExtent(layer,layer.crsOptions[0])
  48. if extent:
  49. lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
  50. (extent[0],extent[1],extent[2],extent[3]))
  51. lyrobj.type = self._getLayerType(ogrLayer)
  52. else:
  53. mapobj.removeLayer(mapobj.numlayers-1)
  54. logging.debug("No ogrDataSource found")
  55. continue
  56. lyrobj.setProjection(layer.crsOptions[0])
  57. lyrobj.dump = mapscript.MS_TRUE
  58. lyrobj.template = "foo"
  59. cls = mapscript.classObj(lyrobj)
  60. style = mapscript.styleObj(cls)
  61. style.outlinecolor=mapscript.colorObj(134,81,0)
  62. style.color=mapscript.colorObj(238,153,0)
  63. style.size=5
  64. style.width=5
  65. self.saveMapfile(mapobj,mapfilename)
  66. return mapobj
  67. def getGeomName(self,geomname):
  68. if geomname.find("LINE") > -1:
  69. return mapscript.MS_LAYER_LINE
  70. elif geomname.find("POLYGON") > -1:
  71. return mapscript.MS_LAYER_POLYGON
  72. else:
  73. return mapscript.MS_LAYER_POINT
  74. def setMapName(self,mapobj):
  75. mapobj.name = self.config.get("MapServer","name")
  76. if self.capabilities.identification.title:
  77. mapobj.setMetaData("wms_title",self.capabilities.identification.title)
  78. if self.capabilities.identification.abstract:
  79. mapobj.setMetaData("wms_abstract",self.capabilities.identification.abstract)
  80. def _getLayerType(self,layer):
  81. """Returns MS layer type based on ogr.Layer.GetGeomType
  82. with ogr:
  83. wkbGeometryCollection = 7
  84. wkbGeometryCollection25D = -2147483641
  85. wkbLineString = 2
  86. wkbLineString25D = -2147483646
  87. wkbLinearRing = 101
  88. wkbMultiLineString = 5
  89. wkbMultiLineString25D = -2147483643
  90. wkbMultiPoint = 4
  91. wkbMultiPoint25D = -2147483644
  92. wkbMultiPolygon = 6
  93. wkbMultiPolygon25D = -2147483642
  94. wkbNDR = 1
  95. wkbNone = 100
  96. wkbPoint = 1
  97. wkbPoint25D = -2147483647
  98. wkbPolygon = 3
  99. wkbPolygon25D = -2147483645
  100. wkbUnknown = 0
  101. """
  102. geomType = layer.GetGeomType()
  103. if geomType in [ogr.wkbPolygon,
  104. ogr.wkbMultiPolygon,
  105. ogr.wkbLinearRing]:
  106. return mapscript.MS_LAYER_POLYGON
  107. elif geomType in [ogr.wkbLineString,
  108. ogr.wkbMultiLineString]:
  109. return mapscript.MS_LAYER_LINE
  110. else:
  111. return mapscript.MS_LAYER_POINT