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

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

Removed the ddc layer/slab/layermapper as these are now included in cows as the csml_geoplot implementation.

Added the GetFigure? method that uses geoplot to generate a simple figure output.

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