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

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

New interface works in view.html

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