__init__.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. from OWS import OWS
  4. import mapscript
  5. from osgeo import gdal
  6. from osgeo import osr
  7. from osgeo import ogr
  8. from string import Template
  9. import os
  10. import logging
  11. import re
  12. class WCS(OWS):
  13. service = "WCS"
  14. request = '' # GetCapabilies, ...
  15. parser = None
  16. version = None
  17. wcsns = None
  18. def __init__(self,url=None,qstring=None,configFiles=None):
  19. OWS.__init__(self,url,qstring)
  20. def makeMap(self,mapfilename=None):
  21. """Create mapscript.mapObj"""
  22. lyrobj = None
  23. self.version = self.capabilities.attrib["version"]
  24. self.wcsns = self.capabilities.nsmap[self.capabilities.prefix]
  25. mapobj = self.getMapObj(mapfilename)
  26. #
  27. # for each layer from the WCS Capabilities file, transform it to
  28. # mapscript.layerObj
  29. #
  30. logging.info(self.capabilities["Contents"].getchildren())
  31. for layer in self.capabilities["{%s}Contents" % (self.wcsns)].getchildren():
  32. name = layer.Identifier.text
  33. logging.debug("Creating layer %s" % name)
  34. # create layer definition file
  35. # see http://www.gdal.org/frmt_wcs.html
  36. layerDefFile = self.createLayerDefinitionFile(name,
  37. os.path.join( os.path.dirname(__file__), "templates",'wcs.xml'))
  38. # create the layer
  39. ds = gdal.Open(layerDefFile)
  40. try:
  41. lyrobj = mapscript.layerObj(mapobj)
  42. lyrobj.name = name
  43. lyrobj.data = layerDefFile
  44. lyrobj.title = layer["{%s}%s" % (self.owsns11,"Title")].text
  45. lyrobj.setMetaData("wms_title",layer["{%s}%s" % (self.owsns11,"Title")].text)
  46. if "{%s}%s" % (self.owsns11,"Abstract") in layer:
  47. lyrobj.setMetaData("ows_abstract", layer["{%s}%s" % (self.owsns11,"Abstract")].text)
  48. lyrobj.setMetaData("wms_srs",self.config.get("MapServer","srs"))
  49. sr = osr.SpatialReference()
  50. sr.ImportFromWkt(ds.GetProjection())
  51. lyrobj.setProjection(sr.ExportToProj4())
  52. lyrobj.type = mapscript.MS_LAYER_RASTER
  53. lyrobj.dump = mapscript.MS_TRUE
  54. lyrobj.template = "foo"
  55. self.getTime(ds,lyrobj)
  56. cls = mapscript.classObj(lyrobj)
  57. mapscript.styleObj(cls)
  58. except Exception,e:
  59. mapobj.removeLayer(lyrobj.index)
  60. logging.warning("Layer %s: %s, skipping." %\
  61. (layer.Identifier.text,e.message))
  62. self.saveMapfile(mapobj,mapfilename)
  63. return mapobj
  64. def getTime(self,ds,lyrobj):
  65. """Generate time index file, set approripate layer metadata"""
  66. # make time index file
  67. drv = ogr.GetDriverByName("ESRI Shapefile")
  68. tindex = '%s.%s.%s'%(lyrobj.name,self.service.lower(),"tindex")
  69. logging.info("Creating time index definition file %s.shp in %s" % (tindex,self.cachedir))
  70. tds = drv.CreateDataSource(os.path.join(self.cachedir,tindex))
  71. lyr = tds.CreateLayer(tindex)
  72. tile_field = ogr.FieldDefn("location", ogr.OFTString )
  73. tile_field.SetWidth( 256 )
  74. lyr.CreateField(tile_field)
  75. time_field = ogr.FieldDefn("time", ogr.OFTString )
  76. time_field.SetWidth( 256 )
  77. lyr.CreateField(time_field)
  78. timeMetadata = ""
  79. for sds in ds.GetSubDatasets():
  80. if sds[0].find('time') > -1:
  81. # crate mapfile metadata
  82. sdsname = sds[0].split(",")[0]
  83. sdsvalue = re.findall(r'".*"',sdsname)[0].replace('"',"")
  84. timeMetadata = timeMetadata+","+sdsvalue
  85. # create OGR tindex vector feature
  86. feature = ogr.Feature(lyr.GetLayerDefn())
  87. # feature geometry
  88. geotransform = ds.GetGeoTransform()
  89. w = ds.RasterXSize
  90. h = ds.RasterYSize
  91. bbox = {"minx":geotransform[0],"miny":geotransform[5]*h+geotransform[3],"maxx":geotransform[1]*w+geotransform[0],"maxy":geotransform[3]}
  92. poly = ogr.CreateGeometryFromWkt("""POLYGON((%(minx)s %(miny)s, %(maxx)s %(miny)s, %(maxx)s %(maxy)s, %(minx)s %(maxy)s, %(minx)s %(miny)s))""" % bbox)
  93. feature.SetGeometry(poly)
  94. # set time attribute
  95. feature.SetField("time","%s" % (sdsvalue))
  96. feature.SetField("location",sds[0])
  97. lyr.CreateFeature(feature)
  98. if timeMetadata.endswith(","):
  99. timeMetadata = re.sub(r",$","",timeMetadata)
  100. if timeMetadata.startswith(","):
  101. timeMetadata = re.sub(r"^,","",timeMetadata)
  102. if timeMetadata:
  103. logging.info("Setting %s to %s layer" % (timeMetadata, lyrobj.name))
  104. lyrobj.setMetaData("wms_timeextent", timeMetadata)
  105. lyrobj.setMetaData("wms_timeitem", "time")
  106. # NOTE: lyrobj.data will not be the wcs definition file
  107. # anymore, BUT the time index shapefile
  108. logging.info("Setting layer data to %s" %
  109. (os.path.join(tindex,tindex+".shp")))
  110. lyrobj.data = None
  111. lyrobj.tileindex = os.path.join(tindex,tindex+".shp")
  112. else:
  113. logging.info("No time subset found")