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

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

30 

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 

38 

39 def configure_provider(self): 

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

41 

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 

53 

54 def configure_models(self): 

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

56 

57 def create_model(self, cfg): 

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

59 

60 Args: 

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

62 

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 ) 

72 

73 def configure_search(self): 

74 if super().configure_search(): 

75 return True 

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

77 return True 

78 

79 def create_finder(self, cfg): 

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

81 

82 Args: 

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

84 

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 )