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

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

Added some wms request logging that writes the parameeters and the header information to a file. Hopefully this will enable statistics to be generated on the data usage.

Also made some changes to the demo page so that it works in IE.

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