source: qesdi/geoplot/trunk/lib/geoplot/layer_drawer_grid_fast.py @ 6089

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/qesdi/geoplot/trunk/lib/geoplot/layer_drawer_grid_fast.py@6089
Revision 6089, 5.6 KB checked in by pnorton, 11 years ago (diff)

Imroved the colour bar code so that a legend colour bar can be used without specifying any intervals.

Line 
1"""
2A layer drawer that draws the grid boxes of the data onto an image object.
3"""
4
5import logging
6import time
7
8import geoplot.utils as geoplot_utils
9from geoplot.grid_drawer import GridDrawer
10from geoplot.layer_drawer import LayerDrawerBase
11from geoplot.colour_scheme import ColourSchemeBuilder
12from geoplot.grid_builder_lat_lon_subset import GridBuilderLatLonSubset
13
14import numpy
15
16from geoplot.colour_bar import COLOUR_BAR_STYLES
17
18log = logging.getLogger(__name__)
19
20class LayerDrawerGridFast(LayerDrawerBase):
21    "Draw a lat/lon grid using subsampling and assuming that the bounds are paralell"
22   
23    def __init__(self, cdmsVar,
24                 showGridLines=False, 
25                 cmap=None, 
26                 numIntervals=None,
27                 colourBarMin=None,
28                 colourBarMax=None, 
29                 hideOutside=False,
30                 transparent=False,
31                 colourBarScale='linear',
32                 colourBarStyle=COLOUR_BAR_STYLES.CONTINUOUS,
33                 intervals=None, 
34                 bgcolour='white'):
35       
36        self._gridDrawer = GridDrawer()
37        self._csBuilder = ColourSchemeBuilder()
38        self.numIntervals = numIntervals
39        self.hideOutside = hideOutside
40       
41        log.debug("self._csBuilder.hideOutsideBounds = %s" % (self._csBuilder.hideOutsideBounds,))
42       
43        self.colourBarStyle = colourBarStyle
44        self.cdmsVar = cdmsVar
45        self.showGridLines = showGridLines
46        self._bgcolour = 'white'
47       
48        self.transparent = transparent
49        self.cmap = cmap
50        self.bgcolour = bgcolour
51       
52        self.colourBarScale = colourBarScale
53        self.colourBarMin = colourBarMin
54        self.colourBarMax = colourBarMax
55        self.intervals = intervals
56
57    def makeImage(self, xLimits=None, yLimits=None, width=800, height=600, dpi=200):
58        """
59        Creates a PIL image of the selected area of the layer.
60        """
61        st = time.time()
62
63        fig = self._getFigure(width, height, dpi)
64        figTime = time.time() 
65
66        axes = self._addAxes(fig)
67        axTime = time.time() 
68
69        grid = self._buildGrid(self.cdmsVar, width, height, xLimits, yLimits)
70        gridTime = time.time() 
71       
72        self._drawToAxes(axes, grid, xLimits, yLimits)
73        drawAxTime = time.time() 
74       
75        self._resetAxes(axes, xLimits, yLimits)
76        resetTime = time.time() 
77       
78        im = geoplot_utils.figureToImage(fig)
79        figToImTime = time.time() 
80       
81        log.debug("drawn layer in %.4fs : fig=%.2f ax=%.2f gd=%.2f draw=%.2f res=%.2f im=%.2f" % 
82                  (time.time() -st , figTime - st, axTime - figTime, gridTime - axTime, drawAxTime - gridTime, resetTime - drawAxTime, figToImTime - resetTime))
83       
84        return im
85
86    def _buildGrid(self, cdmsVar, width, height, xLimits, yLimits):
87        """
88        Builds a new grid object using the data found in the cdmsVar.
89        """
90       
91        gridBuilder = GridBuilderLatLonSubset(self.cdmsVar)
92       
93        grid = gridBuilder.buildGrid(width, height, xLimits, yLimits)
94               
95        return grid
96       
97    def _drawToAxes(self, axes, grid, xLimits, yLimits):
98        """
99        Creates a new grid object and draws it onto the axis.
100        """
101       
102           
103       
104        scheme = self._csBuilder.buildScheme(self.colourBarStyle, grid=grid)
105        cmap = scheme.colourMap
106       
107        grid = self._applyMask(grid, scheme, self.hideOutside)
108       
109        if self.transparent:
110            #set the bad colour to transparent
111            cmap.set_bad('w', 0.0)
112       
113        #draw the grid on the axis
114        self._gridDrawer.draw(axes, grid,
115                              basemap=None, 
116                              limits=(xLimits, yLimits),
117                              norm=scheme.norm,
118                              cmap=cmap,
119                              assumeBoundsParallel=True)
120   
121
122               
123   
124    ### properties ###
125                           
126    def __set_showGridLines(self, value):
127        self._gridDrawer.showGridLines = value
128   
129    def __get_showGridLines(self):
130        return self._gridDrawer.showGridLines
131   
132    showGridLines = property(__get_showGridLines, __set_showGridLines) 
133   
134    def __set_outline(self, value):
135        self._gridDrawer.outline = value
136       
137    def __get_outline(self):
138        return self._gridDrawer.outline
139   
140    outline = property(__get_outline, __set_outline)
141   
142    def __set_gridType(self, value):
143        if value != 'latlon':
144           
145            raise Exception(\
146             "For LayerDrawerGridFast the grid type must be latlon, not %s" 
147                % (value, ))
148           
149
150    def __get_gridType(self):
151        return 'latlon'
152   
153    gridType = property(__get_gridType, __set_gridType, None, None)
154       
155    def __set_projection(self, value):
156        if value != 'latlon':
157           
158            raise Exception(\
159             "For LayerDrawerGridFast the projection must be latlon, not %s" 
160                % (value, ))
161                   
162
163    def __get_projection(self):
164        return 'latlon'
165   
166    projection = property(__get_projection, __set_projection, None, None)
167   
168    def __set_numIntervals(self, value):
169
170        self._csBuilder.numIntervals = value
171
172    def __get_numIntervals(self):
173        return self._csBuilder.numIntervals
174       
175    numIntervals = property(__get_numIntervals, __set_numIntervals, None, None)
176   
177    def __set_hideOutside(self, value):
178        self._hideOutsideBounds = value
179
180    def __get_hideOutside(self):
181        return self._hideOutsideBounds
182       
183    hideOutside = property(__get_hideOutside, __set_hideOutside, None, None)
Note: See TracBrowser for help on using the repository browser.