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