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
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1"""GeoJson provder."""
3from typing import Optional, cast
5import gws
6import gws.config.util
7import gws.gis.crs
8import gws.base.shape
9import gws.lib.jsonx
13class Config(gws.Config):
14 path: gws.FilePath
15 """path to a geojson file"""
18class Object(gws.Node):
19 path: str
21 _records = None
23 def configure(self):
24 self.path = self.cfg('path')
26 def post_configure(self):
27 self._records = None
29 def get_records(self) -> list[gws.FeatureRecord]:
30 if self._records is None:
31 self._records = self._load()
32 return self._records
34 def _load(self):
35 js = gws.lib.jsonx.from_path(self.path)
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'])
42 records = []
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)
52 return records