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

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

Modified the beaker cache decorator that comes with pylons so that it includes response content written to response.write(). Added this decorator to a number of controllers to try and improve the performacne.

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
16from wms_ddc_vis.lib.wms_request_log_utils import buildLogString, wms_request_logger
17
18from wms_ddc_vis.lib.modified_beaker_cache_decorator import beaker_cache
19
20log = logging.getLogger(__name__)
21
22class Csmlwms3Controller(WMSController):
23    layerMapper = DRGeoplotLayerMapper()
24   
25    owsOperations = (WMSController.owsOperations + ['GetDisplayOptions','GetDisplayOptions2','GetFigure'])
26   
27    nonPILFormats = {'application/postscript':'ps',
28                     'application/pdf':'pdf',
29                     'image/svg+xml':'svg'}
30   
31    def _loadCapabilities(self, *args, **kwargs):
32        ows_controller.addOperation('GetDisplayOptions', formats=['application/json'])
33        ows_controller.addOperation('GetFigure', formats=['image/png', 'image/jpg','image/gif', 'application/postscript', 'application/pdf','image/svg+xml' ])
34        WMSController._loadCapabilities(self, *args, **kwargs)
35   
36    def __before__(self, **kwargs):
37        wms_request_logger.info( buildLogString(request) )
38        WMSController.__before__(self, **kwargs)
39       
40#    @beaker_cache(expire=600, query_args=True)
41    def GetDisplayOptions(self):
42       
43        #create a list of names for each of the styles (each slabClass has its onw style)
44        styleOptionsMap = {}
45        for klass in DRGeoplotWmsLayer.slab_classes:
46            styleOptionsMap[klass.style] = [x for x in klass.renderingOptions]
47       
48       
49       
50        generator = SlabJSONGenerator(styleOptionsMap)
51       
52        request.headers['Content-Type'] = 'application/json'
53       
54        jsonString = generator.generateJSON()
55       
56        response.write( jsonString )
57   
58#    @beaker_cache(expire=600, query_args=True)
59    def GetFigure(self):
60        log.debug("entering GetFigure")
61        #!TODO: clearup!
62        # Get the parameters
63        version      = self._getVersionParam()
64        format = self.getOwsParam('format', default='image/png')
65       
66        validFormats = self._pilImageFormats.keys()
67        validFormats.extend(self.nonPILFormats.keys())
68       
69        if format not in validFormats:
70            raise InvalidParameterValue('Format %s not supported' % format, 'format')
71         
72        transparent  = self._getTransparentParam()
73        bgcolor      = self._getBgcolorParam()
74        bbox         = self._getBboxParam()
75        width        = self._getWidthParam()
76        height       = self._getHeightParam()
77       
78        layerObjects = self._getLayerParam()
79       
80        assert len(layerObjects) == 1
81        layerObj = layerObjects[0]
82       
83        styles       = self._getStylesParam(len(layerObjects))
84        srs          = self._getSrsParam(version)
85       
86        dimValues = self._getDimValues(layerObj)
87       
88       
89        log.debug("dimValues = %s" % (dimValues,))
90        variable = layerObj.dataReader.getNetcdfVar(layerObj.name, dimValues)
91       
92                           
93        params = self._getLowerCaseParams()
94       
95        log.debug("variable.shape = %s" % (variable.shape,))
96        log.debug("bbox = %s" % (bbox,))
97
98        (xMin, yMin, xMax, yMax) = bbox
99       
100        kwargs = {}
101        kwargs['xLimits'] = (xMin, xMax)
102        kwargs['yLimits'] = (yMin, yMax)
103        kwargs['drawColourBar'] = True
104        kwargs['drawLogo'] = True
105        kwargs['drawRivers'] = False
106        kwargs['drawMetadata'] = True
107        kwargs['units'] = layerObj.units
108        kwargs['width'] = width
109        kwargs['height'] = height
110
111        if 'cmap' in params:
112            kwargs['cmap']= params['cmap']
113       
114        if 'intervalcolourbar' in params:
115            kwargs['intervalColourbar'] = params['intervalcolourbar'].lower() == 'true'
116       
117        if 'intervalnames' in params:
118            kwargs['intervalNames'] = params['intervalnames'].split(',')
119       
120        if 'cmap_max' in params:
121            kwargs['colourBarMax'] = float(params['cmap_max'])
122        else:
123            kwargs['colourBarMax'] = variable[:].max()
124
125        if 'cmap_min' in params:
126            kwargs['colourBarMin'] = float(params['cmap_min'])
127        else:
128            kwargs['colourBarMin'] = variable[:].min()       
129       
130        log.info("kwargs = %s" % (kwargs,))
131       
132        if styles == "" or styles[0] == 'grid':
133           
134            if 'show_grid_lines' in params:
135                kwargs['showGridLines'] = params['show_grid_lines'].lower() == 'true'
136               
137            plt = PlotLatLon(variable, **kwargs)
138
139        elif styles[0] == 'contour':
140           
141            if 'num_contour_lines' in params:
142                kwargs['numContourLines'] = int(params['num_contour_lines'])
143       
144            if 'contour_label_interval' in params:
145                kwargs['contourLabelInterval'] = int(params['contour_label_interval'])
146               
147            log.debug("kwargs = %s" % (kwargs,))
148            plt = ContourPlot(cdmsVar=variable, **kwargs)
149           
150        else:
151            raise Exception("unknown style %s" % (styles[0],))
152 
153        if format in self.nonPILFormats.keys():
154            plt.format = self.nonPILFormats[format]
155            buf = plt.drawToBuffer()
156           
157            response.headers['Content-Type'] = format
158            response.write(buf.getvalue())   
159        else:
160           
161            img = plt.drawToImage()
162           
163            log.debug("img.format = %s" % (img.format,))
164           
165            log.debug("variable.getAxisIds() = %s" % (variable.getAxisIds(),))
166           
167            self._writeImageResponse(img, format)
168       
169        log.debug("dir(response) = %s" % (dir(response),))
170        log.debug("id(response) = %s" % (id(response),))
171       
172        log.debug("finished getFigure")
173   
174#    @beaker_cache(expire=600, query_args=True)
175    def GetMap(self):
176        return WMSController.GetMap(self)
177   
178#    @beaker_cache(expire=600, query_args=True)
179    def GetLegend(self):
180        return WMSController.GetLegend(self)
181   
182#    @beaker_cache(expire=600, query_args=True)
183    def GetCapabilities(self):
184        return WMSController.GetCapabilities(self)
185       
186    def _getLowerCaseParams(self):
187        lowerDictionary = {}
188       
189        for k, v in request.params.items():
190           
191            if v == None:
192                continue 
193           
194            v.strip()
195           
196            if v == "":
197                continue
198           
199            lowerDictionary[k.lower()] = v
200       
201        return lowerDictionary
202
203               
Note: See TracBrowser for help on using the repository browser.