Coverage for gws-app/gws/plugin/ows_client/wfs/flatlayer.py: 0%
60 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"""WFS flat layer."""
3from typing import Optional
5import gws
6import gws.base.layer
7import gws.base.legend
8import gws.base.model
9import gws.base.search
10import gws.base.template
11import gws.config.util
12import gws.base.metadata
13import gws.lib.crs
14import gws.gis.source
15import gws.gis.zoom
16import gws.lib.bounds
17import gws.lib.extent
20from . import provider
23@gws.ext.config.layer('wfsflat')
24class Config(gws.base.layer.Config):
25 """Vector layer that shows the features of one WFS feature type."""
27 provider: Optional[provider.Config]
28 """WFS service the layer is loaded from."""
29 sourceLayers: Optional[gws.gis.source.LayerFilter]
30 """Feature type to show."""
33@gws.ext.object.layer('wfsflat')
34class Object(gws.base.layer.vector.Object):
35 """Vector layer that shows the features of a single WFS feature type.
37 The features are loaded from the WFS service through a ``wfs`` model and
38 can be searched with a ``wfs`` finder.
39 """
41 provider: provider.Object
42 """WFS service provider."""
43 sourceLayers: list[gws.SourceLayer]
44 """Feature type shown by the layer, always a single source layer."""
45 sourceCrs: gws.Crs
46 """Source CRS. Not set by this class."""
48 def configure(self):
49 self.configure_layer()
50 if len(self.sourceLayers) != 1:
51 raise gws.Error(f'wfsflat requires a single source layer')
53 def configure_provider(self):
54 return gws.config.util.configure_provider_for(self, provider.Object)
56 def configure_sources(self):
57 if super().configure_sources():
58 return True
60 gws.u.require(self.provider, 'failed to configure service provider')
62 self.configure_source_layers()
63 return True
65 def configure_source_layers(self):
66 """Select the source layers from the feature types of the provider.
68 Returns:
69 Always ``True``.
70 """
71 return gws.config.util.configure_source_layers_for(self, self.provider.sourceLayers)
73 def configure_models(self):
74 return gws.config.util.configure_models_for(self, with_default=True)
76 def create_model(self, cfg):
77 """Create a ``wfs`` model bound to the provider and the source layers of the layer.
79 Args:
80 cfg: Model configuration, or ``None`` for the default model.
82 Returns:
83 The model object.
84 """
85 return self.create_child(
86 gws.ext.object.model,
87 cfg,
88 type='wfs',
89 _defaultProvider=self.provider,
90 _defaultSourceLayers=self.sourceLayers
91 )
93 def configure_extent(self):
94 if super().configure_extent():
95 return True
96 self.wgsExtent = gws.gis.source.combined_wgs_extent(self.sourceLayers) or self.mapCrs.wgsExtent
97 return True
99 def configure_metadata(self):
100 if super().configure_metadata():
101 return True
102 if len(self.sourceLayers) == 1:
103 self.metadata = self.sourceLayers[0].metadata
104 return True
106 def configure_search(self):
107 if super().configure_search():
108 return True
109 self.finders.append(self.create_finder(None))
110 return True
112 def create_finder(self, cfg):
113 """Create a ``wfs`` finder bound to the provider and the source layers of the layer.
115 Args:
116 cfg: Finder configuration, or ``None`` for the default finder.
118 Returns:
119 The finder object.
120 """
121 return self.create_child(
122 gws.ext.object.finder,
123 cfg,
124 type='wfs',
125 _defaultProvider=self.provider,
126 _defaultSourceLayers=self.sourceLayers
127 )