30 |
|
|
31 |
import Thuban.Model.resource |
import Thuban.Model.resource |
32 |
|
|
|
if Thuban.Model.resource.has_gdal_support(): |
|
|
from gdalwarp import ProjectRasterFile |
|
33 |
|
|
34 |
|
|
35 |
# |
# |
190 |
if isinstance(layer, Layer): |
if isinstance(layer, Layer): |
191 |
for i in self.draw_shape_layer_incrementally(layer): |
for i in self.draw_shape_layer_incrementally(layer): |
192 |
yield True |
yield True |
193 |
elif isinstance(layer, RasterLayer) \ |
elif isinstance(layer, RasterLayer): |
|
and Thuban.Model.resource.has_gdal_support(): |
|
194 |
self.draw_raster_layer(layer) |
self.draw_raster_layer(layer) |
195 |
yield True |
yield True |
196 |
else: |
else: |
440 |
def draw_raster_layer(self, layer): |
def draw_raster_layer(self, layer): |
441 |
"""Draw the raster layer |
"""Draw the raster layer |
442 |
|
|
443 |
This implementation does the projection and scaling of the data |
This implementation uses self.projected_raster_layer() to project |
444 |
as required by the layer's and map's projections and the scale |
and scale the data as required by the layer's and map's projections |
445 |
and offset of the renderer and then hands the transformed data |
and the scale and offset of the renderer and then hands the transformed |
446 |
to self.draw_raster_data() which has to be implemented in |
data to self.draw_raster_data() which has to be implemented in |
447 |
derived classes. |
derived classes. |
448 |
""" |
""" |
449 |
offx, offy = self.offset |
offx, offy = self.offset |
480 |
width = int(min(width, round(fmax[0] - fmin[0] + 1))) |
width = int(min(width, round(fmax[0] - fmin[0] + 1))) |
481 |
height = int(min(height, round(fmax[1] - fmin[1] + 1))) |
height = int(min(height, round(fmax[1] - fmin[1] + 1))) |
482 |
|
|
483 |
try: |
options = 0 |
484 |
options = 0 |
options = options | layer.MaskType() |
|
options = options | layer.MaskType() |
|
485 |
|
|
486 |
project_params = (layer.GetImageFilename(), in_proj, out_proj, |
img_data = self.projected_raster_layer(layer, in_proj, out_proj, |
487 |
(xmin, ymin, xmax, ymax), "", (width, height), |
(xmin,ymin,xmax,ymax), [0,0], (width, height), options) |
488 |
options) |
|
489 |
|
if img_data is not None: |
490 |
data = (width, height, apply(ProjectRasterFile, project_params)) |
data = (width, height, img_data) |
|
|
|
|
except (MemoryError, IOError, AttributeError, ValueError): |
|
|
# Why does this catch AttributeError and ValueError? |
|
|
# FIXME: The exception should be communicated to the user |
|
|
# better. |
|
|
traceback.print_exc() |
|
|
else: |
|
491 |
self.draw_raster_data(fmin[0]+offx, offy-fmax[1], data, "RAW") |
self.draw_raster_data(fmin[0]+offx, offy-fmax[1], data, "RAW") |
492 |
data = None |
data = None |
493 |
|
|
494 |
|
def projected_raster_layer(self, layer, srcProj, dstProj, extents, |
495 |
|
resolution, dimensions, options): |
496 |
|
"""Return the projected raster image associated with the layer. |
497 |
|
|
498 |
|
The returned value will be a tuple of the form |
499 |
|
|
500 |
|
(image_data, mask_data, alpha_data) |
501 |
|
|
502 |
|
suitable for the data parameter to draw_raster_data. |
503 |
|
|
504 |
|
The return value may be None if raster projections are not supported. |
505 |
|
|
506 |
|
srcProj -- a string describing the source projection |
507 |
|
dstProj -- a string describing the destination projection |
508 |
|
extents -- a tuple of the region to project in map coordinates |
509 |
|
resolution -- (currently not used, defaults to [0,0]) |
510 |
|
dimensions -- a tuple (width, height) for the output image |
511 |
|
options -- bit-wise options to pass to the renderer |
512 |
|
|
513 |
|
the currently supported values for options are |
514 |
|
|
515 |
|
OPTS_MASK = 1 -- generate a mask |
516 |
|
OPTS_ALPHA = 2 -- generate an alpha channel |
517 |
|
OPTS_INVERT_MASK = 4 -- invert the values in the mask |
518 |
|
(if generated) |
519 |
|
|
520 |
|
This method has to be implemented by derived classes. |
521 |
|
""" |
522 |
|
|
523 |
|
raise NotImplementedError |
524 |
|
|
525 |
def draw_raster_data(self, x, y, data, format="BMP"): |
def draw_raster_data(self, x, y, data, format="BMP"): |
526 |
"""Draw the raster image in data onto the DC with the top |
"""Draw the raster image in data onto the DC with the top |
527 |
left corner at (x,y) |
left corner at (x,y) |