Coverage for gws-app/gws/base/layer/vector.py: 0%

53 statements  

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

1from typing import Optional 

2 

3import gws 

4import gws.base.model 

5import gws.base.template 

6import gws.gis.extent 

7import gws.lib.style 

8import gws.lib.svg 

9 

10from . import core 

11 

12 

13class Object(core.Object): 

14 """Base vector layer""" 

15 

16 # @TODO rasterize vector layers 

17 canRenderBox = False 

18 canRenderXyz = False 

19 canRenderSvg = True 

20 

21 geometryType: Optional[gws.GeometryType] = None 

22 geometryCrs: Optional[gws.Crs] = None 

23 

24 def props(self, user): 

25 return gws.u.merge( 

26 super().props(user), 

27 type='vector', 

28 url=self.url_path('features'), 

29 geometryType=self.geometryType 

30 ) 

31 

32 def render(self, lri): 

33 if lri.type == gws.LayerRenderInputType.svg: 

34 tags = self.render_svg_fragment(lri) 

35 if tags: 

36 return gws.LayerRenderOutput(tags=tags) 

37 

38 # if lri.type == 'box': 

39 

40 # fr = self.render_svg_fragment(view) 

41 # ts = gws.debug.time_start('render_box:to_png') 

42 # img = gws.lib.svg.fragment_to_image(fr, size=view.pxSize, format='png') 

43 # gws.debug.time_end(ts) 

44 # return img.to_bytes() 

45 # 

46 

47 def render_svg_fragment(self, lri: gws.LayerRenderInput): 

48 bounds = lri.view.bounds 

49 if lri.view.rotation: 

50 bounds = gws.Bounds(crs=lri.view.bounds.crs, extent=gws.gis.extent.circumsquare(bounds.extent)) 

51 

52 search = gws.SearchQuery(bounds=bounds) 

53 features = self.find_features(search, lri.user) 

54 if not features: 

55 gws.log.debug(f'render {self}: no features found') 

56 return 

57 

58 # @TODO should pick a project template too, cmp. map/action/get_features 

59 tpl = self.root.app.templateMgr.find_template(f'feature.label', where=[self], user=lri.user) 

60 

61 gws.debug.time_start('render_svg:to_svg') 

62 tags = [] 

63 

64 for feature in features: 

65 if tpl: 

66 feature.render_views([tpl], layer=self, user=lri.user) 

67 tags.extend(feature.to_svg(lri.view, feature.views.get('label', ''), lri.style)) 

68 

69 gws.debug.time_end() 

70 

71 return tags 

72 

73 def find_features(self, search, user): 

74 model = self.root.app.modelMgr.find_model(self, user=user, access=gws.Access.read) 

75 if not model: 

76 return [] 

77 

78 mc = gws.ModelContext(op=gws.ModelOperation.read, target=gws.ModelReadTarget.map, user=user) 

79 features = model.find_features(search, mc) 

80 if not features: 

81 return [] 

82 

83 for feature in features: 

84 if search.bounds: 

85 feature.transform_to(search.bounds.crs) 

86 if not feature.category: 

87 feature.category = self.title 

88 

89 return features