Coverage for gws-app/gws/plugin/qgis/grabber.py: 100%

20 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-10-23 20:06 +0200

1"""Raster grabber for QGIS Server.""" 

2 

3import gws 

4import gws.base.grabber.box 

5import gws.lib.image 

6 

7from . import provider 

8 

9_GET_MAP_MIME_TYPES = [ 

10 'image/png', 

11 'image/png; mode=8bit', 

12 'image/png; mode=16bit', 

13 'image/png; mode=1bit', 

14 'image/jpeg', 

15 'image/webp', 

16] 

17"""MIME types supported by QGIS Server GetMap requests.""" 

18 

19 

20class Object(gws.base.grabber.box.Object): 

21 """Grabber that renders boxes with GetMap requests to QGIS Server.""" 

22 

23 provider: provider.Object 

24 """QGIS provider.""" 

25 params: dict 

26 """Fixed GetMap parameters, e.g. ``LAYERS`` and ``FILTER``.""" 

27 sourceMimeType: str 

28 """MIME type of GetMap requests, PNG if empty.""" 

29 

30 def __init__(self, opts: gws.base.grabber.Options, provider: provider.Object, params: dict): 

31 """Create the grabber. 

32 

33 Args: 

34 opts: Grabber options. 

35 provider: QGIS provider. 

36 params: Fixed GetMap parameters, merged with per-request parameters. 

37 """ 

38 super().__init__(opts) 

39 self.provider = provider 

40 self.params = params 

41 self.sourceCrs = self.targetCrs 

42 self.sourceMimeType = gws.lib.image.format.best_mime_type(self.imageFormat, _GET_MAP_MIME_TYPES) 

43 

44 def fetch_box_as_bytes(self, bounds, w, h, params=None): 

45 return self.provider.get_map( 

46 bounds, 

47 w, 

48 h, 

49 gws.u.merge(self.params, params), 

50 self.sourceMimeType, 

51 ) 

52 

53 def fetch_box_as_image(self, bounds, w, h, params=None): 

54 return self.to_image(self.fetch_box_as_bytes(bounds, w, h, params))