__init__.py 6.1 KB

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