Coverage for gws-app/gws/lib/mapserver/util.py: 17%
36 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 12:46 +0200
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 12:46 +0200
1"""MapServer utility functions."""
5import gws
6import gws.base.layer
7import gws.lib.bounds
9from . import core
11# @TODO check memory usage
12MAX_BOX_SIZE = 9000
15def raster_render(layer: gws.Layer, lri: gws.LayerRenderInput) -> gws.LayerRenderOutput:
16 ts = gws.u.mstime()
18 if lri.type == gws.LayerRenderInputType.box:
20 def get_box(bounds, width, height):
21 ms_map = core.new_map()
22 ms_map.add_layer(layer.msOptions)
23 img = ms_map.draw(bounds, (width, height))
24 if layer.root.app.developer_option('mapserver.save_temp_maps'):
25 gws.u.write_debug_file(f'ms_{layer.uid}_{gws.u.microtime()}.map', ms_map.to_string())
26 return img.to_bytes()
28 content = gws.base.layer.util.generic_render_box(layer, lri, get_box, box_size=MAX_BOX_SIZE)
29 return gws.LayerRenderOutput(content=content)
31 if lri.type == gws.LayerRenderInputType.xyz:
32 ms_map = core.new_map()
33 ms_map.add_layer(layer.msOptions)
35 ext = layer.bounds.extent
36 w = (ext[2] - ext[0]) / (1 << lri.z)
38 x0 = ext[0] + lri.x * w
39 x1 = x0 + w
41 y0 = ext[3] - (lri.y + 1) * w
42 y1 = y0 + w
44 img = ms_map.draw(
45 gws.lib.bounds.from_extent((x0, y0, x1, y1), crs=layer.bounds.crs),
46 (layer.grid.tileSize, layer.grid.tileSize),
47 )
48 if layer.root.app.developer_option('mapserver.save_temp_maps'):
49 gws.u.write_debug_file(f'ms_{layer.uid}_{gws.u.microtime()}.map', ms_map.to_string())
51 if layer.root.app.developer_option('map.annotate_render'):
52 ts = gws.u.mstime() - ts
53 text = f'{lri.z} : {lri.x} / {lri.y}\nUID={layer.uid}\n{ts}ms'
54 img.add_text(text, x=5, y=5).add_box()
56 content = img.to_bytes(layer.imageFormat.mimeTypes[0], layer.imageFormat.options)
58 return gws.LayerRenderOutput(content=content)
60 raise gws.Error(f'unsupported render input type: {lri.type}')