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

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

Support several image formats

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