__init__.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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 pyproj
  12. import os
  13. import re
  14. class WFS(OWS):
  15. service = "WFS"
  16. wfsns = "http://www.opengis.net/wfs"
  17. layerDefFile = None
  18. lyrobj = None
  19. def __init__(self,url=None,qstring=None,configFiles=None):
  20. OWS.__init__(self,url,qstring)
  21. def makeMap(self,mapfilename=None):
  22. mapobj = self.getMapObj(mapfilename)
  23. self.layerDefFile = self.createLayerDefinitionFile("wfs",
  24. os.path.join( os.path.dirname(__file__), "templates",'wfs.xml'))
  25. ds = ogr.Open(self.layerDefFile)
  26. self.setMapName(mapobj)
  27. logging.debug(self.capabilities.contents)
  28. srss = []
  29. for name in self.capabilities.contents:
  30. mapobj.setMetaData("wms_srs",self.config.get("MapServer","srs"))
  31. mapobj.setMetaData("wfs_srs",self.config.get("MapServer","srs"))
  32. layer = self.capabilities.contents[name]
  33. logging.debug("Creating layer %s" % name)
  34. srss = srss+filter(lambda y: not y in srss,layer.crsOptions)
  35. lyrobj = mapscript.layerObj(mapobj)
  36. #lyrobj.name = name.replace(":","_")
  37. lyrobj.name = name
  38. lyrobj.title = layer.title
  39. if layer.title:
  40. lyrobj.setMetaData("wms_title",layer.title)
  41. lyrobj.setMetaData("wfs_title",layer.title)
  42. #if layer.abstract:
  43. # lyrobj.setMetaData("ows_abstract", layer.abstract)
  44. lyrobj.setMetaData("wfs_typename", name)
  45. lyrobj.setMetaData("wfs_version",self.capabilities.version)
  46. lyrobj.setMetaData("gml_include_items","all")
  47. lyrobj.setMetaData("wfs_request_method","GET")
  48. lyrobj.setConnectionType(mapscript.MS_WFS,'')
  49. lyrobj.connection = self.getLayerUrl()
  50. lyrobj.data = re.sub(r".*:","",name)
  51. if ds:
  52. ogrLayer = ds.GetLayerByName(name)
  53. extent = self.getLayerExtent(layer,layer.crsOptions[0])
  54. if extent:
  55. lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
  56. (extent[0],extent[1],extent[2],extent[3]))
  57. lyrobj.setMetaData("wfs_extent","%s %s %s %s" % \
  58. (extent[0],extent[1],extent[2],extent[3]))
  59. lyrobj.type = self._getLayerType(ogrLayer)
  60. else:
  61. mapobj.removeLayer(mapobj.numlayers-1)
  62. logging.debug("No ogrDataSource found")
  63. continue
  64. #lyrobj.setProjection(self.__getLayerCrs(layer.crsOptions))
  65. lyrobj.setProjection(layer.crsOptions[0])
  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. ## overwrite already set SRSs
  75. #if len(srss) > 0:
  76. # logging.debug("Overwriting SRS option")
  77. # mapobj.setMetaData("wms_srs"," ".join(srss))
  78. self.saveMapfile(mapobj,mapfilename)
  79. return mapobj
  80. def getGeomName(self,geomname):
  81. if geomname.find("LINE") > -1:
  82. return mapscript.MS_LAYER_LINE
  83. elif geomname.find("POLYGON") > -1:
  84. return mapscript.MS_LAYER_POLYGON
  85. else:
  86. return mapscript.MS_LAYER_POINT
  87. def setMapName(self,mapobj):
  88. mapobj.name = self.config.get("MapServer","name")
  89. if self.capabilities.identification.title:
  90. mapobj.setMetaData("wms_title",self.capabilities.identification.title)
  91. mapobj.setMetaData("wfs_title",self.capabilities.identification.title)
  92. if self.capabilities.identification.abstract:
  93. mapobj.setMetaData("wms_abstract",self.capabilities.identification.abstract)
  94. mapobj.setMetaData("wfs_abstract",self.capabilities.identification.abstract)
  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 == 0: # unknown
  119. # brutal force way
  120. f = layer.GetNextFeature()
  121. if f:
  122. gr = f.GetGeometryRef()
  123. geomType = gr.GetGeometryType()
  124. if geomType in [ogr.wkbPolygon,
  125. ogr.wkbMultiPolygon,
  126. ogr.wkbLinearRing]:
  127. return mapscript.MS_LAYER_POLYGON
  128. elif geomType in [ogr.wkbLineString,
  129. ogr.wkbMultiLineString]:
  130. return mapscript.MS_LAYER_LINE
  131. else:
  132. return mapscript.MS_LAYER_POINT
  133. def __getLayerCrs(self,crss):
  134. """
  135. Returns bests (non-degree) coordinate system of the layer, which is
  136. available.
  137. Ofcourse, sometimes, there is no other option, there EPSG:4326, but
  138. take somethign else, if you can
  139. """
  140. for crs in crss:
  141. try:
  142. proj = pyproj.Proj("+init=%s"%crs)
  143. if proj.is_latlon():
  144. continue
  145. else:
  146. return crs
  147. except:
  148. pass
  149. return crss[0]