Skip to content

Commit bd516f0

Browse files
authored
feat(python): Constuctor for GeoArray (#1385)
Less typing than `GeoArray.from_arrow`
1 parent e04bf3b commit bd516f0

File tree

8 files changed

+39
-35
lines changed

8 files changed

+39
-35
lines changed

python/geoarrow-core/python/geoarrow/rust/core/_array.pyi

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ from .enums import CoordType
66
from .types import CoordTypeInput
77

88
class GeoArray:
9+
def __init__(self, data: ArrowArrayExportable) -> None:
10+
"""Create a new GeoArray.
11+
12+
At the moment this is solely an alias for `from_arrow()`.
13+
"""
914
def __arrow_c_array__(
1015
self, requested_schema: object | None = None
1116
) -> tuple[object, object]:

python/tests/core/operations/test_geometry_col.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
def geoarrow_array():
1010
geoms = shapely.points([1, 2, 3], [4, 5, 6])
11-
return GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
11+
return GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
1212

1313

1414
def test_batch_no_geom_cols():

python/tests/core/operations/test_type_id.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
import geopandas as gpd
22
import numpy as np
33
import shapely
4-
from arro3.core import ChunkedArray
54
from geoarrow.rust.core import GeoArray, GeoChunkedArray, get_type_id
65

76

87
def test_points():
98
geoms = shapely.points([1, 2, 3], [4, 5, 6])
10-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
9+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
1110
out = get_type_id(arr)
1211
assert (np.asarray(out) == 1).all()
1312

1413

1514
def test_points_wkb():
1615
geoms = shapely.points([1, 2, 3], [4, 5, 6])
17-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("wkb"))
16+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("wkb"))
1817
out = get_type_id(arr)
1918
assert (np.asarray(out) == 1).all()
2019

@@ -41,7 +40,7 @@ def test_mixed_wkb():
4140
]
4241
),
4342
]
44-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("wkb"))
43+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("wkb"))
4544
out = get_type_id(arr)
4645
assert (np.asarray(out) == np.array([1, 2, 3, 4, 5, 6, 7])).all()
4746

@@ -68,7 +67,7 @@ def test_mixed_wkb_3d():
6867
]
6968
),
7069
]
71-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("wkb"))
70+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("wkb"))
7271
out = get_type_id(arr)
7372
assert (np.asarray(out) == np.array([11, 12, 13, 14, 15, 16, 17])).all()
7473

@@ -81,16 +80,16 @@ def test_multipoints():
8180
shapely.geometry.Point(3, 6),
8281
]
8382
)
84-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
83+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
8584
out = get_type_id(arr)
8685
assert (np.asarray(out) == 4).all()
8786

8887

8988
def test_points_chunked():
9089
geoms1 = shapely.points([1, 2, 3], [4, 5, 6])
9190
geoms2 = shapely.points([10, 20, 30], [40, 50, 60])
92-
arr1 = GeoArray.from_arrow(gpd.GeoSeries(geoms1).to_arrow("geoarrow"))
93-
arr2 = GeoArray.from_arrow(gpd.GeoSeries(geoms2).to_arrow("geoarrow"))
91+
arr1 = GeoArray(gpd.GeoSeries(geoms1).to_arrow("geoarrow"))
92+
arr2 = GeoArray(gpd.GeoSeries(geoms2).to_arrow("geoarrow"))
9493
ca = GeoChunkedArray([arr1, arr2])
9594
out = get_type_id(ca).read_all()
9695
assert (np.asarray(out) == 1).all()

python/tests/core/test_array.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,27 @@
1111

1212
def test_eq():
1313
geoms = shapely.points([1, 2, 3], [4, 5, 6])
14-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
14+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
1515
assert arr == arr
1616

1717
with registered_extension_types():
1818
pa_arr = pa.array(arr)
1919
assert arr == pa_arr
20-
assert arr == GeoArray.from_arrow(pa_arr)
20+
assert arr == GeoArray(pa_arr)
2121

2222

2323
def test_getitem():
2424
# Tests both the __getitem__ method and the scalar geo interface in round trip
2525
# conversion to shapely.
2626
gdf = gpd.read_file(geodatasets.get_path("ny.bb"))
27-
arr = GeoArray.from_arrow(gdf.geometry.to_arrow("geoarrow"))
27+
arr = GeoArray(gdf.geometry.to_arrow("geoarrow"))
2828
for i in range(len(arr)):
2929
assert shapely.geometry.shape(arr[i]).equals(gdf.geometry.iloc[i]) # type: ignore
3030

