Browse Source

added support for warped WMS requests

Jachym Cepicky 14 years ago
parent
commit
6ff6940608
2 changed files with 116 additions and 1 deletions
  1. 3 1
      OWS.py
  2. 113 0
      wms/__init__.py

+ 3 - 1
OWS.py

@@ -140,7 +140,6 @@ class OWS:
 
 
         # mapobj.getLayerByName(request.getValueByName("layers")).metadata.get("wfs_filter")
         # mapobj.getLayerByName(request.getValueByName("layers")).metadata.get("wfs_filter")
         # here is still fine, but it fails on dispatch:
         # here is still fine, but it fails on dispatch:
-
         res = mapobj.OWSDispatch(request)
         res = mapobj.OWSDispatch(request)
         if mapscript.MS_DONE == res:
         if mapscript.MS_DONE == res:
             raise OWSExceptions.NoValidRequest("No valid OWS Request")
             raise OWSExceptions.NoValidRequest("No valid OWS Request")
@@ -315,6 +314,9 @@ def getService():
         elif params["owsService"][0].lower() == "wcs":
         elif params["owsService"][0].lower() == "wcs":
             from wcs import WCS
             from wcs import WCS
             return WCS(owsUrl,qstring)
             return WCS(owsUrl,qstring)
+        elif params["owsService"][0].lower() == "wms":
+            from wms import WMS
+            return WMS(owsUrl,qstring)
     else:
     else:
         raise OWSExceptions.MissingParameterValue("""owsUrl or owsService""")
         raise OWSExceptions.MissingParameterValue("""owsUrl or owsService""")
     
     

+ 113 - 0
wms/__init__.py

@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+from OWS import OWS
+import mapscript
+from osgeo import gdal
+from osgeo import ogr
+from osgeo import osr
+import os
+import logging
+import re
+
+class WMS(OWS):
+
+    service = "WMS"
+    request = '' # GetCapabilies, ...
+    parser = None
+    version = None
+
+    def __init__(self,url=None,qstring=None,configFiles=None):
+        OWS.__init__(self,url,qstring)
+
+    def makeMap(self,mapfilename=None):
+        """Create mapscript.mapObj"""
+
+        mapobj = self.getMapObj(mapfilename)
+
+
+        params = self.getParams()
+
+        self.version = params["VERSION"]
+
+        # create layer
+        logging.debug(params)
+        logging.debug("Creating layer %s" % params["LAYERS"][0]) 
+        lyrobj = mapscript.layerObj(mapobj)
+        lyrobj.name = params["LAYERS"][0]
+        lyrobj.type = mapscript.MS_LAYER_RASTER
+        lyrobj.connection = params["OWSURL"][0]
+        lyrobj.status = mapscript.MS_DEFAULT
+        lyrobj.setConnectionType(mapscript.MS_WMS,None)
+        lyrobj.setMetaData("wms_srs",params["FROMCRS"][0])
+        lyrobj.setMetaData("wms_name",params["LAYERS"][0])
+        lyrobj.setMetaData("wms_server_version",params["VERSION"][0])
+        lyrobj.setMetaData("wms_exceptions_format",params["EXCEPTIONS"][0])
+        lyrobj.setMetaData("wms_formatlist",params["FORMAT"][0])
+        lyrobj.setMetaData("wms_style",params["STYLES"][0])
+        lyrobj.setMetaData("wms_transparent",params["TRANSPARENT"][0])
+        lyrobj.setMetaData("gml_include_items","all")
+        lyrobj.template = "foo"
+
+        return mapobj
+
+    def getTime(self,ds,lyrobj):
+        """Generate time index file, set approripate layer metadata"""
+
+        # make time index file
+        drv = ogr.GetDriverByName("ESRI Shapefile")
+        tindex = '%s.%s.%s'%(lyrobj.name,self.service.lower(),"tindex")
+        logging.info("Creating time index definition file %s.shp in %s" % (tindex,self.cachedir))
+        tds = drv.CreateDataSource(os.path.join(self.cachedir,tindex))
+        lyr = tds.CreateLayer(tindex)
+        tile_field = ogr.FieldDefn("location", ogr.OFTString )
+        tile_field.SetWidth( 256 )
+        lyr.CreateField(tile_field)
+
+        time_field = ogr.FieldDefn("time", ogr.OFTString )
+        time_field.SetWidth( 256 )
+        lyr.CreateField(time_field)
+
+        timeMetadata = ""
+        for sds in ds.GetSubDatasets():
+            if sds[0].find('time') > -1:
+                # crate mapfile metadata
+                sdsname = sds[0].split(",")[0]
+                sdsvalue = re.findall(r'".*"',sdsname)[0].replace('"',"")
+                timeMetadata = timeMetadata+","+sdsvalue
+
+                # create OGR tindex vector feature
+                feature = ogr.Feature(lyr.GetLayerDefn())
+
+                # feature geometry
+                geotransform = ds.GetGeoTransform()
+                w = ds.RasterXSize
+                h = ds.RasterYSize
+                bbox = {"minx":geotransform[0],"miny":geotransform[5]*h+geotransform[3],"maxx":geotransform[1]*w+geotransform[0],"maxy":geotransform[3]}
+                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)
+                feature.SetGeometry(poly)
+
+                # set time attribute
+                feature.SetField("time","%s" % (sdsvalue))
+                feature.SetField("location",sds[0])
+                lyr.CreateFeature(feature)
+
+        if timeMetadata.endswith(","):
+            timeMetadata = re.sub(r",$","",timeMetadata)
+        if timeMetadata.startswith(","):
+            timeMetadata = re.sub(r"^,","",timeMetadata)
+
+        if timeMetadata:
+            logging.info("Setting %s to %s layer" % (timeMetadata, lyrobj.name))
+
+            lyrobj.setMetaData("wms_timeextent", timeMetadata) 
+            lyrobj.setMetaData("wms_timeitem", "time") 
+
+            # NOTE: lyrobj.data will not be the wcs definition file
+            # anymore, BUT the time index shapefile
+            logging.info("Setting layer data to %s" %
+                    (os.path.join(tindex,tindex+".shp")))
+            lyrobj.data = None
+            lyrobj.tileindex = os.path.join(tindex,tindex+".shp")
+        else:
+            logging.info("No time subset found")