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

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

Capabilities almost done

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            addLayer(layerName, title=layer.title, abstract=layer.abstract,
32                     #!TODO dimensions
33                     srs=layer.GridClass.crs, bbox=model.ukcip02.bbox)
34
35    def GetMap(self):
36
37        # Housekeeping
38        version = self.getOwsParam('version', default=self.validVersions[0])
39        if version not in self.validVersions:
40            raise InvalidParameterValue('Version %s not supported' % version,
41                                        'version')
42        styles = self.getOwsParam('styles', default='')
43        transparent = self.getOwsParam('transparent', default='FALSE')
44        bgcolor = self.getOwsParam('bgcolor', default='0xFFFFFF')
45               
46        # Coordinate parameters
47        bbox = tuple(float(x) for x in self.getOwsParam('bbox').split(','))
48        width = int(self.getOwsParam('width'))
49        height = int(self.getOwsParam('height'))
50        srs = self.getOwsParam('srs')
51        #!TODO: Check valid srs
52
53
54        # Layer handling
55        layer = self.getOwsParam('layers')
56        if ',' in layer:
57            raise InvalidParameterValue(
58                'Multi-layer GetMap requests are not supported', 'layers')
59        try:
60            layerObj = model.ukcip02.layers[layer]
61        except KeyError:
62            raise InvalidParameterValue('Layer %s not found' % layer, 'layers')
63
64        # Get format and create a renderer
65        format = self.getOwsParam('format')
66        renderer = RGBARenderer(layerObj.minValue, layerObj.maxValue)
67        if format != renderer.mimeType:
68            raise InvalidParameterValue(
69                'Format %s not supported' % format, 'format')
70
71
72        # Dimension handling
73        dims = dict(time=self.getOwsParam('time'))
74
75
76        # The real work
77        grid = layerObj.selectGrid(bbox, dims)
78        img = renderer.renderGrid(grid, bbox, width, height, cmap=get_cmap())
79
80        # IE < 7 doesn't display the alpha layer right.  Here we sniff the
81        # user agent and remove the alpha layer if necessary.
82        try:
83            ua = request.headers['User-Agent']
84        except:
85            pass
86        else:
87            if 'MSIE' in ua and 'MSIE 7' not in ua:
88                img = img.convert('RGB')
89
90        buf = StringIO()
91        img.save(buf, 'PNG')
92
93        response.headers['Content-Type'] = renderer.mimeType
94        response.write(buf.getvalue())
95
96        return request
97
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 model.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.