3131

3232
def test_repr():
3333
geoms = shapely.points([1, 2, 3], [4, 5, 6])
34-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
34+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
3535
assert repr(arr) == 'GeoArray(Point(dimension="XY", coord_type="interleaved"))'
3636

3737

python/tests/core/test_chunked_array.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
def test_eq():
1313
geoms1 = shapely.points([1, 2, 3], [4, 5, 6])
1414
geoms2 = shapely.points([10, 20, 30], [40, 50, 60])
15-
arr1 = GeoArray.from_arrow(gpd.GeoSeries(geoms1).to_arrow("geoarrow"))
16-
arr2 = GeoArray.from_arrow(gpd.GeoSeries(geoms2).to_arrow("geoarrow"))
15+
arr1 = GeoArray(gpd.GeoSeries(geoms1).to_arrow("geoarrow"))
16+
arr2 = GeoArray(gpd.GeoSeries(geoms2).to_arrow("geoarrow"))
1717
ca = GeoChunkedArray([arr1, arr2])
1818

1919
assert ca == ca
@@ -28,8 +28,8 @@ def test_getitem():
2828
# Tests both the __getitem__ method and the scalar geo interface in round trip
2929
# conversion to shapely.
3030
gdf = gpd.read_file(geodatasets.get_path("ny.bb"))
31-
arr1 = GeoArray.from_arrow(gdf.geometry.iloc[:2].to_arrow("geoarrow"))
32-
arr2 = GeoArray.from_arrow(gdf.geometry.iloc[2:].to_arrow("geoarrow"))
31+
arr1 = GeoArray(gdf.geometry.iloc[:2].to_arrow("geoarrow"))
32+
arr2 = GeoArray(gdf.geometry.iloc[2:].to_arrow("geoarrow"))
3333
ca = GeoChunkedArray([arr1, arr2])
3434

