You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is an umbrella issue that will encompass many other issues for implementing additional geopandas functionality.
Coverage and remaining work
The coverage snapshot in #3400 (Sedona 2.0.0 development, compared with the GeoPandas 1.1.4 catalog) is 160 of 175 APIs available or partially available (91.4%). See the GeoPandas API coverage reference for the complete inventory, counting rules, and per-API limitations.
Checked items below mean an implementation is available, possibly with limitations; they do not imply complete parameter or behavioral parity. The remaining unimplemented API entries and the intentionally unsupported interfaces are listed below. This epic remains open for that work and for extending partial implementations.
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_column or _row_wise_operations
Implement function in geoseries.py and base.py. Usually, this is as simple as calling the corresponding Sedona function (e.g ST_IsRing for .is_ring(). The base.py part is important so geodataframe can also execute it.
Add documentation under the base.py implementation by copy and pasting from geopandas docstrings.
Add tests to test_geoseries.py and test_match_geopandas_series.py following 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 the self.geoms and 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 use Closes #2230 for 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.
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 API checklist
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)
sjoin_nearest is implemented by [GH-3182] GeoPandas: Add point-only inner sjoin_nearest #3184 for point-only inner joins, with distance_col and an optional max_distance result filter. It uses the existing Sedona KNN tie configuration, which does not guarantee every equidistant or coincident row. Non-point geometries, left/right joins, exclusive matching, custom suffixes, and complete GeoPandas tie semantics remain outside this initial scope.
Other implemented APIs also have parameter, result, or execution limitations. Consult the coverage reference before choosing follow-up work.
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.
get_precision and set_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.iterfeatures
GeoDataFrame.to_geo_dict
GeoDataFrame.__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: #2001
This is an umbrella issue that will encompass many other issues for implementing additional geopandas functionality.
Coverage and remaining work
The coverage snapshot in #3400 (Sedona 2.0.0 development, compared with the GeoPandas 1.1.4 catalog) is 160 of 175 APIs available or partially available (91.4%). See the GeoPandas API coverage reference for the complete inventory, counting rules, and per-API limitations.
Checked items below mean an implementation is available, possibly with limitations; they do not imply complete parameter or behavioral parity. The remaining unimplemented API entries and the intentionally unsupported interfaces are listed below. This epic remains open for that work and for extending partial implementations.
Setup:
Implementation Steps
GeoSeriesfunction to implement from the (subset) list below or from the full list in the original documentation._query_geometry_columnor_row_wise_operationsgeoseries.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.base.pyimplementation by copy and pasting from geopandas docstrings.test_geoseries.pyandtest_match_geopandas_series.pyfollowing similar conventions.test_geoseries.py, include the example in the docstring as part of the test.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.Part of #2230; do not useCloses #2230for partial work. Go ahead and CC @petern48 on your PR too, so I can reviewNote 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: #2232
Implementation checklist (not exhaustive), with existing functions to model implementations on:
Unary predicates (boolean operations): model off of
is_emptyis_ccw#2385)Binary predicates
Set theoretic methods: model off of
differenceAggregations (model off of
union_all)Other
Joins (model off of
sjoin)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 API checklist
Binary predicates (additional): model off of
containsGeneral methods and attributes
Constructive methods and attributes
Linestring operations
Affine transformations
Overlay operations
Plotting
plot()for GeoDataFrame and GeoSeries +read_parquet#2193)plot()for GeoDataFrame and GeoSeries +read_parquet#2193)Indexing
Tools (top-level functions)
Serialization / IO / conversion
Partial implementations and remaining scope
sjoin_nearestis implemented by [GH-3182] GeoPandas: Add point-only inner sjoin_nearest #3184 for point-only inner joins, withdistance_coland an optionalmax_distanceresult filter. It uses the existing Sedona KNN tie configuration, which does not guarantee every equidistant or coincident row. Non-point geometries, left/right joins, exclusive matching, custom suffixes, and complete GeoPandas tie semantics remain outside this initial scope.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.
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: #2001