Skip to content

Commit e65c67f

Browse files
authored
[GH-2506] Fix segmentize array-like input and support lists as 'array-like' (#2507)
1 parent ab73e82 commit e65c67f

3 files changed

Lines changed: 43 additions & 5 deletions

File tree

python/sedona/spark/geopandas/geoseries.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,7 @@ def reverse(self):
10751075

10761076
def segmentize(self, max_segment_length):
10771077
other_series, extended = self._make_series_of_val(max_segment_length)
1078-
align = False if extended else align
1078+
align = not extended
10791079

10801080
spark_expr = stf.ST_Segmentize(F.col("L"), F.col("R"))
10811081
return self._row_wise_operation(
@@ -2833,11 +2833,13 @@ def _make_series_of_val(self, value: Any):
28332833
Returns:
28342834
tuple[pspd.Series, bool]:
28352835
- The series of the value
2836-
- Whether returned value was a single object extended into a series (useful for row-wise 'align' parameter)
2836+
- Whether returned value was a extended into a series (useful for row-wise 'align' parameter)
28372837
"""
28382838
# generator instead of a in-memory list
28392839
if isinstance(value, GeoDataFrame):
28402840
return value.geometry, False
2841+
elif isinstance(value, (list, np.ndarray)):
2842+
return pspd.Series(value), True
28412843
elif not isinstance(value, pspd.Series):
28422844
lst = [value for _ in range(len(self))]
28432845
if isinstance(value, BaseGeometry):

python/tests/geopandas/test_geoseries.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,6 +1464,24 @@ def test_segmentize(self):
14641464
df_result = s.to_geoframe().segmentize(5)
14651465
self.check_sgpd_equals_gpd(df_result, expected)
14661466

1467+
# Test array-like input
1468+
result = s.segmentize(ps.Series([5, 10]))
1469+
expected = gpd.GeoSeries(
1470+
[
1471+
LineString([(0, 0), (0, 5), (0, 10)]),
1472+
Polygon(
1473+
[
1474+
(0, 0),
1475+
(10, 0),
1476+
(10, 10),
1477+
(0, 10),
1478+
(0, 0),
1479+
]
1480+
),
1481+
],
1482+
)
1483+
self.check_sgpd_equals_gpd(result, expected)
1484+
14671485
def test_transform(self):
14681486
pass
14691487

python/tests/geopandas/test_match_geopandas_series.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import shutil
1919
import tempfile
2020
import pytest
21+
import numpy as np
2122
import pandas as pd
2223
import geopandas as gpd
2324
import pyspark.pandas as ps
@@ -387,7 +388,6 @@ def test_fillna(self):
387388

388389
# Ensure filling with np.nan or pd.NA returns None
389390
# but filling None return empty geometry
390-
import numpy as np
391391

392392
for fill_val in [np.nan, pd.NA, None]:
393393
sgpd_result = GeoSeries(data).fillna(fill_val)
@@ -419,8 +419,6 @@ def test_bounds(self):
419419
)
420420

421421
def test_total_bounds(self):
422-
import numpy as np
423-
424422
for geom in self.geoms:
425423
sgpd_result = GeoSeries(geom).total_bounds
426424
gpd_result = gpd.GeoSeries(geom).total_bounds
@@ -832,6 +830,26 @@ def test_segmentize(self):
832830
gpd_result = gpd.GeoSeries(geom).segmentize(2.5)
833831
self.check_sgpd_equals_gpd(sgpd_result, gpd_result)
834832

833+
# Test array-like inputs
834+
geoms = self.polygons
835+
lst = list(range(1, len(geoms) + 1))
836+
837+
# Traditional python list
838+
sgpd_result = GeoSeries(geoms).segmentize(lst)
839+
gpd_result = gpd.GeoSeries(geoms).segmentize(lst)
840+
self.check_sgpd_equals_gpd(sgpd_result, gpd_result)
841+
842+
np_array = np.array(lst)
843+
sgpd_result = GeoSeries(geoms).segmentize(np_array)
844+
gpd_result = gpd.GeoSeries(geoms).segmentize(np_array)
845+
self.check_sgpd_equals_gpd(sgpd_result, gpd_result)
846+
847+
# pandas series
848+
psser = ps.Series(lst)
849+
sgpd_result = GeoSeries(geoms).segmentize(psser)
850+
gpd_result = gpd.GeoSeries(geoms).segmentize(psser.to_pandas())
851+
self.check_sgpd_equals_gpd(sgpd_result, gpd_result)
852+
835853
def test_transform(self):
836854
pass
837855

0 commit comments

Comments
 (0)