source: DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/model/pywms/impl.py @ 3668

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/model/pywms/impl.py@3668
Revision 3668, 4.1 KB checked in by spascoe, 11 years ago (diff)

Fix time dimension units

Line 
1"""
2Implements the WMS interfaces for simple CDMS variables
3
4This implementation is for backward compatibility between the old interface and
5the new.  Only one CRS per layer is supported.
6
7"""
8from ows_common.service.wms_iface import ILayer, ILayerSlab, IDimension
9from wms_cdms import SimpleCdmsLayer, CdmsTimeDimension, CdmsGrid
10import cdtime
11from render_imp import RGBARenderer
12from matplotlib.cm import get_cmap
13from matplotlib.colorbar import ColorbarBase
14from matplotlib.ticker import LinearLocator
15from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
16from matplotlib.figure import Figure
17from numpy import arange
18
19from cStringIO import StringIO
20import Image
21
22import logging
23log = logging.getLogger(__name__)
24
25class CdmsLayer(ILayer):
26    """
27    The ILayer interface has superceded model.Layer and therefore CdmsLayer
28    does not inherit from model.Layer or SimpleCdmsLayer.  Instead encapsulation
29    is used.
30
31    """
32    def __init__(self, cdmsVar, GridClass=CdmsGrid, minValue=None, maxValue=None,
33                 units=None):
34        try:
35            self.title = cdmsVar.long_name
36        except AttributeError:
37            self.title = cdmsVar.id
38
39        self._layer = SimpleCdmsLayer(cdmsVar, GridClass=GridClass)
40        self.abstract = None
41        self.crss = [GridClass.crs, 'EPSG:27700']
42        if units:
43            self.units = units
44        else:
45            self.units = self._layer.units
46        self.minValue = minValue
47        self.maxValue = maxValue
48
49        self.legendSize=(100, 500)
50
51        dims = {}
52        for dimName, dim in self._layer.dimensions.items():
53            dims[dimName] = Dimension(dim)
54        self.dimensions = dims
55
56       
57
58
59    def getBBox(self, crs):
60        # Get BBOX from pywms layer
61        var = self._layer.var
62        xAxis = var.getAxis(var.getAxisIndex('eastings'))
63        yAxis = var.getAxis(var.getAxisIndex('northings'))
64        #!NOTE order specific code
65        return (xAxis[0], yAxis[-1], xAxis[-1], yAxis[0])
66
67    def getSlab(self, crs, dimValues=None, renderOpts={}):
68        if crs != self.crss[0]:
69            raise ValueError("CRS %s not supported on this layer" % crs)
70       
71        return CdmsLayerSlab(crs, dimValues, renderOpts, self)
72
73    def getCacheKey(self, crs, dimValues=None, renderOpts={}):
74        # Don't support caching
75        return None
76
77    def getLegendImage(self, orientation='vertical', renderOpts={}):
78        if 'vert' in orientation:
79            figsize = (1, 5)
80            rect = (0.05, 0.05, 0.4, 0.9)
81        else:
82            figsize = (5, 1)
83            rect = (0.05, 0.55, 0.9, 0.4)
84           
85       
86        fig = Figure(figsize=figsize, dpi=100)
87        ax = fig.add_axes(rect)
88        boundaries = arange(self.minValue, self.maxValue,
89                           float(self.maxValue-self.minValue)/256)
90        loc = LinearLocator()
91        loc.set_bounds(self.minValue, self.maxValue)
92        ColorbarBase(ax, boundaries=boundaries, orientation=orientation, ticks=loc())
93
94        if 'vert' in orientation:
95            ax.set_ylabel(self.units)
96        else:
97            ax.set_xlabel(self.units)
98
99        c = FigureCanvas(fig)
100        c.draw()
101        buf = StringIO()
102        c.print_png(buf)
103        buf.seek(0)
104        img = Image.open(buf)
105
106        return img
107
108class CdmsLayerSlab(ILayerSlab):
109    def __init__(self, crs, dimValues, renderOpts, layer):
110        self.crs = crs
111        self.dimValues = dimValues
112        self.renderOpts = renderOpts
113        self.layer = layer
114        self.bbox = layer.getBBox(crs)
115
116        self._renderer = RGBARenderer(self.layer.minValue, self.layer.maxValue)
117
118    def getImage(self, bbox, width, height):
119        grid = self.layer._layer.selectGrid(bbox, self.dimValues)
120        cmap = get_cmap(self.renderOpts.get('cmap', 'jet'))
121        img = self._renderer.renderGrid(grid, bbox, width, height, cmap)
122
123        return img
124
125    def getCacheKey(self):
126        raise NotImplementedError
127   
128
129class Dimension(IDimension):
130    """
131    Wrapper to fix some interface differences.
132
133    """
134    def __init__(self, pywmsDim):
135        self.units = pywmsDim.units
136        self.extent = pywmsDim.extent.split(',')
Note: See TracBrowser for help on using the repository browser.