Skip to content

Commit e87e957

Browse files
committed
feat: add methods to generate geometry_collection, geometry_collection2d and geometry_collection3d
1 parent 33d1fb9 commit e87e957

File tree

6 files changed

+118
-2
lines changed

6 files changed

+118
-2
lines changed

geojson_faker/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from geojson_faker.faker import GeoJsonFaker
22
from geojson_faker.generators import (
33
fake_altitude,
4+
fake_geometry_collection,
45
fake_latitude,
56
fake_line_string,
67
fake_longitude,
78
fake_multi_line_string,
89
fake_multi_point,
10+
fake_multi_polygon,
911
fake_point,
1012
fake_polygon,
1113
fake_position,
@@ -24,4 +26,6 @@
2426
"fake_line_string",
2527
"fake_multi_line_string",
2628
"fake_polygon",
29+
"fake_multi_polygon",
30+
"fake_geometry_collection",
2731
]

geojson_faker/constants.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ class geo_keys(NamedTuple):
2525
multi_polygon = "multi_polygon"
2626
multi_polygon2d = "multi_polygon2d"
2727
multi_polygon3d = "multi_polygon3d"
28+
geometry_collection = "geometry_collection"
29+
geometry_collection2d = "geometry_collection2d"
30+
geometry_collection3d = "geometry_collection3d"
2831

2932

3033
DIMENSIONS = [Dimension.two, Dimension.three]

geojson_faker/faker.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import TypeVar
33

44
from geojson_pydantic.geometries import (
5+
GeometryCollection,
56
LineString,
67
MultiLineString,
78
MultiPoint,
@@ -13,6 +14,7 @@
1314

1415
from geojson_faker.constants import geo_keys
1516
from geojson_faker.generators import (
17+
fake_geometry_collection,
1618
fake_line_string,
1719
fake_multi_line_string,
1820
fake_multi_point,
@@ -51,6 +53,9 @@ def __init__(self, random_always: bool = True):
5153
geo_keys.multi_polygon: None,
5254
geo_keys.multi_polygon2d: None,
5355
geo_keys.multi_polygon3d: None,
56+
geo_keys.geometry_collection: None,
57+
geo_keys.geometry_collection2d: None,
58+
geo_keys.geometry_collection3d: None,
5459
}
5560

5661
@property
@@ -159,6 +164,26 @@ def multi_polygon3d(self) -> MultiPolygon:
159164
func=fake_multi_polygon, geo_key=geo_keys.multi_polygon3d, dimension=Dimension.three
160165
)
161166

