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
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1from typing import Optional
3import gws
4import gws.base.model
5import gws.base.template
6import gws.gis.extent
7import gws.lib.style
8import gws.lib.svg
10from . import core
13class Object(core.Object):
14 """Base vector layer"""
16 # @TODO rasterize vector layers
17 canRenderBox = False
18 canRenderXyz = False
19 canRenderSvg = True
21 geometryType: Optional[gws.GeometryType] = None
22 geometryCrs: Optional[gws.Crs] = None
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 )
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)
38 # if lri.type == 'box':
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 #
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))
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
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)
61 gws.debug.time_start('render_svg:to_svg')
62 tags = []
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))
69 gws.debug.time_end()
71 return tags
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 []
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 []
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
89 return features