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 |
project_params = (layer.GetImageFilename(), in_proj, out_proj, |
options = options | layer.MaskType() |
485 |
(xmin, ymin, xmax, ymax), "", (width, height), |
|
486 |
layer.UseMask()) |
img_data = self.projected_raster_layer(layer, in_proj, out_proj, |
487 |
|
(xmin,ymin,xmax,ymax), [0,0], (width, height), options) |
488 |
data = (width, height, apply(ProjectRasterFile, project_params)) |
|
489 |
|
if img_data is not None: |
490 |
except (IOError, AttributeError, ValueError): |
data = (width, height, img_data) |
|
# 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) |
528 |
|
|
529 |
The raster image data is a tuple of the form |
The raster image data is a tuple of the form |
530 |
(width, height, (image_data, mask_data)) |
(width, height, (image_data, mask_data, alpha_data)) |
531 |
|
|
532 |
holding the image width, height, image data, and mask data. |
holding the image width, height, image data, mask data, and alpha data. |
533 |
mask_data may be None if a mask should not be used. Both kinds |
mask_data may be None if a mask should not be used. alpha_data may |
534 |
|
also be None. If both are not None mask overrides alpha. If |
535 |
|
format is 'RAW' the data will be RGB values and the mask |
536 |
|
will be in XMB format. Otherwise, both kinds |
537 |
of data are assumed to be in the format specified in format. |
of data are assumed to be in the format specified in format. |
538 |
|
|
539 |
The format parameter is a string with the name of the format. |
The format parameter is a string with the name of the format. |