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

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

Added a new wms controller that uses the data reader implementation.

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:For a start just geting the GetMap params, 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        (xMin, yMin, xMax, yMax) = bbox
81       
82        kwargs = {}
83        kwargs['xLimits'] = (xMin, xMax)
84        kwargs['yLimits'] = (yMin, yMax)
85        kwargs['drawColourBar'] = True
86        kwargs['drawLogo'] = True
87        kwargs['drawRivers'] = False
88        kwargs['drawMetadata'] = True
89        kwargs['units'] = layerObj.units
90
91        optionalParams = self.getOptionalOWSParams(['cmap','CMAP_MAX','CMAP_MIN', 'SHOW_GRID_LINES', 'NUM_CONTOUR_LINES', 'CONTOUR_LABEL_INTERVAL', 'width', 'height'])
92
93        if 'cmap' in optionalParams:
94            kwargs['cmap']= optionalParams['cmap']
95           
96        if self.getOwsParam('cmap', default=None) != None:
97            kwargs['cmap'] = self.getOwsParam('cmap')
98       
99        if 'CMAP_MAX' in optionalParams:
100            kwargs['colourBarMax'] = float(optionalParams['CMAP_MAX'])
101        else:
102            kwargs['colourBarMax'] = variable[:].max()
103
104        if 'CMAP_MIN' in optionalParams:
105            kwargs['colourBarMin'] = float(optionalParams['CMAP_MIN'])
106        else:
107            kwargs['colourBarMin'] = variable[:].min()       
108       
109        if 'width' in optionalParams:
110            kwargs['width'] = int(optionalParams['width'])
111       
112        if 'height' in optionalParams:
113            kwargs['height'] = int(optionalParams['height'])
114       
115        log.debug("kwargs = %s" % (kwargs,))
116       
117 
118        if styles == "" or styles[0] == 'grid':
119           
120            if 'SHOW_GRID_LINES' in optionalParams:
121                kwargs['showGridLines'] = optionalParams['SHOW_GRID_LINES'].lower() == 'true'
122               
123            plt = PlotLatLon(variable, **kwargs)
124
125        elif styles[0] == 'contour':
126           
127            if 'NUM_CONTOUR_LINES' in optionalParams:
128                kwargs['numContourLines'] = int(optionalParams['NUM_CONTOUR_LINES'])
129       
130            if 'CONTOUR_LABEL_INTERVAL' in optionalParams:
131                kwargs['contourLabelInterval'] = int(optionalParams['CONTOUR_LABEL_INTERVAL'])
132               
133            log.debug("kwargs = %s" % (kwargs,))
134            plt = ContourPlot(cdmsVar=variable, **kwargs)
135           
136        else:
137            raise Exception("unknown style %s" % (styles[0],))
138 
139       
140        if format in self.nonPILFormats.keys():
141            plt.format = self.nonPILFormats[format]
142            buf = plt.drawToBuffer()
143           
144            response.headers['Content-Type'] = format
145            response.write(buf.getvalue())   
146        else:
147           
148           
149            img = plt.drawToImage()
150           
151            log.debug("img.format = %s" % (img.format,))
152           
153            log.debug("variable.getAxisIds() = %s" % (variable.getAxisIds(),))
154           
155            self._writeImageResponse(img, format)
156           
157        log.debug("finished getFigure")
158   
159    def getOptionalOWSParams(self, paramNames):
160       
161        d = {}
162       
163        for n in paramNames:
164            val = self.getOwsParam(n, default=None)
165             
166            if val == None: continue
167           
168            val.strip()
169           
170            if val == "": continue
171           
172            d[n] = val
173           
174        return d
175               
Note: See TracBrowser for help on using the repository browser.