167+
@property
168+
def geometry_collection(self) -> GeometryCollection:
169+
return self._fake(func=fake_geometry_collection, geo_key=geo_keys.geometry_collection)
170+
171+
@property
172+
def geometry_collection2d(self) -> GeometryCollection:
173+
return self._fake(
174+
func=fake_geometry_collection,
175+
geo_key=geo_keys.geometry_collection2d,
176+
dimension=Dimension.two,
177+
)
178+
179+
@property
180+
def geometry_collection3d(self) -> GeometryCollection:
181+
return self._fake(
182+
func=fake_geometry_collection,
183+
geo_key=geo_keys.geometry_collection3d,
184+
dimension=Dimension.three,
185+
)
186+
162187
def _fake(
163188
self,
164189
func: Callable[[Dimension | None], _GeoJsonType],

geojson_faker/generators.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from random import randint, randrange, uniform
22

33
from geojson_pydantic.geometries import (
4+
GeometryCollection,
45
LineString,
56
MultiLineString,
67
MultiPoint,
@@ -140,3 +141,48 @@ def fake_multi_polygon(
140141
polygon_coordinates.append(linear_ring)
141142
coordinates.append(polygon_coordinates)
142143
return MultiPolygon(type="MultiPolygon", coordinates=coordinates)
144+
145+
146+
def fake_geometry_collection(
147+
dimension: Dimension | None = None,
148+
# points
149+
max_points: int = 10,
150+
# multi_points
151+
max_multi_points: int = 10,
152+
# line_strings
153+
max_line_strings: int = 10,
154+
# multi_line_strings
155+
max_multi_line_strings: int = 10,
156+
# polygons
157+
max_polygons: int = 10,
158+
# multi_polygons
159+
max_multi_polygons: int = 10,
160+
) -> GeometryCollection:
161+
geometries = []
162+
if max_points > 0:
163+
geometries.extend([fake_point(dimension=dimension) for _ in _randintrange(1, max_points)])
164+
if max_multi_points > 0:
165+
geometries.extend(
166+
[fake_multi_point(dimension=dimension) for _ in _randintrange(1, max_multi_points)]
167+
)
168+
if max_line_strings > 0:
169+
geometries.extend(
170+
[fake_line_string(dimension=dimension) for _ in _randintrange(1, max_line_strings)]
171+
)
172+
if max_multi_line_strings > 0:
173+
geometries.extend(
174+
[
175+
fake_multi_line_string(dimension=dimension)
176+
for _ in _randintrange(1, max_multi_line_strings)
177+
]
178+
)
179+
if max_polygons > 0:
180+
geometries.extend(
181+
[fake_polygon(dimension=dimension) for _ in _randintrange(1, max_polygons)]
182+
)
183+
if max_multi_polygons > 0:
184+
geometries.extend(
185+
[fake_multi_polygon(dimension=dimension) for _ in _randintrange(1, max_multi_polygons)]
186+
)
187+
188+
return GeometryCollection(type="GeometryCollection", geometries=geometries)

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ name = "geojson-faker"
33
version = "0.3.0"
44
description = "GeoJson fake generator."
55

6-
authors = ["impocode <impocode@impocode.com>"]
7-
maintainers = ["impocode <impocode@impocode.com>"]
6+
authors = ["impocode <impocode@impocode.one>"]
7+
maintainers = ["impocode <impocode@impocode.one>"]
88

99
license= "MIT"
1010
readme = "readme.md"

tests/faker_test.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from geojson_pydantic.geometries import (
2+
GeometryCollection,
23
LineString,
34
MultiLineString,
45
MultiPoint,
56
MultiPolygon,
67
Point,
78
Polygon,
9+
_GeometryBase,
810
)
911
from geojson_pydantic.types import Position, Position2D, Position3D
1012

@@ -362,3 +364,39 @@ def test_multi_polygon3d():
362364
assert isinstance(coordinates.longitude, float)
363365
assert isinstance(coordinates.latitude, float)
364366
assert isinstance(coordinates.altitude, float)
367+
368+
369+
def test_geometry_collection():
370+
geojson_faker = GeoJsonFaker()
371+
geometry_collection = geojson_faker.geometry_collection
372+
373+
assert isinstance(geometry_collection, GeometryCollection)
374+
assert geometry_collection.type == "GeometryCollection"
375+
assert len(geometry_collection.geometries) > 0
376+
377+
for geometry in geometry_collection.geometries:
378+
assert isinstance(geometry, _GeometryBase)
379+
380+
381+
def test_geometry_collection2d():
382+
geojson_faker = GeoJsonFaker()
383+
geometry_collection = geojson_faker.geometry_collection2d
384+
385+
assert isinstance(geometry_collection, GeometryCollection)
386+
assert geometry_collection.type == "GeometryCollection"
387+
assert len(geometry_collection.geometries) > 0
388+
389+
for geometry in geometry_collection.geometries:
390+
assert isinstance(geometry, _GeometryBase)
391+
392+
393+
def test_geometry_collection3d():
394+
geojson_faker = GeoJsonFaker()
395+
geometry_collection = geojson_faker.geometry_collection3d
396+
397+
assert isinstance(geometry_collection, GeometryCollection)
398+
assert geometry_collection.type == "GeometryCollection"
399+
assert len(geometry_collection.geometries) > 0
400+
401+
for geometry in geometry_collection.geometries:
402+
assert isinstance(geometry, _GeometryBase)

0 commit comments

Comments
 (0)