__init__.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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 ogr
  7. from osgeo import osr
  8. import os
  9. import logging
  10. import re
  11. class WMS(OWS):
  12. service = "WMS"
  13. request = '' # GetCapabilies, ...
  14. parser = None
  15. version = None
  16. def __init__(self,url=None,qstring=None,configFile=None):
  17. OWS.__init__(self,url,qstring,configFile)
  18. def makeMap(self,mapfilename=None):
  19. """Create mapscript.mapObj"""
  20. mapobj = self.getMapObj(mapfilename)
  21. params = self.getParams()
  22. self.version = params["VERSION"][0]
  23. # create layer
  24. logging.debug("Creating layer %s" % params["LAYERS"][0])
  25. lyrobj = mapscript.layerObj(mapobj)
  26. lyrobj.name = params["LAYERS"][0]
  27. lyrobj.type = mapscript.MS_LAYER_RASTER
  28. lyrobj.connection = params["OWSURL"][0]
  29. lyrobj.status = mapscript.MS_DEFAULT
  30. lyrobj.setConnectionType(mapscript.MS_WMS,None)
  31. lyrobj.setMetaData("wms_srs",params["FROMCRS"][0])
  32. lyrobj.setProjection("+init=%s" % params["FROMCRS"][0].lower())
  33. lyrobj.setMetaData("wms_name",params["LAYERS"][0])
  34. lyrobj.setMetaData("wms_server_version",params["VERSION"][0])
  35. if "TIME" in params.keys():
  36. lyrobj.setMetaData("wms_time",params["TIME"][0])
  37. if params["VERSION"][0] == "1.3.0":
  38. lyrobj.setMetaData("wms_server_version","1.1.1")
  39. if "EXCEPTIONS" in params.keys():
  40. lyrobj.setMetaData("wms_exceptions_format",params["EXCEPTIONS"][0])
  41. else:
  42. lyrobj.setMetaData("wms_exceptions_format","text/xml")
  43. if "FORMAT" in params.keys():
  44. lyrobj.setMetaData("wms_formatlist",params["FORMAT"][0])
  45. lyrobj.setMetaData("wms_format",params["FORMAT"][0])
  46. else:
  47. lyrobj.setMetaData("wms_formatlist","image/png")
  48. lyrobj.setMetaData("wms_format","image/png")
  49. # Style
  50. if "STYLES" in params.keys() and len(params["STYLES"]) > 0:
  51. lyrobj.setMetaData("wms_style",params["STYLES"][0])
  52. lyrobj.setMetaData("wms_style_%s_legendurl_href" % params["STYLES"][0],"http://foo/bar")
  53. lyrobj.setMetaData("wms_style_%s_legendurl_width" % params["STYLES"][0],"1")
  54. lyrobj.setMetaData("wms_style_%s_legendurl_height" % params["STYLES"][0],"1")
  55. lyrobj.setMetaData("wms_style_%s_legendurl_format" % params["STYLES"][0],"image/png")
  56. # classobj is needed for given STYLE as well
  57. classobj = mapscript.classObj(lyrobj)
  58. classobj.name = params["STYLES"][0]
  59. classobj.group = params["STYLES"][0]
  60. if "TRANSPARENT" in params.keys():
  61. lyrobj.setMetaData("wms_transparent",params["TRANSPARENT"][0])
  62. else:
  63. lyrobj.setMetaData("wms_transparent","TRUE")
  64. lyrobj.setMetaData("gml_include_items","all")
  65. lyrobj.template = "foo"
  66. self.saveMapfile(mapobj,mapfilename)
  67. return mapobj
  68. def getTime(self,ds,lyrobj):
  69. """Generate time index file, set approripate layer metadata"""
  70. # make time index file
  71. drv = ogr.GetDriverByName("ESRI Shapefile")
  72. tindex = '%s.%s.%s'%(lyrobj.name,self.service.lower(),"tindex")
  73. logging.info("Creating time index definition file %s.shp in %s" % (tindex,self.cachedir))
  74. tds = drv.CreateDataSource(os.path.join(self.cachedir,tindex))
  75. lyr = tds.CreateLayer(tindex)
  76. tile_field = ogr.FieldDefn("location", ogr.OFTString )
  77. tile_field.SetWidth( 256 )
  78. lyr.CreateField(tile_field)
  79. time_field = ogr.FieldDefn("time", ogr.OFTString )
  80. time_field.SetWidth( 256 )
  81. lyr.CreateField(time_field)
  82. timeMetadata = ""
  83. for sds in ds.GetSubDatasets():
  84. if sds[0].find('time') > -1:
  85. # crate mapfile metadata
  86. sdsname = sds[0].split(",")[0]
  87. sdsvalue = re.findall(r'".*"',sdsname)[0].replace('"',"")
  88. timeMetadata = timeMetadata+","+sdsvalue
  89. # create OGR tindex vector feature
  90. feature = ogr.Feature(lyr.GetLayerDefn())
  91. # feature geometry
  92. geotransform = ds.GetGeoTransform()
  93. w = ds.RasterXSize
  94. h = ds.RasterYSize
  95. bbox = {"minx":geotransform[0],"miny":geotransform[5]*h+geotransform[3],"maxx":geotransform[1]*w+geotransform[0],"maxy":geotransform[3]}
  96. 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)
  97. feature.SetGeometry(poly)
  98. # set time attribute
  99. feature.SetField("time","%s" % (sdsvalue))
  100. feature.SetField("location",sds[0])
  101. lyr.CreateFeature(feature)
  102. if timeMetadata.endswith(","):
  103. timeMetadata = re.sub(r",$","",timeMetadata)
  104. if timeMetadata.startswith(","):
  105. timeMetadata = re.sub(r"^,","",timeMetadata)
  106. if timeMetadata:
  107. logging.info("Setting %s to %s layer" % (timeMetadata, lyrobj.name))
  108. lyrobj.setMetaData("wms_timeextent", timeMetadata)
  109. lyrobj.setMetaData("wms_timeitem", "time")
  110. # NOTE: lyrobj.data will not be the wcs definition file
  111. # anymore, BUT the time index shapefile
  112. logging.info("Setting layer data to %s" %
  113. (os.path.join(tindex,tindex+".shp")))
  114. lyrobj.data = None
  115. lyrobj.tileindex = os.path.join(tindex,tindex+".shp")
  116. else:
  117. logging.info("No time subset found")