source: DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/controllers/ukcip_wms.py @ 3532

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/controllers/ukcip_wms.py@3532
Revision 3532, 4.0 KB checked in by spascoe, 13 years ago (diff)

Moving to a different interface between the WMS controller and the
data. interfaces.py now contains ILayer et al. to represent layers
of data.

Line 
1import logging
2from cStringIO import StringIO
3
4from matplotlib.cm import get_cmap
5
6from ows_common.pylons.ows_controller import OwsController, genshiLoader, addOperation, addLayer
7from ows_common.exceptions import *
8
9from ukcip_server.lib.base import *
10from ukcip_server.model.pywms.wms_cdms import SimpleCdmsLayer
11from ukcip_server.model.pywms.render_imp import RGBARenderer
12
13log = logging.getLogger(__name__)
14
15class UkcipWmsController(OwsController):
16
17    service = 'WMS'
18    owsOperations = OwsController.owsOperations + ['GetMap', 'GetInfo']
19    validVersions = ['1.1.1']
20
21    def _renderCapabilities(self, version, format):
22        t = genshiLoader.load('wms_capabilities_1_1_1.xml')
23        return t.generate(c=c).render()
24
25    def _loadCapabilities(self):
26        addOperation('GetMap', formats=['image/png'])
27        addOperation('GetInfo')
28        log.debug('Loading capabilities contents')
29        for layerName, layer in model.ukcip02.layers.items():
30            log.debug('Loading layer %s' % layerName)
31            dims = {}
32            for dimName, dim in layer.dimensions.items():
33                dims[dimName] = dict(extent=dim.extent.split(','),
34                                     units=dim.units,
35                                     unitSymbol='?')
36            addLayer(layerName, title=layer.title, abstract=layer.abstract,
37                     dimensions=dims,
38                     srs=layer.GridClass.crs, bbox=model.ukcip02.bbox)
39
40    def GetMap(self):
41
42        # Housekeeping
43        version = self.getOwsParam('version', default=self.validVersions[0])
44        if version not in self.validVersions:
45            raise InvalidParameterValue('Version %s not supported' % version,
46                                        'version')
47        styles = self.getOwsParam('styles', default='')
48        transparent = self.getOwsParam('transparent', default='FALSE')
49        bgcolor = self.getOwsParam('bgcolor', default='0xFFFFFF')
50               
51        # Coordinate parameters
52        bbox = tuple(float(x) for x in self.getOwsParam('bbox').split(','))
53        width = int(self.getOwsParam('width'))
54        height = int(self.getOwsParam('height'))
55        srs = self.getOwsParam('srs')
56        #!TODO: Check valid srs
57
58
59        # Layer handling
60        layer = self.getOwsParam('layers')
61        if ',' in layer:
62            raise InvalidParameterValue(
63                'Multi-layer GetMap requests are not supported', 'layers')
64        try:
65            layerObj = model.ukcip02.layers[layer]
66        except KeyError:
67            raise InvalidParameterValue('Layer %s not found' % layer, 'layers')
68
69        # Get format and create a renderer
70        format = self.getOwsParam('format')
71        renderer = RGBARenderer(layerObj.minValue, layerObj.maxValue)
72        if format != renderer.mimeType:
73            raise InvalidParameterValue(
74                'Format %s not supported' % format, 'format')
75
76
77        # Dimension handling
78        dims = dict(time=self.getOwsParam('time', default='1961-1-15T0:0:0.0Z,1961-2-1T0:0:0.0Z'))
79
80
81        # The real work
82        grid = layerObj.selectGrid(bbox, dims)
83        img = renderer.renderGrid(grid, bbox, width, height, cmap=get_cmap())
84
85        # IE < 7 doesn't display the alpha layer right.  Here we sniff the
86        # user agent and remove the alpha layer if necessary.
87        try:
88            ua = request.headers['User-Agent']
89        except:
90            pass
91        else:
92            if 'MSIE' in ua and 'MSIE 7' not in ua:
93                img = img.convert('RGB')
94
95        buf = StringIO()
96        img.save(buf, 'PNG')
97
98        response.headers['Content-Type'] = renderer.mimeType
99        response.write(buf.getvalue())
100
101        return request
102
103    def GetInfo(self):
104        from pprint import pformat
105        request.headers['Content-Type'] = 'text/ascii'
106        response.write('Some info about this service\n')
107        for layer in model.ukcip02.layers:
108            response.write('Layer %s: %s\n' % (layer, pformat(g.ukcip02_layers[layer].__dict__)))
109
110           
Note: See TracBrowser for help on using the repository browser.