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

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

Added the 'auto' layer to the coastwms.

Fixed a bug in the wms getFigure code.

Added some additional getFigure options to the wms3 code.

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        variable = layerObj._getNetcdfVar(dimValues)
121       
122        log.debug("variable.shape = %s" % (variable.shape,))
123        log.debug("bbox = %s" % (bbox,))
124       
125        (xMin, yMin, xMax, yMax) = bbox
126       
127        kwargs = {}
128        kwargs['xLimits'] = (xMin, xMax)
129        kwargs['yLimits'] = (yMin, yMax)
130        kwargs['drawColourBar'] = True
131        kwargs['drawLogo'] = True
132        kwargs['drawRivers'] = False
133        kwargs['drawMetadata'] = True
134        kwargs['units'] = layerObj.units
135
136        if self.getOwsParam('cmap', default=None) != None:
137            kwargs['cmap'] = self.getOwsParam('cmap')
138       
139        if self.getOwsParam('CMAP_MAX', default=None) != None:
140            kwargs['colourBarMax'] = float(self.getOwsParam('CMAP_MAX'))
141        else:
142            kwargs['colourBarMax'] = variable[:].max()
143
144        if self.getOwsParam('CMAP_MIN', default=None) != None:
145            kwargs['colourBarMin'] = float(self.getOwsParam('CMAP_MIN'))
146        else:
147            kwargs['colourBarMin'] = variable[:].min()       
148       
149 
150        if styles == "" or styles[0] == 'grid':
151           
152            if self.getOwsParam('SHOW_GRID_LINES', default=None) != None:
153                kwargs['showGridLines'] = self.getOwsParam('SHOW_GRID_LINES').lower() == 'true'
154               
155            plt = PlotLatLon(variable, **kwargs)
156
157        elif styles[0] == 'contour':
158           
159            if self.getOwsParam('NUM_CONTOUR_LINES', default=None) != None:
160                kwargs['numContourLines'] = int(self.getOwsParam('NUM_CONTOUR_LINES'))
161       
162            if self.getOwsParam('CONTOUR_LABEL_INTERVAL', default=None) != None:
163                kwargs['contourLabelInterval'] = int(self.getOwsParam('CONTOUR_LABEL_INTERVAL'))
164               
165            log.debug("kwargs = %s" % (kwargs,))
166            plt = ContourPlot(cdmsVar=variable, **kwargs)
167           
168        else:
169            raise Exception("unknown style %s" % (styles[0],))
170 
171       
172        if format in self.nonPILFormats.keys():
173            plt.format = self.nonPILFormats[format]
174            buf = plt.drawToBuffer()
175           
176            response.headers['Content-Type'] = format
177            response.write(buf.getvalue())   
178        else:
179           
180           
181            img = plt.drawToImage()
182           
183            log.debug("img.format = %s" % (img.format,))
184           
185            log.debug("variable.getAxisIds() = %s" % (variable.getAxisIds(),))
186           
187            self._writeImageResponse(img, format)
188           
189        log.debug("finished getFigure")
190           
Note: See TracBrowser for help on using the repository browser.