25 |
|
|
26 |
import resource |
import resource |
27 |
|
|
28 |
|
from color import Color |
29 |
|
|
30 |
shapetype_names = {SHAPETYPE_POINT: "Point", |
shapetype_names = {SHAPETYPE_POINT: "Point", |
31 |
SHAPETYPE_ARC: "Arc", |
SHAPETYPE_ARC: "Arc", |
72 |
self.projection = projection |
self.projection = projection |
73 |
self.changed(LAYER_PROJECTION_CHANGED, self) |
self.changed(LAYER_PROJECTION_CHANGED, self) |
74 |
|
|
75 |
|
def Type(self): |
76 |
|
return "Unknown" |
77 |
|
|
78 |
class Layer(BaseLayer): |
class Layer(BaseLayer): |
79 |
|
|
80 |
"""Represent the information of one geodata file (currently a shapefile) |
"""Represent the information of one geodata file (currently a shapefile) |
175 |
bbox = self.projection.InverseBBox(bbox) |
bbox = self.projection.InverseBBox(bbox) |
176 |
return bbox |
return bbox |
177 |
|
|
178 |
|
def Type(self): |
179 |
|
return self.ShapeType(); |
180 |
|
|
181 |
def ShapesBoundingBox(self, shapes): |
def ShapesBoundingBox(self, shapes): |
182 |
"""Return a bounding box in lat/long coordinates for the given |
"""Return a bounding box in lat/long coordinates for the given |
183 |
list of shape ids. |
list of shape ids. |
344 |
|
|
345 |
class RasterLayer(BaseLayer): |
class RasterLayer(BaseLayer): |
346 |
|
|
347 |
|
MASK_NONE = 0 |
348 |
|
MASK_BIT = 1 |
349 |
|
MASK_ALPHA = 2 |
350 |
|
|
351 |
def __init__(self, title, filename, projection = None, visible = True): |
def __init__(self, title, filename, projection = None, visible = True): |
352 |
"""Initialize the Raster Layer. |
"""Initialize the Raster Layer. |
353 |
|
|
371 |
|
|
372 |
self.bbox = -1 |
self.bbox = -1 |
373 |
|
|
374 |
|
self.mask_type = self.MASK_BIT |
375 |
|
self.alpha_opacity = 1 |
376 |
|
|
377 |
|
self.image_info = None |
378 |
|
|
379 |
if resource.has_gdal_support(): |
if resource.has_gdal_support(): |
380 |
# |
# |
381 |
# temporarily open the file so that GDAL can test if it's valid. |
# temporarily open the file so that GDAL can test if it's valid. |
385 |
if dataset is None: |
if dataset is None: |
386 |
raise IOError() |
raise IOError() |
387 |
|
|
388 |
|
# |
389 |
|
# while we have the file, extract some basic information |
390 |
|
# that we can display later |
391 |
|
# |
392 |
|
self.image_info = {} |
393 |
|
|
394 |
|
self.image_info["nBands"] = dataset.RasterCount |
395 |
|
self.image_info["Size"] = (dataset.RasterXSize, dataset.RasterYSize) |
396 |
|
self.image_info["Driver"] = dataset.GetDriver().ShortName |
397 |
|
|
398 |
|
# store some information about the individual bands |
399 |
|
# [min_value, max_value] |
400 |
|
a = self.image_info["BandData"] = [] |
401 |
|
|
402 |
|
for i in range(1, dataset.RasterCount+1): |
403 |
|
band = dataset.GetRasterBand(i) |
404 |
|
a.append(band.ComputeRasterMinMax()) |
405 |
|
|
406 |
self.UnsetModified() |
self.UnsetModified() |
407 |
|
|
408 |
def BoundingBox(self): |
def BoundingBox(self): |
457 |
|
|
458 |
return bbox |
return bbox |
459 |
|
|
460 |
|
def Type(self): |
461 |
|
return "Image" |
462 |
|
|
463 |
def GetImageFilename(self): |
def GetImageFilename(self): |
464 |
return self.filename |
return self.filename |
465 |
|
|
466 |
|
def MaskType(self): |
467 |
|
"""Return True if the mask should be used when rendering the layer.""" |
468 |
|
return self.mask_type |
469 |
|
|
470 |
|
def SetMaskType(self, type): |
471 |
|
"""Set the type of mask to use. |
472 |
|
|
473 |
|
type can be one of MASK_NONE, MASK_BIT, MASK_ALPHA |
474 |
|
|
475 |
|
If the state changes, a LAYER_CHANGED message is sent. |
476 |
|
""" |
477 |
|
if type not in (self.MASK_NONE, self.MASK_BIT, self.MASK_ALPHA): |
478 |
|
raise ValueError("type is invalid") |
479 |
|
|
480 |
|
if type != self.mask_type: |
481 |
|
self.mask_type = type |
482 |
|
self.changed(LAYER_CHANGED, self) |
483 |
|
|
484 |
|
def AlphaOpacity(self): |
485 |
|
"""Return the level of opacity used in alpha blending, or None |
486 |
|
if mask type is not MASK_ALPHA. |
487 |
|
""" |
488 |
|
if self.mask_type == self.MASK_ALPHA: |
489 |
|
return self.alpha_opacity |
490 |
|
else: |
491 |
|
return None |
492 |
|
|
493 |
|
def SetAlphaOpacity(self, op): |
494 |
|
"""Set the level of alpha opacity. |
495 |
|
|
496 |
|
0 <= op <= 1. |
497 |
|
|
498 |
|
The layer is fully opaque when op = 1. |
499 |
|
""" |
500 |
|
if not (0 <= op <= 1): |
501 |
|
raise ValueError("op out of range") |
502 |
|
|
503 |
|
self.alpha_opacity = op |
504 |
|
|
505 |
|
def ImageInfo(self): |
506 |
|
return self.image_info |
507 |
|
|
508 |
def TreeInfo(self): |
def TreeInfo(self): |
509 |
items = [] |
items = [] |
510 |
|
|