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 23:09 +0200

1"""MapServer utility functions.""" 

2 

3 

4 

5import gws 

6import gws.base.layer 

7import gws.lib.bounds 

8import gws.gis.ms 

9 

10# @TODO check memory usage 

11MAX_BOX_SIZE = 9000 

12 

13 

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

15 ts = gws.u.mstime() 

16 

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

18 

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

26 

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

28 return gws.LayerRenderOutput(content=content) 

29 

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

31 ms_map = gws.gis.ms.new_map() 

32 ms_map.add_layer(layer.msOptions) 

33 

34 ext = layer.bounds.extent 

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

36 

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

38 x1 = x0 + w 

39 

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

41 y1 = y0 + w 

42 

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

49 

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

54 

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

56 

57 return gws.LayerRenderOutput(content=content)