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
« prev ^ index » next coverage.py v7.6.1, created at 2024-10-11 14:11 +0000
1import re
2from typing import Literal
4from geojson_pydantic import FeatureCollection
5from pydantic import BaseModel, Field
7from geodense.models import GeodenseError
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:.*?:.*?:.*?$")
16class GeoJsonCrs(BaseModel):
17 properties: GeoJsonCrsProp
18 type: Literal["name"] = "name"
21class CrsFeatureCollection(FeatureCollection):
22 crs: GeoJsonCrs | None = None
23 name: str | None = None
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
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)}"