3535
for i in range(len(ca)):
@@ -39,8 +39,8 @@ def test_getitem():
3939
def test_repr():
4040
geoms1 = shapely.points([1, 2, 3], [4, 5, 6])
4141
geoms2 = shapely.points([10, 20, 30], [40, 50, 60])
42-
arr1 = GeoArray.from_arrow(gpd.GeoSeries(geoms1).to_arrow("geoarrow"))
43-
arr2 = GeoArray.from_arrow(gpd.GeoSeries(geoms2).to_arrow("geoarrow"))
42+
arr1 = GeoArray(gpd.GeoSeries(geoms1).to_arrow("geoarrow"))
43+
arr2 = GeoArray(gpd.GeoSeries(geoms2).to_arrow("geoarrow"))
4444
ca = GeoChunkedArray([arr1, arr2])
4545
assert (
4646
repr(ca) == 'GeoChunkedArray(Point(dimension="XY", coord_type="interleaved"))'
@@ -71,8 +71,8 @@ def test_downcast_with_crs():
7171
def constructor_existing_chunked_array():
7272
geoms1 = shapely.points([1, 2, 3], [4, 5, 6])
7373
geoms2 = shapely.points([10, 20, 30], [40, 50, 60])
74-
arr1 = GeoArray.from_arrow(gpd.GeoSeries(geoms1).to_arrow("geoarrow"))
75-
arr2 = GeoArray.from_arrow(gpd.GeoSeries(geoms2).to_arrow("geoarrow"))
74+
arr1 = GeoArray(gpd.GeoSeries(geoms1).to_arrow("geoarrow"))
75+
arr2 = GeoArray(gpd.GeoSeries(geoms2).to_arrow("geoarrow"))
7676
ca = ChunkedArray([arr1, arr2])
7777
geo_ca = GeoChunkedArray(ca)
7878
assert geo_ca.chunk(0) == arr1

python/tests/core/test_scalar.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,41 @@
1111

1212
def test_eq():
1313
geoms = shapely.points([1, 2, 3], [4, 5, 6])
14-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
14+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
1515
assert arr[0] == arr[0]
1616

1717
# pyarrow doesn't implement __arrow_c_array__ on scalars
1818
with registered_extension_types():
1919
pa_arr = pa.array(arr)
20-
assert arr[0] == GeoArray.from_arrow(pa_arr)[0]
20+
assert arr[0] == GeoArray(pa_arr)[0]
2121

2222
# test with arro3
2323
assert arr[0] == Scalar.from_arrow(arr[0])
24-
assert arr[0] == GeoArray.from_arrow(Scalar.from_arrow(arr[0]))[0]
24+
assert arr[0] == GeoArray(Scalar.from_arrow(arr[0]))[0]
2525

2626

2727
def test_type():
2828
geoms = shapely.points([1, 2, 3], [4, 5, 6])
29-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
29+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
3030
assert arr[0].type == point("xy", coord_type="interleaved")
3131

3232

3333
def test_repr():
3434
geoms = shapely.points([1, 2, 3], [4, 5, 6])
35-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
35+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
3636
assert repr(arr[0]) == 'GeoScalar(Point(dimension="XY", coord_type="interleaved"))'
3737

3838

3939
def test_geo_interface():
4040
geoms = shapely.points([1, 2, 3], [4, 5, 6])
4141
gs = gpd.GeoSeries(geoms)
42-
arr = GeoArray.from_arrow(gs.to_arrow("geoarrow"))
42+
arr = GeoArray(gs.to_arrow("geoarrow"))
4343
assert geo_interface_equals(gs[0].__geo_interface__, arr[0].__geo_interface__)
4444

4545

4646
def test_geo_interface_polygon():
4747
gdf = gpd.read_file(geodatasets.get_path("ny.bb"))
48-
arr = GeoArray.from_arrow(gdf.geometry.to_arrow("geoarrow"))
48+
arr = GeoArray(gdf.geometry.to_arrow("geoarrow"))
4949
assert geo_interface_equals(
5050
gdf.geometry.iloc[0].__geo_interface__,
5151
arr[0].__geo_interface__,

python/tests/io/test_parquet.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ async def test_parquet_dataset():
7575

7676
def test_write_wkb():
7777
geoms = shapely.points([1, 2, 3], [4, 5, 6])
78-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
78+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
7979
table = Table.from_arrays([arr], names=["geometry"])
8080
with GeoParquetWriter("points.parquet", table.schema) as writer:
8181
writer.write_table(table)
@@ -96,7 +96,7 @@ def test_write_wkb():
9696

9797
def test_write_wkb_covering():
9898
geoms = shapely.points([1, 2, 3], [4, 5, 6])
99-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
99+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
100100
table = Table.from_arrays([arr], names=["geometry"])
101101
with GeoParquetWriter(
102102
"points.parquet", table.schema, generate_covering=True
@@ -143,7 +143,7 @@ def test_write_wkb_covering():
143143

144144
def test_write_geoarrow():
145145
geoms = shapely.points([1, 2, 3], [4, 5, 6])
146-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
146+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
147147
table = Table.from_arrays([arr], names=["geometry"])
148148
with GeoParquetWriter(
149149
"points.parquet", table.schema, encoding="geoarrow"
@@ -170,7 +170,7 @@ def test_write_geoarrow():
170170

171171
def test_write_geoarrow_xyz():
172172
geoms = shapely.points([1, 2, 3], [4, 5, 6], [7, 8, 9])
173-
arr = GeoArray.from_arrow(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
173+
arr = GeoArray(gpd.GeoSeries(geoms).to_arrow("geoarrow"))
174174
table = Table.from_arrays([arr], names=["geometry"])
175175
with GeoParquetWriter(
176176
"points.parquet", table.schema, encoding="geoarrow"
@@ -203,7 +203,7 @@ def test_write_crs():
203203
geoms = shapely.points([1, 2, 3], [4, 5, 6])
204204
crs = CRS.from_user_input("EPSG:4326")
205205
series = gpd.GeoSeries(geoms, crs=crs)
206-
arr = GeoArray.from_arrow(series.to_arrow("geoarrow"))
206+
arr = GeoArray(series.to_arrow("geoarrow"))
207207
table = Table.from_arrays([arr], names=["geometry"])
208208
with GeoParquetWriter("points.parquet", table.schema) as writer:
209209
writer.write_table(table)

rust/pyo3-geoarrow/src/array.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ impl PyGeoArray {
8282
#[pymethods]
8383
impl PyGeoArray {
8484
#[new]
85-
fn py_new(data: &Bound<PyAny>) -> PyResult<Self> {
86-
data.extract()
85+
fn py_new(data: Self) -> Self {
86+
data
8787
}
8888

8989
#[pyo3(signature = (requested_schema=None))]

0 commit comments

Comments
 (0)