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

1"""WFS flat layer.""" 

2 

3from typing import Optional 

4 

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 

18 

19 

20from . import provider 

21 

22 

23@gws.ext.config.layer('wfsflat') 

24class Config(gws.base.layer.Config): 

25 """Vector layer that shows the features of one WFS feature type.""" 

26 

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.""" 

31 

32 

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. 

36 

37 The features are loaded from the WFS service through a ``wfs`` model and 

38 can be searched with a ``wfs`` finder. 

39 """ 

40 

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.""" 

47 

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') 

52 

53 def configure_provider(self): 

54 return gws.config.util.configure_provider_for(self, provider.Object) 

55 

56 def configure_sources(self): 

57 if super().configure_sources(): 

58 return True 

59 

60 gws.u.require(self.provider, 'failed to configure service provider') 

61 

62 self.configure_source_layers() 

63 return True 

64 

65 def configure_source_layers(self): 

66 """Select the source layers from the feature types of the provider. 

67 

68 Returns: 

69 Always ``True``. 

70 """ 

71 return gws.config.util.configure_source_layers_for(self, self.provider.sourceLayers) 

72 

73 def configure_models(self): 

74 return gws.config.util.configure_models_for(self, with_default=True) 

75 

76 def create_model(self, cfg): 

77 """Create a ``wfs`` model bound to the provider and the source layers of the layer. 

78 

79 Args: 

80 cfg: Model configuration, or ``None`` for the default model. 

81 

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 ) 

92 

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 

98 

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 

105 

106 def configure_search(self): 

107 if super().configure_search(): 

108 return True 

109 self.finders.append(self.create_finder(None)) 

110 return True 

111 

112 def create_finder(self, cfg): 

113 """Create a ``wfs`` finder bound to the provider and the source layers of the layer. 

114 

115 Args: 

116 cfg: Finder configuration, or ``None`` for the default finder. 

117 

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 )