source: qesdi/wms_ddc_vis/trunk/lib/wms_ddc_vis/controllers/csmlwms.py @ 5879

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

Minor tidying up.

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