1 |
# Copyright (C) 2003 by Intevation GmbH |
# Copyright (C) 2003, 2005 by Intevation GmbH |
2 |
# Authors: |
# Authors: |
3 |
# Bernhard Herzog <[email protected]> |
# Bernhard Herzog <[email protected]> |
4 |
# |
# |
32 |
from Thuban.UI.baserenderer import BaseRenderer, \ |
from Thuban.UI.baserenderer import BaseRenderer, \ |
33 |
add_renderer_extension, init_renderer_extensions |
add_renderer_extension, init_renderer_extensions |
34 |
|
|
35 |
|
if Thuban.Model.resource.has_gdal_support(): |
36 |
|
from gdalwarp import ProjectRasterFile |
37 |
|
|
38 |
class MockDC: |
class MockDC: |
39 |
|
|
91 |
def label_font(self): |
def label_font(self): |
92 |
return "label font" |
return "label font" |
93 |
|
|
94 |
def draw_raster_data(self, x, y, data, format='BMP', mask = None): |
def draw_raster_data(self, x, y, data, format='BMP', opacity=1.0): |
95 |
self.raster_data = data |
self.raster_data = data |
96 |
self.raster_format = format |
self.raster_format = format |
97 |
|
|
98 |
|
def projected_raster_layer(self, layer, srcProj, dstProj, extents, |
99 |
|
resolution, dimensions, options): |
100 |
|
|
101 |
|
if not Thuban.Model.resource.has_gdal_support(): |
102 |
|
raise support.SkipTest("No gdal support") |
103 |
|
|
104 |
|
#print srcProj, dstProj,extents, resolution, dimensions, options |
105 |
|
|
106 |
|
return ProjectRasterFile(layer.GetImageFilename(), |
107 |
|
srcProj, dstProj, |
108 |
|
extents, resolution, dimensions, |
109 |
|
options) |
110 |
|
|
111 |
class MockProjection: |
class MockProjection: |
112 |
|
|
113 |
"""Objects that look like projections but simply apply non-uniform scalings |
"""Objects that look like projections but simply apply non-uniform scalings |
129 |
def setUp(self): |
def setUp(self): |
130 |
"""Set self.to_destroy to an empty list |
"""Set self.to_destroy to an empty list |
131 |
|
|
132 |
Test should put all objects whose Destroy should be called atunittest.main |
Tests should put all objects whose Destroy should be called at |
133 |
the end into this list so that they're destroyed in tearDown |
the end into this list so that they're destroyed in tearDown. |
134 |
""" |
""" |
135 |
self.to_destroy = [] |
self.to_destroy = [] |
136 |
|
|
276 |
('SetFont', "label font"), |
('SetFont', "label font"), |
277 |
('EndDrawing',)]) |
('EndDrawing',)]) |
278 |
|
|
279 |
|
def test_projected_raster_layer(self): |
280 |
|
if not Thuban.Model.resource.has_gdal_support(): |
281 |
|
raise support.SkipTest("No gdal support") |
282 |
|
|
283 |
|
layer = RasterLayer("raster layer", |
284 |
|
os.path.join("..", "Data", "iceland", |
285 |
|
"island.tif")) |
286 |
|
|
287 |
|
dc = MockDC(size = (20, 20)) |
288 |
|
renderer = SimpleRenderer(dc, map, 34, (800, 2250)) |
289 |
|
|
290 |
|
# The reference data as a base64 coded RAW image |
291 |
|
raw_data = binascii.a2b_base64( |
292 |
|
'UmbmUmbmUmbmUmbmUmbmAtYCJooCAtICAq4CJooCArICAuICArICAuYCAs4COn4CO' |
293 |
|
'n4CAq4CAuICFpICUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAuYCAqICAqoCAqoCFp' |
294 |
|
'ICJooCIo4CCpoCQnoGOn4CDpYCOn4CUmbmUmbmNo6aEpYCLoYCAqICGpICFpICUmb' |
295 |
|
'mAt4CUmbmNo6aAtICArYCAqoCKoYCMoICTnYKOn4CFpICUmbmUmbmUmbmUmbmAp4C' |
296 |
|
'NoICArYCAr4CCpoCAqYCCpoCEpYCHo4CFpICHo4CGpICFpICKoYCTnYKMoICAp4CU' |
297 |
|
'mbmUmbmUmbmUmbmUmbmUmbmAtYCAroCArYCCpoCAtYCAroCAtICAsYCUmbmAt4CAq' |
298 |
|
'YCAroCMoICAs4CAs4CAtYCAt4CAqYCUmbmUmbmUmbmUmbmAtoCAtYCAq4CAtoCBp4' |
299 |
|
'CAroCAqoCAq4CAr4CDpYCGpICAt4CAsICDpYCArICCpoCHo4CAs4CAuICUmbmUmbm' |
300 |
|
'UmbmUmbmUmbmUmbmAuICAqICFpYCAq4CDpoCAqYCFpICAqYCUmbmNo6aAsYCCpoCD' |
301 |
|
'pYCAqICAtoCUmbmAt4CAqoCCpoCAroCHo4CAsYCAq4CAsICAs4CAp4CUmbmAtYCAq' |
302 |
|
'YCIooCHo4CAsICAr4CAqICEpYCAs4CAqICArICDpYCEpYCEpYCAr4CUmbmEpYCAs4' |
303 |
|
'CAtICAs4CAqYCUmbmAtoCAp4CCpoCDpYCAq4CArICAqoCAqYCAqYCAtYCAtoCDpYC' |
304 |
|
'At4CUmbmUmbmUmbmUmbmAt4CAsoCAsoCAp4CAp4CCpoCAsoCAt4CNo6aUmbmUmbmU' |
305 |
|
'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAt4CAtYCCpoCAqICAroCAr4CUmbmUm' |
306 |
|
'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb' |
307 |
|
'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm' |
308 |
|
'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU' |
309 |
|
'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm' |
310 |
|
'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb' |
311 |
|
'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm' |
312 |
|
'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU' |
313 |
|
'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm' |
314 |
|
'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb' |
315 |
|
'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm' |
316 |
|
'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm\n') |
317 |
|
|
318 |
|
raw_mask = binascii.a2b_base64( |
319 |
|
'//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P/' |
320 |
|
'/8P//8P//8P//8P//8P\n') |
321 |
|
|
322 |
|
raw_mask_inverted = binascii.a2b_base64( |
323 |
|
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' |
324 |
|
'AAAAAAAAAAAAAAAAAAA\n') |
325 |
|
|
326 |
|
raw_alpha = binascii.a2b_base64( |
327 |
|
'/////////////////////////////////////////////////////////////' |
328 |
|
'/////////////////////////////////////////////////////////////' |
329 |
|
'/////////////////////////////////////////////////////////////' |
330 |
|
'/////////////////////////////////////////////////////////////' |
331 |
|
'/////////////////////////////////////////////////////////////' |
332 |
|
'/////////////////////////////////////////////////////////////' |
333 |
|
'/////////////////////////////////////////////////////////////' |
334 |
|
'/////////////////////////////////////////////////////////////' |
335 |
|
'/////////////////////////////////////////////w==\n') |
336 |
|
|
337 |
|
for opts, data in [[1, (raw_data, raw_mask, None)], |
338 |
|
[1|4, (raw_data, raw_mask_inverted, None)], |
339 |
|
[2, (raw_data, None, raw_alpha)]]: |
340 |
|
|
341 |
|
img_data = renderer.projected_raster_layer(layer, "", "", |
342 |
|
(-24, 65, -23, 66), [0, 0], (20, 20), opts) |
343 |
|
self.assertEquals(img_data, data) |
344 |
|
|
345 |
def test_raster_no_projection(self): |
def test_raster_no_projection(self): |
346 |
"""Test BaseRenderer with raster layer and no projections |
"""Test BaseRenderer with raster layer and no projections |
347 |
|
|
357 |
layer = RasterLayer("raster layer", |
layer = RasterLayer("raster layer", |
358 |
os.path.join("..", "Data", "iceland", |
os.path.join("..", "Data", "iceland", |
359 |
"island.tif")) |
"island.tif")) |
360 |
|
layer.SetMaskType(layer.MASK_NONE) |
361 |
|
|
362 |
map.AddLayer(layer) |
map.AddLayer(layer) |
363 |
self.to_destroy.append(map) |
self.to_destroy.append(map) |
364 |
|
|
369 |
|
|
370 |
# The following commented out code block can be used to generate |
# The following commented out code block can be used to generate |
371 |
# the base64 coded reference image data |
# the base64 coded reference image data |
372 |
#hexed = binascii.b2a_base64(renderer.raster_data[2]) |
#hexed = binascii.b2a_base64(renderer.raster_data[2][0]) |
373 |
#while hexed: |
#while hexed: |
374 |
#print repr(hexed[:65]) |
#print repr(hexed[:65]) |
375 |
#hexed = hexed[65:] |
#hexed = hexed[65:] |
376 |
|
|
377 |
# The reference data as a base64 coded BMP image |
# The reference data as a base64 coded RAW image |
378 |
raw_data = binascii.a2b_base64( |
raw_data = binascii.a2b_base64( |
379 |
'UmbmUmbmUmbmUmbmUmbmAtYCJooCAtICAq4CJooCArICAuICArICAuYCAs4COn4CO' |
'UmbmUmbmUmbmUmbmUmbmAtYCJooCAtICAq4CJooCArICAuICArICAuYCAs4COn4CO' |
380 |
'n4CAq4CAuICFpICUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAuYCAqICAqoCAqoCFp' |
'n4CAq4CAuICFpICUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAuYCAqICAqoCAqoCFp' |
401 |
'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb' |
'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb' |
402 |
'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm' |
'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm' |
403 |
'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm\n') |
'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm\n') |
404 |
self.assertEquals(renderer.raster_data, [20,20,raw_data]) |
|
405 |
|
self.assertEquals(renderer.raster_data, |
406 |
|
(20,20,(raw_data, None, None))) |
407 |
|
|
408 |
self.assertEquals(renderer.raster_format, "RAW") |
self.assertEquals(renderer.raster_format, "RAW") |
409 |
|
|
410 |
self.assertEquals(dc.calls, |
self.assertEquals(dc.calls, |