Skip to content

Commit 7ec404c

Browse files
Merge pull request #161 from impocode/main
Add Position2D and Position3D of type NamedTuple
2 parents d9e84df + a3c60a3 commit 7ec404c

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

geojson_pydantic/types.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Types for geojson_pydantic models"""
22

3-
from typing import List, Tuple, Union
3+
from typing import List, NamedTuple, Tuple, Union
44

55
from pydantic import Field
66
from typing_extensions import Annotated
@@ -10,7 +10,11 @@
1010
Tuple[float, float, float, float, float, float], # 3D bbox
1111
]
1212

13-
Position = Union[Tuple[float, float], Tuple[float, float, float]]
13+
Position2D = NamedTuple("Position2D", [("longitude", float), ("latitude", float)])
14+
Position3D = NamedTuple(
15+
"Position3D", [("longitude", float), ("latitude", float), ("altitude", float)]
16+
)
17+
Position = Union[Position2D, Position3D]
1418

1519
# Coordinate arrays
1620
LineStringCoords = Annotated[List[Position], Field(min_length=2)]

tests/test_types.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import pytest
2+
3+
from geojson_pydantic.types import Position2D, Position3D
4+
5+
6+
@pytest.mark.parametrize("coordinates", [(1, 2), (1.0, 2.0), (1.01, 2.01)])
7+
def test_position2d_valid_coordinates(coordinates):
8+
"""
9+
Two number elements as coordinates should be okay
10+
"""
11+
p = Position2D(longitude=coordinates[0], latitude=coordinates[1])
12+
assert p[0] == coordinates[0]
13+
assert p[1] == coordinates[1]
14+
assert p.longitude == coordinates[0]
15+
assert p.latitude == coordinates[1]
16+
assert p == coordinates
17+
18+
p = Position2D(*coordinates)
19+
assert p[0] == coordinates[0]
20+
assert p[1] == coordinates[1]
21+
assert p.longitude == coordinates[0]
22+
assert p.latitude == coordinates[1]
23+
assert p == coordinates
24+
25+
26+
@pytest.mark.parametrize(
27+
"coordinates", [(1, 2, 3), (1.0, 2.0, 3.0), (1.01, 2.01, 3.01)]
28+
)
29+
def test_position3d_valid_coordinates(coordinates):
30+
"""
31+
Three number elements as coordinates should be okay
32+
"""
33+
p = Position3D(
34+
longitude=coordinates[0], latitude=coordinates[1], altitude=coordinates[2]
35+
)
36+
assert p[0] == coordinates[0]
37+
assert p[1] == coordinates[1]
38+
assert p[2] == coordinates[2]
39+
assert p.longitude == coordinates[0]
40+
assert p.latitude == coordinates[1]
41+
assert p.altitude == coordinates[2]
42+
assert p == coordinates
43+
44+
p = Position3D(*coordinates)
45+
assert p[0] == coordinates[0]
46+
assert p[1] == coordinates[1]
47+
assert p[2] == coordinates[2]
48+
assert p.longitude == coordinates[0]
49+
assert p.latitude == coordinates[1]
50+
assert p.altitude == coordinates[2]

0 commit comments

Comments
 (0)