Skip to content

Commit

Permalink
Merge pull request #1488 from rapidsai/branch-24.12
Browse files Browse the repository at this point in the history
Forward-merge branch-24.12 into branch-25.02
  • Loading branch information
GPUtester authored Nov 21, 2024
2 parents b01e47f + c314155 commit 5704129
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 56 deletions.
77 changes: 29 additions & 48 deletions python/cuspatial/cuspatial/core/geoseries.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,37 +221,38 @@ def sizes(self):
)

class GeoColumnAccessor:
def __init__(self, list_series, meta):
def __init__(self, list_series, meta, typ):
self._series = list_series
self._col = self._series._column
self._meta = meta
self._type = Feature_Enum.POINT
self._type = typ
# Resample the existing features so that the offsets returned
# by `_offset` methods reflect previous slicing, and match
# the values returned by .xy.
existing_indices = self._meta.union_offsets[
self._meta.input_types == self._type.value
]
self._existing_features = self._col.take(existing_indices._column)

@property
def x(self):
return self.xy[::2].reset_index(drop=True)
return cudf.Series(self.xy.values[::2])

@property
def y(self):
return self.xy[1::2].reset_index(drop=True)
return cudf.Series(self.xy.values[1::2])

@property
@cached_property
def xy(self):
features = self._get_current_features(self._type)
features = self.column()
if hasattr(features, "leaves"):
return cudf.Series(features.leaves().values)
return cudf.Series._from_column(features.leaves())
else:
return cudf.Series()

def _get_current_features(self, type):
# Resample the existing features so that the offsets returned
# by `_offset` methods reflect previous slicing, and match
# the values returned by .xy.
existing_indices = self._meta.union_offsets[
self._meta.input_types == type.value
]
existing_features = self._col.take(existing_indices._column)
return existing_features
def column(self):
"""Return the ListColumn reordered by union offset."""
return self._existing_features

def point_indices(self):
# Return a cupy.ndarray containing the index values that each
Expand All @@ -265,18 +266,10 @@ def point_indices(self):
self._meta.input_types != -1
]

def column(self):
"""Return the ListColumn reordered by union offset."""
return self._get_current_features(self._type)

class MultiPointGeoColumnAccessor(GeoColumnAccessor):
def __init__(self, list_series, meta):
super().__init__(list_series, meta)
self._type = Feature_Enum.MULTIPOINT

@property
def geometry_offset(self):
return self._get_current_features(self._type).offsets.values
return self.column().offsets.values

def point_indices(self):
# Return a cupy.ndarray containing the index values from the
Expand All @@ -286,19 +279,13 @@ def point_indices(self):
return cp.repeat(self._meta.input_types.index, sizes)

class LineStringGeoColumnAccessor(GeoColumnAccessor):
def __init__(self, list_series, meta):
super().__init__(list_series, meta)
self._type = Feature_Enum.LINESTRING

@property
def geometry_offset(self):
return self._get_current_features(self._type).offsets.values
return self.column().offsets.values

@property
def part_offset(self):
return self._get_current_features(
self._type
).elements.offsets.values
return self.column().elements.offsets.values

def point_indices(self):
# Return a cupy.ndarray containing the index values from the
Expand All @@ -308,25 +295,17 @@ def point_indices(self):
return cp.repeat(self._meta.input_types.index, sizes)

class PolygonGeoColumnAccessor(GeoColumnAccessor):
def __init__(self, list_series, meta):
super().__init__(list_series, meta)
self._type = Feature_Enum.POLYGON

@property
def geometry_offset(self):
return self._get_current_features(self._type).offsets.values
return self.column().offsets.values

@property
def part_offset(self):
return self._get_current_features(
self._type
).elements.offsets.values
return self.column().elements.offsets.values

@property
def ring_offset(self):
return self._get_current_features(
self._type
).elements.elements.offsets.values
return self.column().elements.elements.offsets.values

def point_indices(self):
# Return a cupy.ndarray containing the index values from the
Expand All @@ -340,27 +319,29 @@ def point_indices(self):
@property
def points(self):
"""Access the `PointsArray` of the underlying `GeoArrowBuffers`."""
return self.GeoColumnAccessor(self._column.points, self._column._meta)
return self.GeoColumnAccessor(
self._column.points, self._column._meta, Feature_Enum.POINT
)

@property
def multipoints(self):
"""Access the `MultiPointArray` of the underlying `GeoArrowBuffers`."""
return self.MultiPointGeoColumnAccessor(
self._column.mpoints, self._column._meta
self._column.mpoints, self._column._meta, Feature_Enum.MULTIPOINT
)

@property
def lines(self):
"""Access the `LineArray` of the underlying `GeoArrowBuffers`."""
return self.LineStringGeoColumnAccessor(
self._column.lines, self._column._meta
self._column.lines, self._column._meta, Feature_Enum.LINESTRING
)

@property
def polygons(self):
"""Access the `PolygonArray` of the underlying `GeoArrowBuffers`."""
return self.PolygonGeoColumnAccessor(
self._column.polygons, self._column._meta
self._column.polygons, self._column._meta, Feature_Enum.POLYGON
)

def __repr__(self):
Expand Down
17 changes: 9 additions & 8 deletions python/cuspatial/cuspatial/core/spatial/join.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,14 +214,15 @@ def quadtree_point_in_polygon(
raise ValueError(
"`polygons` Geoseries must contains only polygons geometries."
)

points_x = as_column(points.points.x)
points_y = as_column(points.points.y)

poly_offsets = as_column(polygons.polygons.part_offset)
ring_offsets = as_column(polygons.polygons.ring_offset)
poly_points_x = as_column(polygons.polygons.x)
poly_points_y = as_column(polygons.polygons.y)
points_data = points.points
points_x = as_column(points_data.x)
points_y = as_column(points_data.y)

polygon_data = polygons.polygons
poly_offsets = as_column(polygon_data.part_offset)
ring_offsets = as_column(polygon_data.ring_offset)
poly_points_x = as_column(polygon_data.x)
poly_points_y = as_column(polygon_data.y)

return DataFrame._from_data(
*spatial_join.quadtree_point_in_polygon(
Expand Down

0 comments on commit 5704129

Please sign in to comment.