Coverage for gws-app/gws/plugin/geojson/provider.py: 0%

34 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-17 01:37 +0200

1"""GeoJson provder.""" 

2 

3from typing import Optional, cast 

4 

5import gws 

6import gws.config.util 

7import gws.gis.crs 

8import gws.base.shape 

9import gws.lib.jsonx 

10 

11 

12 

13class Config(gws.Config): 

14 path: gws.FilePath 

15 """path to a geojson file""" 

16 

17 

18class Object(gws.Node): 

19 path: str 

20 

21 _records = None 

22 

23 def configure(self): 

24 self.path = self.cfg('path') 

25 

26 def post_configure(self): 

27 self._records = None 

28 

29 def get_records(self) -> list[gws.FeatureRecord]: 

30 if self._records is None: 

31 self._records = self._load() 

32 return self._records 

33 

34 def _load(self): 

35 js = gws.lib.jsonx.from_path(self.path) 

36 

37 crs = gws.gis.crs.WGS84 

38 if 'crs' in js: 

39 # https://geojson.org/geojson-spec#named-crs 

40 crs = gws.gis.crs.get(js['crs']['properties']['name']) 

41 

42 records = [] 

43 

44 for n, f in enumerate(js.get('features', []), 1): 

45 p = f.get('properties', {}) 

46 rec = gws.FeatureRecord(attributes=p) 

47 if f.get('geometry'): 

48 rec.shape = gws.base.shape.from_geojson(f['geometry'], crs) 

49 rec.uid = p.get('id') or p.get('uid') or p.get('fid') or p.get('sid') or n 

50 records.append(rec) 

51 

52 return records