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

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

Added the ability to set the scale on the colour scheme to a log scale.

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
14log = logging.getLogger(__name__)
15
16class LayerDrawerGridFast(LayerDrawerBase):
17    "Draw a lat/lon grid using subsampling and assuming that the bounds are paralell"
18   
19    def __init__(self, cdmsVar,
20                 showGridLines=False, 
21                 cmap=None, 
22                 colourBarMin=None,
23                 colourBarMax=None, 
24                 transparent=False,
25                 colourBarScale='linear',
26                 intervals=None, 
27                 bgcolour='white'):
28       
29        self._gridDrawer = GridDrawer()
30        self._csBuilder = ColourSchemeBuilder()
31       
32        self.cdmsVar = cdmsVar
33        self.showGridLines = showGridLines
34        self._bgcolour = 'white'
35       
36        self.transparent = transparent
37        self.cmap = cmap
38        self.bgcolour = bgcolour
39       
40        self.colourBarScale = colourBarScale
41        self.colourBarMin = colourBarMin
42        self.colourBarMax = colourBarMax
43        self.intervals = intervals
44
45    def makeImage(self, xLimits=None, yLimits=None, width=800, height=600, dpi=200):
46        """
47        Creates a PIL image of the selected area of the layer.
48        """
49        st = time.time()
50
51        fig = self._getFigure(width, height, dpi)
52        figTime = time.time() 
53
54        axes = self._addAxes(fig)
55        axTime = time.time() 
56
57        grid = self._buildGrid(self.cdmsVar, width, height, xLimits, yLimits)
58        gridTime = time.time() 
59       
60        self._drawToAxes(axes, grid, xLimits, yLimits)
61        drawAxTime = time.time() 
62       
63        self._resetAxes(axes, xLimits, yLimits)
64        resetTime = time.time() 
65       
66        im = geoplot_utils.figureToImage(fig)
67        figToImTime = time.time() 
68       
69        log.debug("drawn layer in %.4fs : fig=%.2f ax=%.2f gd=%.2f draw=%.2f res=%.2f im=%.2f" % 
70                  (time.time() -st , figTime - st, axTime - figTime, gridTime - axTime, drawAxTime - gridTime, resetTime - drawAxTime, figToImTime - resetTime))
71       
72        return im
73
74    def _buildGrid(self, cdmsVar, width, height, xLimits, yLimits):
75        """
76        Builds a new grid object using the data found in the cdmsVar.
77        """
78       
79        gridBuilder = GridBuilderLatLonSubset(self.cdmsVar)
80       
81        grid = gridBuilder.buildGrid(width, height, xLimits, yLimits)
82               
83        return grid
84       
85    def _drawToAxes(self, axes, grid, xLimits, yLimits):
86        """
87        Creates a new grid object and draws it onto the axis.
88        """
89               
90        scheme = self._csBuilder.buildScheme(grid)
91        cmap = scheme.colourMap
92       
93        if self.transparent:
94            #set the bad colour to transparent
95            cmap.set_bad('w', 0.0)
96       
97        #draw the grid on the axis
98        self._gridDrawer.draw(axes, grid,
99                              basemap=None, 
100                              limits=(xLimits, yLimits),
101                              norm=scheme.norm,
102                              cmap=cmap,
103                              assumeBoundsParallel=True)
104       
105    ### properties ###
106                           
107    def __set_showGridLines(self, value):
108        self._gridDrawer.showGridLines = value
109   
110    def __get_showGridLines(self):
111        return self._gridDrawer.showGridLines
112   
113    showGridLines = property(__get_showGridLines, __set_showGridLines) 
114   
115    def __set_outline(self, value):
116        self._gridDrawer.outline = value
117       
118    def __get_outline(self):
119        return self._gridDrawer.outline
120   
121    outline = property(__get_outline, __set_outline)
122   
123    def __set_gridType(self, value):
124        if value != 'latlon':
125           
126            raise Exception(\
127             "For LayerDrawerGridFast the grid type must be latlon, not %s" 
128                % (value, ))
129           
130
131    def __get_gridType(self):
132        return 'latlon'
133   
134    gridType = property(__get_gridType, __set_gridType, None, None)
135       
136    def __set_projection(self, value):
137        if value != 'latlon':
138           
139            raise Exception(\
140             "For LayerDrawerGridFast the projection must be latlon, not %s" 
141                % (value, ))
142                   
143
144    def __get_projection(self):
145        return 'latlon'
146   
147    projection = property(__get_projection, __set_projection, None, None)
Note: See TracBrowser for help on using the repository browser.