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.

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
18log = logging.getLogger(__name__)
19
20
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   
35    def __before__(self, **kwargs):
36        wms_request_logger.info( buildLogString(request) )
37        WMSController.__before__(self, **kwargs)
38   
39    def GetDisplayOptions(self):
40       
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]
45       
46       
47       
48        generator = SlabJSONGenerator(styleOptionsMap)
49       
50        request.headers['Content-Type'] = 'application/json'
51       
52        jsonString = generator.generateJSON()
53       
54        response.write( jsonString )
55   
56   
57    def GetFigure(self):
58       
59        #!TODO: clearup!
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       
86       
87        log.debug("dimValues = %s" % (dimValues,))
88        variable = layerObj.dataReader.getNetcdfVar(layerObj.name, dimValues)
89       
90                           
91        params = self._getLowerCaseParams()
92       
93        log.debug("variable.shape = %s" % (variable.shape,))
94        log.debug("bbox = %s" % (bbox,))
95
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
106        kwargs['width'] = width
107        kwargs['height'] = height
108
109        if 'cmap' in params:
110            kwargs['cmap']= params['cmap']
111       
112        if 'intervalcolourbar' in params:
113            kwargs['intervalColourbar'] = params['intervalcolourbar'].lower() == 'true'
114       
115        if 'intervalnames' in params:
116            kwargs['intervalNames'] = params['intervalnames'].split(',')
117       
118        if 'cmap_max' in params:
119            kwargs['colourBarMax'] = float(params['cmap_max'])
120        else:
121            kwargs['colourBarMax'] = variable[:].max()
122
123        if 'cmap_min' in params:
124            kwargs['colourBarMin'] = float(params['cmap_min'])
125        else:
126            kwargs['colourBarMin'] = variable[:].min()       
127       
128        log.info("kwargs = %s" % (kwargs,))
129       
130        if styles == "" or styles[0] == 'grid':
131           
132            if 'show_grid_lines' in params:
133                kwargs['showGridLines'] = params['show_grid_lines'].lower() == 'true'
134               
135            plt = PlotLatLon(variable, **kwargs)
136
137        elif styles[0] == 'contour':
138           
139            if 'num_contour_lines' in params:
140                kwargs['numContourLines'] = int(params['num_contour_lines'])
141       
142            if 'contour_label_interval' in params:
143                kwargs['contourLabelInterval'] = int(params['contour_label_interval'])
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       
169    def _getLowerCaseParams(self):
170        lowerDictionary = {}
171       
172        for k, v in request.params.items():
173           
174            if v == None:
175                continue 
176           
177            v.strip()
178           
179            if v == "":
180                continue
181           
182            lowerDictionary[k.lower()] = v
183       
184        return lowerDictionary
185
186               
Note: See TracBrowser for help on using the repository browser.