Coverage for src/geodense/geojson.py: 92%

26 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2024-10-11 14:11 +0000

1import re 

2from typing import Literal 

3 

4from geojson_pydantic import FeatureCollection 

5from pydantic import BaseModel, Field 

6 

7from geodense.models import GeodenseError 

8 

9 

10class GeoJsonCrsProp(BaseModel): 

11 # OGC URN scheme - 8.2 in OGC 05-103 

12 # urn:ogc:def:crs:{crs_auth}:{crs_version}:{crs_identifier} 

13 name: str = Field(pattern=r"^urn:ogc:def:crs:.*?:.*?:.*?$") 

14 

15 

16class GeoJsonCrs(BaseModel): 

17 properties: GeoJsonCrsProp 

18 type: Literal["name"] = "name" 

19 

20 

21class CrsFeatureCollection(FeatureCollection): 

22 crs: GeoJsonCrs | None = None 

23 name: str | None = None 

24 

25 def set_crs_auth_code(self: "CrsFeatureCollection", crs_auth_code: str) -> None: 

26 crs_auth, crs_identifier = crs_auth_code.split(":") 

27 geojson_crs_val = f"urn:ogc:def:crs:{crs_auth}::{crs_identifier}" 

28 if self.crs is None: 

29 self.crs = GeoJsonCrs(properties=GeoJsonCrsProp(name=geojson_crs_val)) 

30 self.crs.properties.name = geojson_crs_val 

31 

32 def get_crs_auth_code(self: "CrsFeatureCollection") -> str | None: 

33 if self.crs is None: 

34 return None 

35 result = re.search(r"^urn:ogc:def:crs:(.*?):.*?:(.*?)$", self.crs.properties.name) 

36 if result is None: 

37 raise GeodenseError(f"unable to retrieve crs_auth_code from crs.properties.name {self.crs.properties.name}") 

38 return f"{result.group(1)}:{result.group(2)}"