source: cows/trunk/cows/service/imps/pywms/impl.py @ 4808

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows/trunk/cows/service/imps/pywms/impl.py@4808
Revision 4808, 4.8 KB checked in by domlowe, 11 years ago (diff)

adding contents of pywms

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
33    featureInfoFormats = ['text/html']
34   
35    def __init__(self, cdmsVar, GridClass=CdmsGrid, minValue=None, maxValue=None,
36                 units=None):
37        try:
38            self.title = cdmsVar.long_name
39        except AttributeError:
40            self.title = cdmsVar.id
41
42        self._layer = SimpleCdmsLayer(cdmsVar, GridClass=GridClass)
43        self.abstract = None
44        self.crss = [GridClass.crs]
45        #!TODO: do this properly
46        self.wgs84BBox = (-15.0, 45.0, 15.0, 60.0)
47        if units:
48            self.units = units
49        else:
50            self.units = self._layer.units
51        self.minValue = minValue
52        self.maxValue = maxValue
53
54        self.legendSize=(100, 500)
55
56        dims = {}
57        for dimName, dim in self._layer.dimensions.items():
58            dims[dimName] = Dimension(dim)
59        self.dimensions = dims
60
61    def getBBox(self, crs):
62        # Get BBOX from pywms layer
63        var = self._layer.var
64        xAxis = var.getAxis(var.getAxisIndex('eastings'))
65        yAxis = var.getAxis(var.getAxisIndex('northings'))
66        #!NOTE order specific code
67        return (xAxis[0], yAxis[-1], xAxis[-1], yAxis[0])
68
69    def getSlab(self, crs, dimValues=None, renderOpts={}):
70        if crs != self.crss[0]:
71            raise ValueError("CRS %s not supported on this layer" % crs)
72       
73        return CdmsLayerSlab(crs, dimValues, renderOpts, self)
74
75    def getCacheKey(self, crs, dimValues=None, renderOpts={}):
76        # Don't support caching
77        return None
78
79    def getLegendImage(self, orientation='vertical', renderOpts={}):
80        if 'vert' in orientation:
81            figsize = (1, 5)
82            rect = (0.05, 0.05, 0.4, 0.9)
83        else:
84            figsize = (5, 1)
85            rect = (0.05, 0.55, 0.9, 0.4)
86           
87       
88        fig = Figure(figsize=figsize, dpi=100)
89        ax = fig.add_axes(rect)
90        boundaries = arange(self.minValue, self.maxValue,
91                           float(self.maxValue-self.minValue)/256)
92        loc = LinearLocator()
93        loc.set_bounds(self.minValue, self.maxValue)
94        ColorbarBase(ax, boundaries=boundaries, orientation=orientation, ticks=loc(),
95                     cmap=get_cmap(renderOpts.get('cmap', 'Paired')))
96
97        if 'vert' in orientation:
98            ax.set_ylabel(self.units)
99        else:
100            ax.set_xlabel(self.units)
101
102        c = FigureCanvas(fig)
103        c.draw()
104        buf = StringIO()
105        c.print_png(buf)
106        buf.seek(0)
107        img = Image.open(buf)
108
109        return img
110
111    def getFeatureInfo(self, format, crs, point, dimValues):
112        # We assume here format and crs are valid (the framework should check).
113        (x, y) = point
114
115        var = self._layer.var
116        # Get the data at that point
117        sel = dict(eastings=x, northings=y)
118        # Ignore dimvalues
119        # sel.update(dimValues)
120        val = var(**sel)
121       
122        return '''
123<html>
124<body>
125<h1>GetFeatureInfoResponse for layer: %s</h1>
126Selection: %s<br/>
127Value: %s<br/>
128</body>
129</html>
130''' % (self.title, sel, val)
131       
132
133class CdmsLayerSlab(ILayerSlab):
134    def __init__(self, crs, dimValues, renderOpts, layer):
135        self.crs = crs
136        self.dimValues = dimValues
137        self.renderOpts = renderOpts
138        self.layer = layer
139        self.bbox = layer.getBBox(crs)
140
141        self._renderer = RGBARenderer(self.layer.minValue, self.layer.maxValue)
142
143    def getImage(self, bbox, width, height):
144        grid = self.layer._layer.selectGrid(bbox, self.dimValues)
145        cmap = get_cmap(self.renderOpts.get('cmap', 'Paired'))
146        img = self._renderer.renderGrid(grid, bbox, width, height, cmap)
147
148        return img
149
150    def getCacheKey(self):
151        raise NotImplementedError
152   
153
154class Dimension(IDimension):
155    """
156    Wrapper to fix some interface differences.
157
158    """
159    def __init__(self, pywmsDim):
160        self.units = pywmsDim.units
161        self.extent = pywmsDim.extent.split(',')
Note: See TracBrowser for help on using the repository browser.