Repository metrics
- Stars
- (1,953 stars)
- PR merge metrics
- (Avg merge 1d 3h) (35 merged PRs in 30d)
Description
This is an umbrella issue that will encompass many other issues for implementing additional geopandas functionality.
Setup:
- Read the Sedona Geopandas developer guide
- Setup build environment by following these compile docs
Implementation Steps
- Pick a
GeoSeriesfunction to implement from the (subset) list below or from the full list in the original documentation. - Look for a similar function that has been implemented in Sedona Geopandas already - Chances are, you'll just need to use one of the helper functions
_query_geometry_columnor_row_wise_operations - Implement function in
geoseries.pyandbase.py. Usually, this is as simple as calling the corresponding Sedona function (e.gST_IsRingfor.is_ring(). Thebase.pypart is important so geodataframe can also execute it. - Add documentation under the
base.pyimplementation by copy and pasting from geopandas docstrings. - Add tests to
test_geoseries.pyandtest_match_geopandas_series.pyfollowing similar conventions.
- In
test_geoseries.py, include the example in the docstring as part of the test. - For
test_match_geopandas_series.py, follow the convention of similar functions. Most of the time, you just run the function on each of theself.geomsand compare output with geopandas using the helper functions.
- Create a new issue on GitHub. Either create a subissue of this [EPIC] issue or explicitly mention this issue. Then, submit a PR linked to the issue you just created (not this issue). Reference this epic as
Part of #2230; do not useCloses #2230for partial work. Go ahead and CC @petern48 on your PR too, so I can review - Repeat!
Note about AI use: I have zero problem with contributors using AI to help them write their code faster. HOWEVER, I strongly urge you to at least run your code and tests locally on your laptop, you're not going to have a good time trying to iterate on failed CI runs. If you need help fixing your code to pass the tests, it's fine to ask for help. But if you constantly are blindly pushing changes an LLM told you and waiting for CI to tell you if your code is correct, you will be putting an annoying pain on reviewers, since we need to manually approve your CI to run after each change. I also recommend you learn to do your first one on your own, by following an example PR or implementation. It should be fairly easy to figure out.
Example PR: https://github.com/apache/sedona/pull/2232
List of unimplemented functions along with existing functions to model their implementations off of:
Unary predicates (boolean operations): model off of is_empty
- is_ring
- is_ccw (nontrivial; tracked in #2385)
- is_closed
Binary predicates
- relate (ST_Relate)
- relate_pattern (non-trivial)
Set theoretic methods: model off of difference
- symmetric_difference (use ST_SymDifference)
- union (use ST_Union)
- clip_by_rect (#2784)
Aggregations (model off of union_all)
- intersection_all (ST_Intersection_Aggr)
- voronoi_polygons (ST_VoronoiPolygons)
- polygonize (ST_Polygonize)
- delaunay_triangles (ST_DelaunayTriangles)
- build_area (ST_BuildArea)
- explode
- dissolve
Other
- convex_hull (ST_ConvexHull)
- concave_hull (ST_ConcaveHull)
- force_2d (ST_Force_2D)
- force_3d (ST_Force3D)
- frechet_distance (ST_FrechetDistance)
- hausdorff_distance (ST_HausdorffDistance)
- minimum_bounding_circle (ST_MinimumBoundingCircle)
- minimum_bounding_radius (ST_MinimumBoundingRadius)
Joins (model off of sjoin)
- sjoin_nearest (deferred; see Deferred infrastructure projects below)
This doesn't include everything. It's also possible I misgrouped a few functions, but here's a good starting list. Ping me when you we need to add more to the list.
Additional unimplemented functions
Binary predicates (additional): model off of contains
- geom_equals
- geom_equals_exact
- disjoint
- contains_properly
General methods and attributes
- count_coordinates
- count_geometries
- count_interior_rings
- get_coordinates
- get_precision (deferred; see Deferred infrastructure projects below)
- set_precision (deferred; see Deferred infrastructure projects below)
- interiors
- exterior
- representative_point
- offset_curve (#2828)
Constructive methods and attributes
- shortest_line (#2828)
- sample_points
- reverse
- remove_repeated_points
- normalize
- minimum_rotated_rectangle
- minimum_clearance
- extract_unique_points
- transform
Linestring operations
- shared_paths (#2800)
- project
- line_merge
- interpolate
Affine transformations
- affine_transform (#3135)
- rotate (#3018)
- scale (#3145)
- skew (#3148)
- translate (tracked in #3051)
Overlay operations
- GeoDataFrame.overlay
- GeoDataFrame.clip
- GeoSeries.clip
Plotting
- GeoDataFrame.plot (#2193)
- GeoDataFrame.explore
- GeoSeries.plot (#2193)
- GeoSeries.explore
Indexing
- GeoDataFrame.cx
- GeoSeries.cx
Tools (top-level functions)
- geopandas.points_from_xy
- geopandas.tools.collect
- geopandas.tools.geocode
- geopandas.tools.reverse_geocode
- geopandas.clip
- geopandas.overlay
Serialization / IO / conversion
- GeoDataFrame.to_postgis
- GeoDataFrame.to_feather
- GeoDataFrame.from_postgis
- GeoDataFrame.from_features
Deferred infrastructure projects
These APIs remain unimplemented until the required distributed engine infrastructure is designed and reviewed. They should not be approximated with driver collection, Python UDFs, or session-wide configuration changes.
sjoin_nearest: requires per-call KNN tie handling and exclusion before nearest-neighbor selection; tracked in #3182 and draft PR #3184.get_precisionandset_precision: require persistent per-geometry precision metadata in Sedona serialization/UDTs, native arbitrary-grid and mode support, and precision propagation across operations.
Intentionally unsupported for distributed execution
These APIs return or iterate Python feature objects on the driver and are not planned while Sedona requires scalable distributed execution. Revisit them only if a distributed-compatible contract becomes available. See #3132 for the decision.
GeoDataFrame.iterfeaturesGeoDataFrame.to_geo_dictGeoDataFrame.__geo_interface__GeoSeries.__geo_interface__
For anyone interested, here's the epic for initial Geopandas Support, which links to all of the rest of the PRs: https://github.com/apache/sedona/issues/2001