diff --git a/geojson_pydantic/types.py b/geojson_pydantic/types.py index d02c244..5500efe 100644 --- a/geojson_pydantic/types.py +++ b/geojson_pydantic/types.py @@ -1,6 +1,6 @@ """Types for geojson_pydantic models""" -from typing import List, Tuple, Union +from typing import List, NamedTuple, Tuple, Union from pydantic import Field from typing_extensions import Annotated @@ -10,7 +10,11 @@ Tuple[float, float, float, float, float, float], # 3D bbox ] -Position = Union[Tuple[float, float], Tuple[float, float, float]] +Position2D = NamedTuple("Position2D", [("longitude", float), ("latitude", float)]) +Position3D = NamedTuple( + "Position3D", [("longitude", float), ("latitude", float), ("altitude", float)] +) +Position = Union[Position2D, Position3D] # Coordinate arrays LineStringCoords = Annotated[List[Position], Field(min_length=2)] diff --git a/tests/test_types.py b/tests/test_types.py new file mode 100644 index 0000000..54162a3 --- /dev/null +++ b/tests/test_types.py @@ -0,0 +1,50 @@ +import pytest + +from geojson_pydantic.types import Position2D, Position3D + + +@pytest.mark.parametrize("coordinates", [(1, 2), (1.0, 2.0), (1.01, 2.01)]) +def test_position2d_valid_coordinates(coordinates): + """ + Two number elements as coordinates should be okay + """ + p = Position2D(longitude=coordinates[0], latitude=coordinates[1]) + assert p[0] == coordinates[0] + assert p[1] == coordinates[1] + assert p.longitude == coordinates[0] + assert p.latitude == coordinates[1] + assert p == coordinates + + p = Position2D(*coordinates) + assert p[0] == coordinates[0] + assert p[1] == coordinates[1] + assert p.longitude == coordinates[0] + assert p.latitude == coordinates[1] + assert p == coordinates + + +@pytest.mark.parametrize( + "coordinates", [(1, 2, 3), (1.0, 2.0, 3.0), (1.01, 2.01, 3.01)] +) +def test_position3d_valid_coordinates(coordinates): + """ + Three number elements as coordinates should be okay + """ + p = Position3D( + longitude=coordinates[0], latitude=coordinates[1], altitude=coordinates[2] + ) + assert p[0] == coordinates[0] + assert p[1] == coordinates[1] + assert p[2] == coordinates[2] + assert p.longitude == coordinates[0] + assert p.latitude == coordinates[1] + assert p.altitude == coordinates[2] + assert p == coordinates + + p = Position3D(*coordinates) + assert p[0] == coordinates[0] + assert p[1] == coordinates[1] + assert p[2] == coordinates[2] + assert p.longitude == coordinates[0] + assert p.latitude == coordinates[1] + assert p.altitude == coordinates[2]