__init__.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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,configFile=None):
  20. OWS.__init__(self,url,qstring,configFile)
  21. def makeMap(self,mapfilename=None):
  22. mapobj = self.getMapObj(mapfilename)
  23. # mapobjects exists, do not do any new layers
  24. if mapobj.numlayers:
  25. return mapobj
  26. self.layerDefFile = self.createLayerDefinitionFile("wfs",
  27. os.path.join( os.path.dirname(__file__), "templates",'wfs.xml'))
  28. ds = ogr.Open(self.layerDefFile)
  29. self.setMapName(mapobj)
  30. logging.debug(self.capabilities.contents)
  31. srss = []
  32. for name in self.capabilities.contents:
  33. mapobj.setMetaData("wms_srs",self.config.get("MapServer","srs"))
  34. mapobj.setMetaData("wfs_srs",self.config.get("MapServer","srs"))
  35. layer = self.capabilities.contents[name]
  36. logging.debug("Creating layer %s" % name)
  37. srss = srss+filter(lambda y: not y in srss,layer.crsOptions)
  38. lyrobj = mapscript.layerObj(mapobj)
  39. #lyrobj.name = name.replace(":","_")
  40. lyrobj.name = name
  41. lyrobj.title = layer.title
  42. if layer.title:
  43. lyrobj.setMetaData("wms_title",layer.title)
  44. lyrobj.setMetaData("wfs_title",layer.title)
  45. #if layer.abstract:
  46. # lyrobj.setMetaData("ows_abstract", layer.abstract)
  47. lyrobj.setMetaData("wfs_typename", name)
  48. logging.debug("WFS version %s",self.capabilities.version)
  49. lyrobj.setMetaData("wfs_version",self.capabilities.version)
  50. if self.capabilities.version == "1.1.0":
  51. logging.debug("WFS is 1.1.1 -> using 1.0 instead")
  52. lyrobj.setMetaData("wfs_version","1.0.0")
  53. lyrobj.setMetaData("gml_include_items","all")
  54. lyrobj.setMetaData("wfs_request_method","GET")
  55. lyrobj.setConnectionType(mapscript.MS_WFS,'')
  56. lyrobj.connection = self.getLayerUrl()
  57. lyrobj.data = re.sub(r".*:","",name)
  58. if ds:
  59. ogrLayer = ds.GetLayerByName(name)
  60. extent = self.getLayerExtent(layer,layer.crsOptions[0])
  61. if extent:
  62. lyrobj.setMetaData("wms_extent","%s %s %s %s" % \
  63. (extent[0],extent[1],extent[2],extent[3]))
  64. lyrobj.setMetaData("wfs_extent","%s %s %s %s" % \
  65. (extent[0],extent[1],extent[2],extent[3]))
  66. lyrobj.type = self._getLayerType(ogrLayer)
  67. else:
  68. mapobj.removeLayer(mapobj.numlayers-1)
  69. logging.debug("No ogrDataSource found")
  70. continue
  71. #lyrobj.setProjection(self.__getLayerCrs(layer.crsOptions))
  72. lyrobj.setProjection(layer.crsOptions[0].getcode())
  73. lyrobj.dump = mapscript.MS_TRUE
  74. lyrobj.template = "foo"
  75. cls = mapscript.classObj(lyrobj)
  76. style = mapscript.styleObj(cls)
  77. style.outlinecolor=mapscript.colorObj(134,81,0)
  78. style.color=mapscript.colorObj(238,153,0)
  79. style.size=5
  80. style.width=5
  81. ## overwrite already set SRSs
  82. #if len(srss) > 0:
  83. # logging.debug("Overwriting SRS option")
  84. # mapobj.setMetaData("wms_srs"," ".join(srss))
  85. self.saveMapfile(mapobj,mapfilename)
  86. return mapobj
  87. def getGeomName(self,geomname):
  88. if geomname.find("LINE") > -1:
  89. return mapscript.MS_LAYER_LINE
  90. elif geomname.find("POLYGON") > -1:
  91. return mapscript.MS_LAYER_POLYGON
  92. else:
  93. return mapscript.MS_LAYER_POINT
  94. def setMapName(self,mapobj):
  95. mapobj.name = self.config.get("MapServer","name")
  96. if self.capabilities.identification.title:
  97. mapobj.setMetaData("wms_title",self.capabilities.identification.title)
  98. mapobj.setMetaData("wfs_title",self.capabilities.identification.title)
  99. if self.capabilities.identification.abstract:
  100. mapobj.setMetaData("wms_abstract",self.capabilities.identification.abstract)
  101. mapobj.setMetaData("wfs_abstract",self.capabilities.identification.abstract)
  102. def _getLayerType(self,layer):
  103. """Returns MS layer type based on ogr.Layer.GetGeomType
  104. with ogr:
  105. wkbGeometryCollection = 7
  106. wkbGeometryCollection25D = -2147483641
  107. wkbLineString = 2
  108. wkbLineString25D = -2147483646
  109. wkbLinearRing = 101
  110. wkbMultiLineString = 5
  111. wkbMultiLineString25D = -2147483643
  112. wkbMultiPoint = 4
  113. wkbMultiPoint25D = -2147483644
  114. wkbMultiPolygon = 6
  115. wkbMultiPolygon25D = -2147483642
  116. wkbNDR = 1
  117. wkbNone = 100
  118. wkbPoint = 1
  119. wkbPoint25D = -2147483647
  120. wkbPolygon = 3
  121. wkbPolygon25D = -2147483645
  122. wkbUnknown = 0
  123. """
  124. geomType = layer.GetGeomType()
  125. if geomType == 0: # unknown
  126. # brutal force way
  127. f = layer.GetNextFeature()
  128. if f:
  129. gr = f.GetGeometryRef()
  130. geomType = gr.GetGeometryType()
  131. if geomType in [ogr.wkbPolygon,
  132. ogr.wkbMultiPolygon,
  133. ogr.wkbLinearRing]:
  134. return mapscript.MS_LAYER_POLYGON
  135. elif geomType in [ogr.wkbLineString,
  136. ogr.wkbMultiLineString]:
  137. return mapscript.MS_LAYER_LINE
  138. else:
  139. return mapscript.MS_LAYER_POINT
  140. def __getLayerCrs(self,crss):
  141. """
  142. Returns bests (non-degree) coordinate system of the layer, which is
  143. available.
  144. Ofcourse, sometimes, there is no other option, there EPSG:4326, but
  145. take somethign else, if you can
  146. """
  147. for crs in crss:
  148. try:
  149. proj = pyproj.Proj("+init=%s"%crs)
  150. if proj.is_latlon():
  151. continue
  152. else:
  153. return crs
  154. except:
  155. pass
  156. return crss[0]