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

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/qesdi/wms_ddc_vis/trunk/lib/wms_ddc_vis/controllers/csmlwms.py@5734
Revision 5734, 7.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.csml_geoplot_backend.csml_geoplot_layer_mapper import CSMLGeoplotLayerMapper
10from cows.service.imps.csml_geoplot_backend.csml_geoplot_wms_layer import CSMLGeoplotWmsLayer
11
12CSMLGeoplotWmsLayer.EnableDisplayOptions = True
13
14from wms_ddc_vis.lib.base import request, response
15from wms_ddc_vis.lib.wms_request_log_utils import buildLogString, wms_request_logger
16
17log = logging.getLogger(__name__)
18
19class CsmlwmsController(WMSController):
20    layerMapper = CSMLGeoplotLayerMapper()
21   
22    owsOperations = (WMSController.owsOperations + ['GetDisplayOptions','GetFigure'])
23   
24    nonPILFormats = {'application/postscript':'ps',
25                     'application/pdf':'pdf',
26                     'image/svg+xml':'svg'}
27
28    def __before__(self, **kwargs):
29        wms_request_logger.info( buildLogString(request) )
30        WMSController.__before__(self, **kwargs)
31 
32    def _loadCapabilities(self, *args, **kwargs):
33        ows_controller.addOperation('GetDisplayOptions', formats=['application/json'])
34        ows_controller.addOperation('GetFigure', formats=['image/png', 'image/jpg','image/gif', 'application/postscript', 'application/pdf','image/svg+xml' ])
35        WMSController._loadCapabilities(self, *args, **kwargs)
36   
37    def GetDisplayOptions(self):
38               
39        displayOptions = {
40          "common": [
41                        {
42                            "type":"select",
43                            "name":"cmap",
44                            "options":["bone","jet", "copper", "gray", "winter"],
45                            "title":"Colour Scheme",
46                            "defaultVal":"jet",
47                        },
48                        {
49                            "type":"value",
50                            "name":"cmap_min",
51                            "title":"Legend Min",
52                            "defaultVal":None,
53                        },
54                        {
55                            "type":"value",
56                            "name":"cmap_max",
57                            "title":"Legend Max",
58                            "defaultVal":None,
59                        },         
60                     ],
61          "grid": [
62                        {
63                            "type":"bool",
64                            "name":"show_grid_lines",
65                            "title":"Draw Grid Boxes",
66                            "defaultVal":"False",
67                        },   
68                  ],
69          "contour":[
70                        {
71                            "type":"value",
72                            "name":"num_contour_lines",
73                            "title":"Number of Contour Lines",
74                            "defaultVal":10,
75                        },
76                        {
77                            "type":"select",
78                            "name":"contour_font_size",
79                            "title":"Contour Label Size",
80                            "options":["small","medium", "large",],
81                            "defaultVal":"medium",
82                        },   
83                        {
84                            "type":"value",
85                            "name":"contour_label_interval",
86                            "title":"Interval Between Labels",
87                            "defaultVal":1,
88                        },             
89                    ],
90        }
91       
92       
93        request.headers['Content-Type'] = 'application/json'
94        response.write( json.dumps(displayOptions) )
95       
96    def GetFigure(self):
97       
98        #!TODO:For a start just geting the GetMap params, clearup!
99        # Get the parameters
100        version      = self._getVersionParam()
101        format = self.getOwsParam('format', default='image/png')
102       
103        validFormats = self._pilImageFormats.keys()
104        validFormats.extend(self.nonPILFormats.keys())
105       
106        if format not in validFormats:
107            raise InvalidParameterValue('Format %s not supported' % format, 'format')
108         
109        transparent  = self._getTransparentParam()
110        bgcolor      = self._getBgcolorParam()
111        bbox         = self._getBboxParam()
112        width        = self._getWidthParam()
113        height       = self._getHeightParam()
114       
115        layerObjects = self._getLayerParam()
116       
117        assert len(layerObjects) == 1
118        layerObj = layerObjects[0]
119       
120        styles       = self._getStylesParam(len(layerObjects))
121        srs          = self._getSrsParam(version)
122       
123        dimValues = self._getDimValues(layerObj)
124       
125        variable = layerObj._getNetcdfVar(dimValues)
126       
127        log.debug("variable.shape = %s" % (variable.shape,))
128        log.debug("bbox = %s" % (bbox,))
129       
130        (xMin, yMin, xMax, yMax) = bbox
131       
132        kwargs = {}
133        kwargs['xLimits'] = (xMin, xMax)
134        kwargs['yLimits'] = (yMin, yMax)
135        kwargs['drawColourBar'] = True
136        kwargs['drawLogo'] = True
137        kwargs['drawRivers'] = False
138        kwargs['drawMetadata'] = True
139        kwargs['units'] = layerObj.units
140
141        if self.getOwsParam('cmap', default=None) != None:
142            kwargs['cmap'] = self.getOwsParam('cmap')
143       
144        if self.getOwsParam('CMAP_MAX', default=None) != None:
145            kwargs['colourBarMax'] = float(self.getOwsParam('CMAP_MAX'))
146        else:
147            kwargs['colourBarMax'] = variable[:].max()
148
149        if self.getOwsParam('CMAP_MIN', default=None) != None:
150            kwargs['colourBarMin'] = float(self.getOwsParam('CMAP_MIN'))
151        else:
152            kwargs['colourBarMin'] = variable[:].min()       
153       
154 
155        if styles == "" or styles[0] == 'grid':
156           
157            if self.getOwsParam('SHOW_GRID_LINES', default=None) != None:
158                kwargs['showGridLines'] = self.getOwsParam('SHOW_GRID_LINES').lower() == 'true'
159               
160            plt = PlotLatLon(variable, **kwargs)
161
162        elif styles[0] == 'contour':
163           
164            if self.getOwsParam('NUM_CONTOUR_LINES', default=None) != None:
165                kwargs['numContourLines'] = int(self.getOwsParam('NUM_CONTOUR_LINES'))
166       
167            if self.getOwsParam('CONTOUR_LABEL_INTERVAL', default=None) != None:
168                kwargs['contourLabelInterval'] = int(self.getOwsParam('CONTOUR_LABEL_INTERVAL'))
169               
170            log.debug("kwargs = %s" % (kwargs,))
171            plt = ContourPlot(cdmsVar=variable, **kwargs)
172           
173        else:
174            raise Exception("unknown style %s" % (styles[0],))
175 
176       
177        if format in self.nonPILFormats.keys():
178            plt.format = self.nonPILFormats[format]
179            buf = plt.drawToBuffer()
180           
181            response.headers['Content-Type'] = format
182            response.write(buf.getvalue())   
183        else:
184           
185           
186            img = plt.drawToImage()
187           
188            log.debug("img.format = %s" % (img.format,))
189           
190            log.debug("variable.getAxisIds() = %s" % (variable.getAxisIds(),))
191           
192            self._writeImageResponse(img, format)
193           
194        log.debug("finished getFigure")
195           
Note: See TracBrowser for help on using the repository browser.