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
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1"""QGIS legend."""
3from typing import Optional
5import gws
6import gws.base.legend
7import gws.config.util
8import gws.lib.mime
9import gws.gis.source
10import gws.lib.image
13from . import provider
15gws.ext.new.legend('qgis')
17# see https://docs.qgis.org/3.22/de/docs/server_manual/services/wms.html#getlegendgraphics
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}
42class Config(gws.base.legend.Config):
43 """Qgis legend"""
45 provider: Optional[provider.Config]
46 """qgis provider"""
47 sourceLayers: Optional[gws.gis.source.LayerFilter]
48 """source layers to use"""
51class Object(gws.base.legend.Object):
52 serviceProvider: provider.Object
53 sourceLayers: list[gws.SourceLayer]
54 params: dict
56 def configure(self):
57 self.configure_provider()
58 self.configure_sources()
59 self.configure_params()
61 def configure_provider(self):
62 return gws.config.util.configure_service_provider_for(self, provider.Object)
64 def configure_sources(self):
65 self.configure_source_layers()
67 def configure_source_layers(self):
68 return gws.config.util.configure_source_layers_for(self, self.serviceProvider.sourceLayers)
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))
85 ##
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)