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

1"""MapServer utility functions.""" 

2 

3 

4 

5import gws 

6import gws.base.layer 

7import gws.lib.bounds 

8 

9from . import core 

10 

11# @TODO check memory usage 

12MAX_BOX_SIZE = 9000 

13 

14 

15def raster_render(layer: gws.Layer, lri: gws.LayerRenderInput) -> gws.LayerRenderOutput: 

16 ts = gws.u.mstime() 

17 

18 if lri.type == gws.LayerRenderInputType.box: 

19 

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() 

27 

28 content = gws.base.layer.util.generic_render_box(layer, lri, get_box, box_size=MAX_BOX_SIZE) 

29 return gws.LayerRenderOutput(content=content) 

30 

31 if lri.type == gws.LayerRenderInputType.xyz: 

32 ms_map = core.new_map() 

33 ms_map.add_layer(layer.msOptions) 

34 

35 ext = layer.bounds.extent 

36 w = (ext[2] - ext[0]) / (1 << lri.z) 

37 

38 x0 = ext[0] + lri.x * w 

39 x1 = x0 + w 

40 

41 y0 = ext[3] - (lri.y + 1) * w 

42 y1 = y0 + w 

43 

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()) 

50 

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() 

55 

56 content = img.to_bytes(layer.imageFormat.mimeTypes[0], layer.imageFormat.options) 

57 

58 return gws.LayerRenderOutput(content=content) 

59 

60 raise gws.Error(f'unsupported render input type: {lri.type}')