__init__.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. from osgeo import osr
  12. import os
  13. class WFS(OWS):
  14. service = "WFS"
  15. wfsns = "http://www.opengis.net/wfs"
  16. layerDefFile = None
  17. def __init__(self,url=None,qstring=None,configFiles=None):
  18. OWS.__init__(self,url,qstring)
  19. def makeMap(self,mapfilename=None):
  20. mapobj = self.getMapObj(mapfilename)
  21. self.layerDefFile = self.createLayerDefinitionFile("wfs",
  22. os.path.join( os.path.dirname(__file__), "templates",'wfs.xml'))
  23. ds = ogr.Open(self.layerDefFile)
  24. self.setMapName(mapobj)
  25. logging.debug(self.capabilities.contents)
  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
  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.setConnectionType(mapscript.MS_OGR,'')
  39. lyrobj.connection = self.layerDefFile
  40. lyrobj.data = name
  41. if ds:
  42. ogrLayer = ds.GetLayerByName(name)
  43. # TODO : udelat to pomoci owslib
  44. extent = self.getLayerExtent(layer,layer.crsOptions[0])
  45. lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
  46. (extent[0],extent[1],extent[2],extent[3]))
  47. lyrobj.type = self._getLayerType(ogrLayer)
  48. else:
  49. mapobj.removeLayer(mapobj.numlayers-1)
  50. logging.debug("No ogrDataSource found")
  51. continue
  52. lyrobj.setProjection(layer.crsOptions[0])
  53. lyrobj.dump = mapscript.MS_TRUE
  54. lyrobj.template = "foo"
  55. cls = mapscript.classObj(lyrobj)
  56. style = mapscript.styleObj(cls)
  57. style.outlinecolor=mapscript.colorObj(134,81,0)
  58. style.color=mapscript.colorObj(238,153,0)
  59. style.size=5
  60. style.width=5
  61. self.saveMapfile(mapobj,mapfilename)
  62. return mapobj
  63. def getGeomName(self,geomname):
  64. if geomname.find("LINE") > -1:
  65. return mapscript.MS_LAYER_LINE
  66. elif geomname.find("POLYGON") > -1:
  67. return mapscript.MS_LAYER_POLYGON
  68. else:
  69. return mapscript.MS_LAYER_POINT
  70. def setMapName(self,mapobj):
  71. mapobj.name = self.config.get("MapServer","name")
  72. if self.capabilities.identification.title:
  73. mapobj.setMetaData("wms_title",self.capabilities.identification.title)
  74. if self.capabilities.identification.abstract:
  75. mapobj.setMetaData("wms_abstract",self.capabilities.identification.abstract)
  76. def getLayerExtent(self,layer,crs):
  77. """Get extent of layer in form of minx, miny, maxx,maxy
  78. """
  79. dest = osr.SpatialReference()
  80. dest.ImportFromEPSG(int(crs.split(":")[1]))
  81. source = osr.SpatialReference()
  82. source.ImportFromEPSG(4326)
  83. bbox = []
  84. geom = ogr.CreateGeometryFromWkt("""POINT(%s %s)""" % (layer.boundingBoxWGS84[0],layer.boundingBoxWGS84[1]),source)
  85. geom.TransformTo(dest)
  86. bbox.append(geom.GetX())
  87. bbox.append(geom.GetY())
  88. geom = ogr.CreateGeometryFromWkt("""POINT(%s %s)""" % (layer.boundingBoxWGS84[2],layer.boundingBoxWGS84[3]),source)
  89. geom.TransformTo(dest)
  90. bbox.append(geom.GetX())
  91. bbox.append(geom.GetY())
  92. logging.debug("Setting extent for layer <%s> to %s" %\
  93. (layer.id,bbox))
  94. return bbox
  95. def _getLayerType(self,layer):
  96. """Returns MS layer type based on ogr.Layer.GetGeomType
  97. with ogr:
  98. wkbGeometryCollection = 7
  99. wkbGeometryCollection25D = -2147483641
  100. wkbLineString = 2
  101. wkbLineString25D = -2147483646
  102. wkbLinearRing = 101
  103. wkbMultiLineString = 5
  104. wkbMultiLineString25D = -2147483643
  105. wkbMultiPoint = 4
  106. wkbMultiPoint25D = -2147483644
  107. wkbMultiPolygon = 6
  108. wkbMultiPolygon25D = -2147483642
  109. wkbNDR = 1
  110. wkbNone = 100
  111. wkbPoint = 1
  112. wkbPoint25D = -2147483647
  113. wkbPolygon = 3
  114. wkbPolygon25D = -2147483645
  115. wkbUnknown = 0
  116. """
  117. geomType = layer.GetGeomType()
  118. if geomType in [ogr.wkbPolygon,
  119. ogr.wkbMultiPolygon,
  120. ogr.wkbLinearRing]:
  121. return mapscript.MS_LAYER_POLYGON
  122. elif geomType in [ogr.wkbLineString,
  123. ogr.wkbMultiLineString]:
  124. return mapscript.MS_LAYER_LINE
  125. else:
  126. return mapscript.MS_LAYER_POINT