source: qesdi/wms_ddc_vis/trunk/lib/wms_ddc_vis/controllers/csmlwms_csml_geoplot.py @ 5849

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

Added some code to try and pass the axis config xml to the UI.

Also included a modified version of the beaker cache decorator that I've been using to cache the coastline map.

RevLine 
[5403]1import logging
[5529]2import simplejson as json
[5647]3from geoplot.plot_lat_lon import PlotLatLon
4from geoplot.contour_plot import ContourPlot
[5479]5
[5494]6from cows.pylons.wms_controller import WMSController
[5647]7from cows.pylons import ows_controller
[5403]8
[5647]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
[5500]14from wms_ddc_vis.lib.base import request, response
[5734]15from wms_ddc_vis.lib.wms_request_log_utils import buildLogString, wms_request_logger
[5500]16
[5479]17log = logging.getLogger(__name__)
[5403]18
[5479]19class CsmlwmsController(WMSController):
[5647]20    layerMapper = CSMLGeoplotLayerMapper()
[5483]21   
[5647]22    owsOperations = (WMSController.owsOperations + ['GetDisplayOptions','GetFigure'])
[5500]23   
[5647]24    nonPILFormats = {'application/postscript':'ps',
25                     'application/pdf':'pdf',
26                     'image/svg+xml':'svg'}
[5734]27
28    def __before__(self, **kwargs):
29        wms_request_logger.info( buildLogString(request) )
30        WMSController.__before__(self, **kwargs)
31 
[5647]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   
[5500]37    def GetDisplayOptions(self):
[5647]38               
[5529]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       
[5500]93        request.headers['Content-Type'] = 'application/json'
[5529]94        response.write( json.dumps(displayOptions) )
[5647]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       
[5701]125        variable = layerObj._getNetcdfVar(dimValues)
[5647]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
[5483]140
[5647]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.