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

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

Basic GetMap? works. No GetCapabilities? yet.

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