Coverage for gws-app/gws/gis/ms/util.py: 17%
35 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 22:59 +0200
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 22:59 +0200
1"""MapServer utility functions."""
5import gws
6import gws.base.layer
7import gws.lib.bounds
8import gws.gis.ms
10# @TODO check memory usage
11MAX_BOX_SIZE = 9000
14def raster_render(layer: gws.Layer, lri: gws.LayerRenderInput) -> gws.LayerRenderOutput:
15 ts = gws.u.mstime()
17 if lri.type == gws.LayerRenderInputType.box:
19 def get_box(bounds, width, height):
20 ms_map = gws.gis.ms.new_map()
21 ms_map.add_layer(layer.msOptions)
22 img = ms_map.draw(bounds, (width, height))
23 if layer.root.app.developer_option('mapserver.save_temp_maps'):
24 gws.u.write_debug_file(f'ms_{layer.uid}_{gws.u.microtime()}.map', ms_map.to_string())
25 return img.to_bytes()
27 content = gws.base.layer.util.generic_render_box(layer, lri, get_box, box_size=MAX_BOX_SIZE)
28 return gws.LayerRenderOutput(content=content)
30 if lri.type == gws.LayerRenderInputType.xyz:
31 ms_map = gws.gis.ms.new_map()
32 ms_map.add_layer(layer.msOptions)
34 ext = layer.bounds.extent
35 w = (ext[2] - ext[0]) / (1 << lri.z)
37 x0 = ext[0] + lri.x * w
38 x1 = x0 + w
40 y0 = ext[3] - (lri.y + 1) * w
41 y1 = y0 + w
43 img = ms_map.draw(
44 gws.lib.bounds.from_extent((x0, y0, x1, y1), crs=layer.bounds.crs),
45 (layer.grid.tileSize, layer.grid.tileSize),
46 )
47 if layer.root.app.developer_option('mapserver.save_temp_maps'):
48 gws.u.write_debug_file(f'ms_{layer.uid}_{gws.u.microtime()}.map', ms_map.to_string())
50 if layer.root.app.developer_option('map.annotate_render'):
51 ts = gws.u.mstime() - ts
52 text = f'{lri.z} : {lri.x} / {lri.y}\nUID={layer.uid}\n{ts}ms'
53 img.add_text(text, x=5, y=5).add_box()
55 content = img.to_bytes(layer.imageFormat.mimeTypes[0], layer.imageFormat.options)
57 return gws.LayerRenderOutput(content=content)