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

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/qesdi/wms_ddc_vis/trunk/lib/wms_ddc_vis/controllers/csmlwms.py@5849
Revision 5849, 7.5 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.

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
14DRGeoplotWmsLayer.EnableXMLAxisConfig = True
15
16from wms_ddc_vis.lib.base import request, response
17from wms_ddc_vis.lib.wms_request_log_utils import buildLogString, wms_request_logger
18
19from wms_ddc_vis.lib.modified_beaker_cache_decorator import beaker_cache
20
21log = logging.getLogger(__name__)
22
23class CsmlwmsController(WMSController):
24    layerMapper = DRGeoplotLayerMapper()
25   
26    owsOperations = (WMSController.owsOperations + ['GetDisplayOptions','GetAxisConfig','GetFigure'])
27   
28    nonPILFormats = {'application/postscript':'ps',
29                     'application/pdf':'pdf',
30                     'image/svg+xml':'svg'}
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 __before__(self, **kwargs):
38        wms_request_logger.info( buildLogString(request) )
39        WMSController.__before__(self, **kwargs)
40       
41#    @beaker_cache(expire=600, query_args=True)
42    def GetDisplayOptions(self):
43       
44        #create a list of names for each of the styles (each slabClass has its onw style)
45        styleOptionsMap = {}
46        for klass in DRGeoplotWmsLayer.slab_classes:
47            styleOptionsMap[klass.style] = [x for x in klass.renderingOptions]
48       
49       
50       
51        generator = SlabJSONGenerator(styleOptionsMap)
52       
53        response.headers['Content-Type'] = 'application/json'
54       
55        jsonString = generator.generateJSON()
56       
57        response.write( jsonString )
58
59    def GetAxisConfig(self):
60        log.debug("self.layers = %s" % (self.layers,))
61       
62        layer = self._getLayerParam()[0]
63       
64        log.debug("layer = %s" % (layer,))
65       
66        configFile = layer.getAxisConfigFile()
67        log.debug("configFile = %s" % (configFile,))
68       
69        fin = open(configFile,'r')
70        log.debug("fin = %s" % (fin,))
71        response.headers['content-type'] = 'text/xml'
72       
73        response.write(fin.read())
74       
75
76#    @beaker_cache(expire=600, query_args=True)
77    def GetFigure(self):
78        log.debug("entering GetFigure")
79        #!TODO: clearup!
80        # Get the parameters
81        version      = self._getVersionParam()
82        format = self.getOwsParam('format', default='image/png')
83       
84        validFormats = self._pilImageFormats.keys()
85        validFormats.extend(self.nonPILFormats.keys())
86       
87        if format not in validFormats:
88            raise InvalidParameterValue('Format %s not supported' % format, 'format')
89         
90        transparent  = self._getTransparentParam()
91        bgcolor      = self._getBgcolorParam()
92        bbox         = self._getBboxParam()
93        width        = self._getWidthParam()
94        height       = self._getHeightParam()
95       
96        layerObjects = self._getLayerParam()
97       
98        assert len(layerObjects) == 1
99        layerObj = layerObjects[0]
100       
101        styles       = self._getStylesParam(len(layerObjects))
102        srs          = self._getSrsParam(version)
103       
104        dimValues = self._getDimValues(layerObj)
105       
106       
107        log.debug("dimValues = %s" % (dimValues,))
108        variable = layerObj.dataReader.getNetcdfVar(layerObj.name, dimValues)
109       
110                           
111        params = self._getLowerCaseParams()
112       
113        log.debug("variable.shape = %s" % (variable.shape,))
114        log.debug("bbox = %s" % (bbox,))
115
116        (xMin, yMin, xMax, yMax) = bbox
117       
118        kwargs = {}
119        kwargs['xLimits'] = (xMin, xMax)
120        kwargs['yLimits'] = (yMin, yMax)
121        kwargs['drawColourBar'] = True
122        kwargs['drawLogo'] = True
123        kwargs['drawRivers'] = False
124        kwargs['drawMetadata'] = True
125        kwargs['units'] = layerObj.units
126        kwargs['width'] = width
127        kwargs['height'] = height
128
129        if 'cmap' in params:
130            kwargs['cmap']= params['cmap']
131       
132        if 'intervalcolourbar' in params:
133            kwargs['intervalColourbar'] = params['intervalcolourbar'].lower() == 'true'
134       
135        if 'intervalnames' in params:
136            kwargs['intervalNames'] = params['intervalnames'].split(',')
137       
138        if 'cmap_max' in params:
139            kwargs['colourBarMax'] = float(params['cmap_max'])
140        else:
141            kwargs['colourBarMax'] = variable[:].max()
142
143        if 'cmap_min' in params:
144            kwargs['colourBarMin'] = float(params['cmap_min'])
145        else:
146            kwargs['colourBarMin'] = variable[:].min()       
147       
148        log.info("kwargs = %s" % (kwargs,))
149       
150        if styles == "" or styles[0] == 'grid':
151           
152            if 'show_grid_lines' in params:
153                kwargs['showGridLines'] = params['show_grid_lines'].lower() == 'true'
154               
155            plt = PlotLatLon(variable, **kwargs)
156
157        elif styles[0] == 'contour':
158           
159            if 'num_contour_lines' in params:
160                kwargs['numContourLines'] = int(params['num_contour_lines'])
161       
162            if 'contour_label_interval' in params:
163                kwargs['contourLabelInterval'] = int(params['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        if format in self.nonPILFormats.keys():
172            plt.format = self.nonPILFormats[format]
173            buf = plt.drawToBuffer()
174           
175            response.headers['Content-Type'] = format
176            response.write(buf.getvalue())   
177        else:
178           
179            img = plt.drawToImage()
180           
181            log.debug("img.format = %s" % (img.format,))
182           
183            log.debug("variable.getAxisIds() = %s" % (variable.getAxisIds(),))
184           
185            self._writeImageResponse(img, format)
186       
187        log.debug("dir(response) = %s" % (dir(response),))
188        log.debug("id(response) = %s" % (id(response),))
189       
190        log.debug("finished getFigure")
191   
192#    @beaker_cache(expire=600, query_args=True)
193    def GetMap(self):
194        return WMSController.GetMap(self)
195   
196#    @beaker_cache(expire=600, query_args=True)
197    def GetLegend(self):
198        return WMSController.GetLegend(self)
199   
200#    @beaker_cache(expire=600, query_args=True)
201    def GetCapabilities(self):
202        return WMSController.GetCapabilities(self)
203       
204    def _getLowerCaseParams(self):
205        lowerDictionary = {}
206       
207        for k, v in request.params.items():
208           
209            if v == None:
210                continue 
211           
212            v.strip()
213           
214            if v == "":
215                continue
216           
217            lowerDictionary[k.lower()] = v
218       
219        return lowerDictionary
220
221               
Note: See TracBrowser for help on using the repository browser.