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

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

Fixed a couple of bugs.

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