Coverage for gws-app/gws/plugin/qgis/legend.py: 0%

37 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-17 01:37 +0200

1"""QGIS legend.""" 

2 

3from typing import Optional 

4 

5import gws 

6import gws.base.legend 

7import gws.config.util 

8import gws.lib.mime 

9import gws.gis.source 

10import gws.lib.image 

11 

12 

13from . import provider 

14 

15gws.ext.new.legend('qgis') 

16 

17# see https://docs.qgis.org/3.22/de/docs/server_manual/services/wms.html#getlegendgraphics 

18 

19_DEFAULT_LEGEND_PARAMS = { 

20 'BOXSPACE': 2, 

21 'ICONLABELSPACE': 2, 

22 'ITEMFONTBOLD': False, 

23 'ITEMFONTCOLOR': '#000000', 

24 'ITEMFONTFAMILY': 'DejaVuSans', 

25 'ITEMFONTITALIC': False, 

26 'ITEMFONTSIZE': 9, 

27 'LAYERFONTBOLD': True, 

28 'LAYERFONTCOLOR': '#000000', 

29 'LAYERFONTFAMILY': 'DejaVuSans', 

30 'LAYERFONTITALIC': False, 

31 'LAYERFONTSIZE': 9, 

32 'LAYERSPACE': 4, 

33 'LAYERTITLE': True, 

34 'LAYERTITLESPACE': 4, 

35 'RULELABEL': True, 

36 'SYMBOLHEIGHT': 8, 

37 'SYMBOLSPACE': 2, 

38 'SYMBOLWIDTH': 8, 

39} 

40 

41 

42class Config(gws.base.legend.Config): 

43 """Qgis legend""" 

44 

45 provider: Optional[provider.Config] 

46 """qgis provider""" 

47 sourceLayers: Optional[gws.gis.source.LayerFilter] 

48 """source layers to use""" 

49 

50 

51class Object(gws.base.legend.Object): 

52 serviceProvider: provider.Object 

53 sourceLayers: list[gws.SourceLayer] 

54 params: dict 

55 

56 def configure(self): 

57 self.configure_provider() 

58 self.configure_sources() 

59 self.configure_params() 

60 

61 def configure_provider(self): 

62 return gws.config.util.configure_service_provider_for(self, provider.Object) 

63 

64 def configure_sources(self): 

65 self.configure_source_layers() 

66 

67 def configure_source_layers(self): 

68 return gws.config.util.configure_source_layers_for(self, self.serviceProvider.sourceLayers) 

69 

70 def configure_params(self): 

71 defaults = dict( 

72 DPI=96, 

73 FORMAT=gws.lib.mime.PNG, 

74 # qgis legends are rendered bottom-up (rightmost first) 

75 # we need the straight order (leftmost first), like in the config 

76 LAYER=','.join(sl.name for sl in reversed(self.sourceLayers)), 

77 REQUEST=gws.OwsVerb.GetLegendGraphic, 

78 STYLE='', 

79 TRANSPARENT=True, 

80 ) 

81 opts = gws.u.to_upper_dict(self.cfg('options', default={})) 

82 self.params = self.serviceProvider.server_params( 

83 gws.u.merge(_DEFAULT_LEGEND_PARAMS, defaults, opts)) 

84 

85 ## 

86 

87 def render(self, args=None): 

88 res = self.serviceProvider.call_server(self.params, max_age=self.cacheMaxAge) 

89 img = gws.lib.image.from_bytes(res.content) 

90 return gws.LegendRenderOutput(image=img, size=img.size(), mime=gws.lib.mime.PNG)