Coverage for gws-app/gws/plugin/geojson/layer.py: 98%

45 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-10-23 20:06 +0200

1"""The ``geojson`` layer.""" 

2 

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 

10 

11from . import provider 

12 

13 

14@gws.ext.config.layer('geojson') 

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

16 """Vector layer with features from a GeoJSON file.""" 

17 

18 provider: provider.Config 

19 """GeoJSON file with the layer features.""" 

20 

21 

22@gws.ext.object.layer('geojson') 

23class Object(gws.base.layer.vector.Object): 

24 """GeoJSON layer.""" 

25 

26 provider: provider.Object 

27 """The GeoJSON provider.""" 

28 

29 def configure(self): 

30 self.configure_layer() 

31 for rec in self.provider.load_records(): 

32 if rec.shape: 

33 self.geometryType = rec.shape.type 

34 self.geometryCrs = rec.shape.crs 

35 break 

36 

37 def configure_provider(self): 

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

39 

40 def configure_extent(self): 

41 if super().configure_extent(): 

42 return True 

43 recs = self.provider.load_records() 

44 if recs: 

45 bs = [rec.shape.bounds() for rec in recs if rec.shape] 

46 if bs: 

47 ext = gws.lib.bounds.wgs_extent(gws.lib.bounds.union(bs), pad=True) 

48 if ext: 

49 self.wgsExtent = ext 

50 return True 

51 

52 def configure_models(self): 

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

54 

55 def create_model(self, cfg): 

56 """Create a GeoJSON model that uses the provider of the layer. 

57 

58 Args: 

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

60 

61 Returns: 

62 The model. 

63 """ 

64 return self.create_child( 

65 gws.ext.object.model, 

66 cfg, 

67 type=self.extType, 

68 _defaultProvider=self.provider 

69 ) 

70 

71 def configure_search(self): 

72 if super().configure_search(): 

73 return True 

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

75 return True 

76 

77 def create_finder(self, cfg): 

78 """Create a GeoJSON finder that uses the provider of the layer. 

79 

80 Args: 

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

82 

83 Returns: 

84 The finder. 

85 """ 

86 return self.create_child( 

87 gws.ext.object.finder, 

88 cfg, 

89 type='geojson', 

90 _defaultProvider=self.provider, 

91 )