source: qesdi/wms_ddc_vis/trunk/lib/wms_ddc_vis/controllers/csmlwms3.py @ 5701

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/qesdi/wms_ddc_vis/trunk/lib/wms_ddc_vis/controllers/csmlwms3.py@5701
Revision 5701, 6.4 KB checked in by pnorton, 10 years ago (diff)

Added the 'auto' layer to the coastwms.

Fixed a bug in the wms getFigure code.

Added some additional getFigure options to the wms3 code.

Line 
1import logging
2import simplejson as json
3from geoplot.plot_lat_lon import PlotLatLon
4from geoplot.contour_plot import ContourPlot
5
6from cows.pylons.wms_controller import WMSController
7from cows.pylons import ows_controller
8
9from cows.service.imps.data_reader_geoplot_backend.data_reader_geoplot_layer_mapper import DRGeoplotLayerMapper
10from cows.service.imps.data_reader_geoplot_backend.data_reader_geoplot_wms_layer import DRGeoplotWmsLayer
11from cows.service.imps.data_reader_geoplot_backend.slab_options_json_generator import SlabJSONGenerator
12
13DRGeoplotWmsLayer.EnableDisplayOptions = True
14
15from wms_ddc_vis.lib.base import request, response
16
17log = logging.getLogger(__name__)
18
19class Csmlwms3Controller(WMSController):
20    layerMapper = DRGeoplotLayerMapper()
21   
22    owsOperations = (WMSController.owsOperations + ['GetDisplayOptions','GetDisplayOptions2','GetFigure'])
23   
24    nonPILFormats = {'application/postscript':'ps',
25                     'application/pdf':'pdf',
26                     'image/svg+xml':'svg'}
27   
28    def _loadCapabilities(self, *args, **kwargs):
29        ows_controller.addOperation('GetDisplayOptions', formats=['application/json'])
30        ows_controller.addOperation('GetFigure', formats=['image/png', 'image/jpg','image/gif', 'application/postscript', 'application/pdf','image/svg+xml' ])
31        WMSController._loadCapabilities(self, *args, **kwargs)
32   
33    def GetDisplayOptions(self):
34       
35        generator = SlabJSONGenerator(DRGeoplotWmsLayer.slab_classes)
36       
37        request.headers['Content-Type'] = 'application/json'
38       
39        jsonString = generator.generateJSON()
40       
41        response.write( jsonString )
42   
43   
44    def GetFigure(self):
45       
46        #!TODO: clearup!
47        # Get the parameters
48        version      = self._getVersionParam()
49        format = self.getOwsParam('format', default='image/png')
50       
51        validFormats = self._pilImageFormats.keys()
52        validFormats.extend(self.nonPILFormats.keys())
53       
54        if format not in validFormats:
55            raise InvalidParameterValue('Format %s not supported' % format, 'format')
56         
57        transparent  = self._getTransparentParam()
58        bgcolor      = self._getBgcolorParam()
59        bbox         = self._getBboxParam()
60        width        = self._getWidthParam()
61        height       = self._getHeightParam()
62       
63        layerObjects = self._getLayerParam()
64       
65        assert len(layerObjects) == 1
66        layerObj = layerObjects[0]
67       
68        styles       = self._getStylesParam(len(layerObjects))
69        srs          = self._getSrsParam(version)
70       
71        dimValues = self._getDimValues(layerObj)
72       
73        log.debug("dimValues = %s" % (dimValues,))
74       
75        variable = layerObj.dataReader.getNetcdfVar(layerObj.name, dimValues)
76       
77        log.debug("variable.shape = %s" % (variable.shape,))
78        log.debug("bbox = %s" % (bbox,))
79
80        optionalParams = self.getOptionalOWSParams(['cmap','CMAP_MAX','CMAP_MIN', 'SHOW_GRID_LINES', 'NUM_CONTOUR_LINES', 
81                                                    'CONTOUR_LABEL_INTERVAL', 'width', 'height', 'INTERVALCOLOURBAR', 'INTERVALNAMES'])
82       
83        (xMin, yMin, xMax, yMax) = bbox
84       
85        kwargs = {}
86        kwargs['xLimits'] = (xMin, xMax)
87        kwargs['yLimits'] = (yMin, yMax)
88        kwargs['drawColourBar'] = True
89        kwargs['drawLogo'] = True
90        kwargs['drawRivers'] = False
91        kwargs['drawMetadata'] = True
92        kwargs['units'] = layerObj.units
93
94        if 'cmap' in optionalParams:
95            kwargs['cmap']= optionalParams['cmap']
96           
97        if self.getOwsParam('cmap', default=None) != None:
98            kwargs['cmap'] = self.getOwsParam('cmap')
99       
100        if 'INTERVALCOLOURBAR' in optionalParams:
101            kwargs['intervalColourbar'] = optionalParams['INTERVALCOLOURBAR'].lower() == 'true'
102       
103        if 'INTERVALNAMES' in optionalParams:
104            kwargs['intervalNames'] = optionalParams['INTERVALNAMES'].split(',')
105       
106        if 'CMAP_MAX' in optionalParams:
107            kwargs['colourBarMax'] = float(optionalParams['CMAP_MAX'])
108        else:
109            kwargs['colourBarMax'] = variable[:].max()
110
111        if 'CMAP_MIN' in optionalParams:
112            kwargs['colourBarMin'] = float(optionalParams['CMAP_MIN'])
113        else:
114            kwargs['colourBarMin'] = variable[:].min()       
115       
116        if 'width' in optionalParams:
117            kwargs['width'] = int(optionalParams['width'])
118       
119        if 'height' in optionalParams:
120            kwargs['height'] = int(optionalParams['height'])
121       
122        log.debug("kwargs = %s" % (kwargs,))
123       
124        if styles == "" or styles[0] == 'grid':
125           
126            if 'SHOW_GRID_LINES' in optionalParams:
127                kwargs['showGridLines'] = optionalParams['SHOW_GRID_LINES'].lower() == 'true'
128               
129            plt = PlotLatLon(variable, **kwargs)
130
131        elif styles[0] == 'contour':
132           
133            if 'NUM_CONTOUR_LINES' in optionalParams:
134                kwargs['numContourLines'] = int(optionalParams['NUM_CONTOUR_LINES'])
135       
136            if 'CONTOUR_LABEL_INTERVAL' in optionalParams:
137                kwargs['contourLabelInterval'] = int(optionalParams['CONTOUR_LABEL_INTERVAL'])
138               
139            log.debug("kwargs = %s" % (kwargs,))
140            plt = ContourPlot(cdmsVar=variable, **kwargs)
141           
142        else:
143            raise Exception("unknown style %s" % (styles[0],))
144 
145       
146        if format in self.nonPILFormats.keys():
147            plt.format = self.nonPILFormats[format]
148            buf = plt.drawToBuffer()
149           
150            response.headers['Content-Type'] = format
151            response.write(buf.getvalue())   
152        else:
153           
154            img = plt.drawToImage()
155           
156            log.debug("img.format = %s" % (img.format,))
157           
158            log.debug("variable.getAxisIds() = %s" % (variable.getAxisIds(),))
159           
160            self._writeImageResponse(img, format)
161           
162        log.debug("finished getFigure")
163   
164    def getOptionalOWSParams(self, paramNames):
165       
166        d = {}
167       
168        for n in paramNames:
169            val = self.getOwsParam(n, default=None)
170             
171            if val == None: continue
172           
173            val.strip()
174           
175            if val == "": continue
176           
177            d[n] = val
178           
179        return d
180               
Note: See TracBrowser for help on using the repository browser.