Coverage for gws-app/gws/plugin/geojson/layer.py: 96%
46 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 13:35 +0200
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 13:35 +0200
1"""The ``geojson`` layer."""
3import gws
4import gws.base.layer
5import gws.lib.shape
6import gws.config.util
7import gws.lib.bounds
8import gws.lib.crs
9import gws.lib.jsonx
11from . import provider
14@gws.ext.config.layer('geojson')
15class Config(gws.base.layer.Config):
16 """Vector layer with features from a GeoJSON file."""
18 provider: provider.Config
19 """GeoJSON file with the layer features."""
22@gws.ext.object.layer('geojson')
23class Object(gws.base.layer.vector.Object):
24 """GeoJSON layer."""
26 path: str
27 """Path to the GeoJSON file. Not set; the path is kept by the provider."""
28 provider: provider.Object
29 """The GeoJSON provider."""
31 def configure(self):
32 self.configure_layer()
33 for rec in self.provider.load_records():
34 if rec.shape:
35 self.geometryType = rec.shape.type
36 self.geometryCrs = rec.shape.crs
37 break
39 def configure_provider(self):
40 return gws.config.util.configure_provider_for(self, provider.Object)
42 def configure_extent(self):
43 if super().configure_extent():
44 return True
45 recs = self.provider.load_records()
46 if recs:
47 bs = [rec.shape.bounds() for rec in recs if rec.shape]
48 if bs:
49 ext = gws.lib.bounds.wgs_extent(gws.lib.bounds.union(bs), pad=True)
50 if ext:
51 self.wgsExtent = ext
52 return True
54 def configure_models(self):
55 return gws.config.util.configure_models_for(self, with_default=True)
57 def create_model(self, cfg):
58 """Create a GeoJSON model that uses the provider of the layer.
60 Args:
61 cfg: Model configuration, or ``None`` for the default model.
63 Returns:
64 The model.
65 """
66 return self.create_child(
67 gws.ext.object.model,
68 cfg,
69 type=self.extType,
70 _defaultProvider=self.provider
71 )
73 def configure_search(self):
74 if super().configure_search():
75 return True
76 self.finders.append(self.create_finder(None))
77 return True
79 def create_finder(self, cfg):
80 """Create a GeoJSON finder that uses the provider of the layer.
82 Args:
83 cfg: Finder configuration, or ``None`` for the default finder.
85 Returns:
86 The finder.
87 """
88 return self.create_child(
89 gws.ext.object.finder,
90 cfg,
91 type='geojson',
92 _defaultProvider=self.provider,
93 )