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

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

Made compatible with latest ows_common-refactor

Line 
1import logging
2from cStringIO import StringIO
3
4from matplotlib.cm import get_cmap
5
6from ows_common.pylons.ows_controller import OwsController, genshiLoader
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 GetMap(self):
26
27        # Housekeeping
28        version = self.getOwsParam('version', default=self.validVersions[0])
29        if version not in self.validVersions:
30            raise InvalidParameterValue('Version %s not supported' % version,
31                                        'version')
32        styles = self.getOwsParam('styles', default='')
33        transparent = self.getOwsParam('transparent', default='FALSE')
34        bgcolor = self.getOwsParam('bgcolor', default='0xFFFFFF')
35               
36        # Coordinate parameters
37        bbox = tuple(float(x) for x in self.getOwsParam('bbox').split(','))
38        width = int(self.getOwsParam('width'))
39        height = int(self.getOwsParam('height'))
40        srs = self.getOwsParam('srs')
41        if srs != 'EPSG:4326':
42            raise InvalidParameterValue('SRS %s not supported' % srs,
43                                              'srs')
44
45
46        # Layer handling
47        layer = self.getOwsParam('layers')
48        if ',' in layer:
49            raise InvalidParameterValue(
50                'Multi-layer GetMap requests are not supported', 'layers')
51        try:
52            layerObj = g.ukcip02_layers[layer]
53        except KeyError:
54            raise InvalidParameterValue('Layer %s not found' % layer, 'layers')
55
56        # Get format and create a renderer
57        format = self.getOwsParam('format')
58        renderer = RGBARenderer(layerObj.minValue, layerObj.maxValue)
59        if format != renderer.mimeType:
60            raise InvalidParameterValue(
61                'Format %s not supported' % format, 'format')
62
63
64        # Dimension handling
65        dims = dict(time=self.getOwsParam('time'))
66
67
68        # The real work
69        grid = layerObj.selectGrid(bbox, dims)
70        img = renderer.renderGrid(grid, bbox, width, height, cmap=get_cmap())
71
72        # IE < 7 doesn't display the alpha layer right.  Here we sniff the
73        # user agent and remove the alpha layer if necessary.
74        try:
75            ua = request.headers['User-Agent']
76        except:
77            pass
78        else:
79            if 'MSIE' in ua and 'MSIE 7' not in ua:
80                img = img.convert('RGB')
81
82        buf = StringIO()
83        img.save(buf, 'PNG')
84
85        response.headers['Content-Type'] = renderer.mimeType
86        response.write(buf.getvalue())
87
88        return request
89
90    def GetInfo(self):
91        from pprint import pformat
92        request.headers['Content-Type'] = 'text/ascii'
93        response.write('Some info about this service\n')
94        for layer in g.ukcip02_layers:
95            response.write('Layer %s: %s\n' % (layer, pformat(g.ukcip02_layers[layer].__dict__)))
96
97           
Note: See TracBrowser for help on using the repository browser.