GeoPandas API coverage¶
The sedona.spark.geopandas package provides a GeoPandas-style API on Apache Spark.
This reference describes Sedona 2.0.0 (development) against the GeoPandas 1.1.4 API catalog.
These counts describe the development branch and do not apply to Sedona 1.9.1.
For setup and examples, see the GeoPandas programming guide.
Import sedona.spark.geopandas instead of geopandas; the tables use upstream
API names so they can be compared directly with the GeoPandas catalog.
Coverage summary¶
91.4% API availability (160 of 175 catalogued APIs), including partial implementations.
Availability is the number of APIs marked Available / partially available divided by the total. It measures whether a named API has an implementation, not complete parameter support, identical results, or fully distributed execution. The notes below identify known restrictions.
| API group | Available / partially available | Unsupported |
|---|---|---|
| GeoSeries | 119 | 4 |
| GeoDataFrame | 26 | 7 |
| Input/output | 3 | 2 |
| Tools | 6 | 2 |
| Spatial index | 6 | 0 |
| Total | 160 | 15 |
Status definitions¶
- Available / partially available: an implementation exists, with any known parameter, result, or execution limitations described in the notes. The common differences below still apply.
- Unsupported: not implemented, raises
NotImplementedErrorwithout providing the operation, or is intentionally excluded from the distributed API.
What is counted¶
The denominator contains the unique named methods, properties, and module functions in the GeoPandas 1.1.4 reference catalogs for GeoSeries, GeoDataFrame, input/output, tools, and spatial indexing.
Each qualified name is counted once, including missing and intentionally unsupported APIs.
For example, GeoDataFrame.clip and geopandas.clip are separate catalog entries;
repeated listings of GeoSeries.boundary count only once. The GeoSeries and
GeoDataFrame class constructor entries, testing utilities, and the general pandas API
inherited through pandas-on-Spark are excluded. Alternate constructors such as
GeoDataFrame.from_features are included.
GeoSeries operations inherited by GeoDataFrame are not counted again unless the
GeoDataFrame catalog lists them explicitly. API links below open the upstream
GeoPandas reference; they describe the target interface, not Sedona's support level.
Common differences¶
- Execution and ordering: operations use Spark and generally evaluate lazily. Row order is not guaranteed unless an API explicitly preserves it. Follow pandas-on-Spark guidance for index alignment and operations across different frames.
- Geometry engines: Sedona generally uses JTS, whereas GeoPandas uses Shapely/GEOS. Geometry ordering and some algorithm results can differ. Spatial measurements are planar; use an appropriate projected CRS for distances and areas.
- Local results: plotting and some conversion methods collect distributed data to the driver. The notes identify these methods. Scalar aggregations materialize their required scalar result; constructors that start with local data distribute that input.
- Nearest joins:
sjoin_nearestsupports point inputs and inner joins. Ties follow Sedona configuration and do not guarantee GeoPandas' complete set of tied rows. See nearest point joins. - Coordinate transforms:
GeoSeries.transformruns a callable on worker batches, so a callable that depends on the whole coordinate array can produce different results. It requires Spark 3.5+ and Shapely 2+.
GeoSeries¶
| API | Status | Notes |
|---|---|---|
GeoSeries.area |
Available / partially available | — |
GeoSeries.boundary |
Available / partially available | — |
GeoSeries.bounds |
Available / partially available | — |
GeoSeries.total_bounds |
Available / partially available | Distributed aggregation returns four bounds to the driver. |
GeoSeries.length |
Available / partially available | — |
GeoSeries.geom_type |
Available / partially available | Standalone LinearRing geometries are represented as LineString. |
GeoSeries.offset_curve |
Available / partially available | Scalar distance only; join_style and mitre_limit are accepted but ignored. |
GeoSeries.distance |
Available / partially available | — |
GeoSeries.hausdorff_distance |
Available / partially available | — |
GeoSeries.frechet_distance |
Available / partially available | densify is not supported. |
GeoSeries.representative_point |
Available / partially available | — |
GeoSeries.exterior |
Available / partially available | Returns LineString rings instead of LinearRing geometries. |
GeoSeries.interiors |
Available / partially available | Interior rings are returned as LineString geometries instead of LinearRing objects. |
GeoSeries.minimum_bounding_radius |
Available / partially available | — |
GeoSeries.minimum_clearance |
Available / partially available | — |
GeoSeries.x |
Available / partially available | — |
GeoSeries.y |
Available / partially available | — |
GeoSeries.z |
Available / partially available | — |
GeoSeries.m |
Available / partially available | — |
GeoSeries.get_coordinates |
Available / partially available | — |
GeoSeries.count_coordinates |
Available / partially available | — |
GeoSeries.count_geometries |
Available / partially available | — |
GeoSeries.count_interior_rings |
Available / partially available | — |
GeoSeries.set_precision |
Unsupported | Explicit NotImplementedError stub. |
GeoSeries.get_precision |
Unsupported | Explicit NotImplementedError stub. |
GeoSeries.get_geometry |
Available / partially available | — |
GeoSeries.is_closed |
Available / partially available | Standalone LinearRing identity is lost; empty LinearRing behavior differs. |
GeoSeries.is_empty |
Available / partially available | — |
GeoSeries.is_ring |
Available / partially available | — |
GeoSeries.is_simple |
Available / partially available | — |
GeoSeries.is_valid |
Available / partially available | — |
GeoSeries.is_valid_reason |
Available / partially available | — |
GeoSeries.is_valid_coverage |
Available / partially available | Distributed validation returns a single boolean to the driver. |
GeoSeries.invalid_coverage_edges |
Available / partially available | — |
GeoSeries.has_m |
Available / partially available | — |
GeoSeries.has_z |
Available / partially available | — |
GeoSeries.is_ccw |
Available / partially available | — |
GeoSeries.contains |
Available / partially available | — |
GeoSeries.contains_properly |
Available / partially available | — |
GeoSeries.crosses |
Available / partially available | — |
GeoSeries.disjoint |
Available / partially available | — |
GeoSeries.dwithin |
Available / partially available | — |
GeoSeries.geom_equals |
Available / partially available | — |
GeoSeries.geom_equals_exact |
Available / partially available | Standalone LinearRing and matching LineString inputs cannot be distinguished. |
GeoSeries.geom_equals_identical |
Available / partially available | Comparison uses Spark storage: LinearRing identity and some empty/NaN-Z or mixed coordinate layouts cannot be distinguished. |
GeoSeries.intersects |
Available / partially available | — |
GeoSeries.overlaps |
Available / partially available | — |
GeoSeries.touches |
Available / partially available | — |
GeoSeries.within |
Available / partially available | — |
GeoSeries.covers |
Available / partially available | — |
GeoSeries.covered_by |
Available / partially available | — |
GeoSeries.relate |
Available / partially available | — |
GeoSeries.relate_pattern |
Available / partially available | — |
GeoSeries.clip_by_rect |
Available / partially available | Uses intersection with an envelope; boundary-only intersections and empty output types differ from GeoPandas rectangle clipping. |
GeoSeries.difference |
Available / partially available | GeometryCollection operands are not generally supported by the underlying difference operation. |
GeoSeries.intersection |
Available / partially available | — |
GeoSeries.symmetric_difference |
Available / partially available | — |
GeoSeries.union |
Available / partially available | — |
GeoSeries.buffer |
Available / partially available | Array/Series distances are not supported; extra keyword arguments are ignored. |
GeoSeries.centroid |
Available / partially available | — |
GeoSeries.concave_hull |
Available / partially available | — |
GeoSeries.convex_hull |
Available / partially available | — |
GeoSeries.envelope |
Available / partially available | — |
GeoSeries.extract_unique_points |
Available / partially available | — |
GeoSeries.force_2d |
Available / partially available | — |
GeoSeries.force_3d |
Available / partially available | — |
GeoSeries.make_valid |
Available / partially available | Only method='structure' is supported; the default method='linework' raises. |
GeoSeries.minimum_bounding_circle |
Available / partially available | — |
GeoSeries.maximum_inscribed_circle |
Available / partially available | — |
GeoSeries.minimum_clearance_line |
Available / partially available | — |
GeoSeries.minimum_rotated_rectangle |
Available / partially available | — |
GeoSeries.normalize |
Available / partially available | — |
GeoSeries.orient_polygons |
Available / partially available | — |
GeoSeries.remove_repeated_points |
Available / partially available | — |
GeoSeries.reverse |
Available / partially available | — |
GeoSeries.sample_points |
Available / partially available | Only method='uniform'; RNG results/state advancement differ; extra keywords are ignored. |
GeoSeries.segmentize |
Available / partially available | — |
GeoSeries.shortest_line |
Available / partially available | — |
GeoSeries.simplify |
Available / partially available | — |
GeoSeries.simplify_coverage |
Available / partially available | Spark Classic with checkpoint storage required; finite valid 2D polygon coverage only, at most 100,000 coordinates per geometry. Conservative simplification may retain extra vertices and never removes rings or parts. |
GeoSeries.snap |
Available / partially available | Array-like tolerance is not supported. |
GeoSeries.transform |
Available / partially available | Requires Spark >=3.5 and Shapely >=2.0. Callbacks run per Spark batch and must not depend on batch boundaries or mutable state. |
GeoSeries.affine_transform |
Available / partially available | — |
GeoSeries.rotate |
Available / partially available | — |
GeoSeries.scale |
Available / partially available | — |
GeoSeries.skew |
Available / partially available | — |
GeoSeries.translate |
Available / partially available | — |
GeoSeries.interpolate |
Available / partially available | — |
GeoSeries.line_merge |
Available / partially available | directed=True is not supported. |
GeoSeries.project |
Available / partially available | — |
GeoSeries.shared_paths |
Available / partially available | — |
GeoSeries.build_area |
Available / partially available | — |
GeoSeries.constrained_delaunay_triangles |
Available / partially available | — |
GeoSeries.delaunay_triangles |
Available / partially available | Computes a separate triangulation per input geometry rather than aggregating vertices across the series. |
GeoSeries.explode |
Available / partially available | — |
GeoSeries.intersection_all |
Available / partially available | Distributed aggregation returns one geometry to the driver. |
GeoSeries.polygonize |
Available / partially available | full=True is not supported. |
GeoSeries.union_all |
Available / partially available | grid_size is not supported; non-default method values are ignored with a warning. |
GeoSeries.voronoi_polygons |
Available / partially available | Computes a separate diagram per geometry; only_edges=True is not supported. |
GeoSeries.from_arrow |
Available / partially available | Converts a local Arrow array through GeoPandas before constructing the distributed series. |
GeoSeries.from_file |
Available / partially available | Supports Shapefile, GeoJSON, GeoPackage and GeoParquet; uses format/table_name options and does not implement general GeoPandas reader keywords. |
GeoSeries.from_wkb |
Available / partially available | Only on_invalid='raise' is implemented. |
GeoSeries.from_wkt |
Available / partially available | Only on_invalid='raise' is implemented. |
GeoSeries.from_xy |
Available / partially available | Additional constructor keyword arguments support name only. |
GeoSeries.to_arrow |
Available / partially available | Collects the entire series to the driver and delegates to local GeoPandas. |
GeoSeries.to_file |
Available / partially available | Writes GeoJSON or GeoParquet through Spark; schema, engine and GeoPandas metadata options are not implemented. |
GeoSeries.to_json |
Available / partially available | Collects the entire series through a GeoDataFrame and serializes with local GeoPandas. |
GeoSeries.to_wkb |
Available / partially available | Supports hex; additional Shapely serialization keyword arguments are ignored. |
GeoSeries.to_wkt |
Available / partially available | Additional Shapely formatting keyword arguments are ignored. |
GeoSeries.crs |
Available / partially available | — |
GeoSeries.set_crs |
Available / partially available | — |
GeoSeries.to_crs |
Available / partially available | — |
GeoSeries.estimate_utm_crs |
Available / partially available | Uses aggregated bounds to select a local pyproj CRS. |
GeoSeries.fillna |
Available / partially available | Distributed alignment is lazy; invalid duplicate replacement indexes raise when evaluated. limit requires global ordering. |
GeoSeries.isna |
Available / partially available | — |
GeoSeries.notna |
Available / partially available | — |
GeoSeries.clip |
Available / partially available | Rectangular masks use ST_Intersection; boundary-only results can differ from GeoPandas fast rectangle clipping. |
GeoSeries.plot |
Available / partially available | Collects the entire series to the driver and delegates to local GeoPandas plotting. |
GeoSeries.explore |
Unsupported | No GeoSeries implementation. |
GeoSeries.sindex |
Available / partially available | Returns and caches a Sedona SpatialIndex; query options and results differ from GeoPandas (see Spatial index below). |
GeoSeries.has_sindex |
Available / partially available | — |
GeoSeries.cx |
Available / partially available | — |
GeoSeries.__geo_interface__ |
Unsupported | Intentionally excluded by the distributed API plan (issue #2230). |
GeoDataFrame¶
| API | Status | Notes |
|---|---|---|
GeoDataFrame.from_file |
Available / partially available | Reads Shapefile, GeoJSON, GeoPackage, and GeoParquet; GeoPandas reader options are unsupported and directory formats must be explicit. |
GeoDataFrame.from_features |
Available / partially available | Builds small local feature collections through GeoPandas before distributing them; properties follow Spark schema inference. |
GeoDataFrame.from_postgis |
Unsupported | Stub raises NotImplementedError. |
GeoDataFrame.from_arrow |
Available / partially available | Converts local GeoArrow input through GeoPandas; to_pandas_kwargs requires GeoPandas 1.1 or newer. |
GeoDataFrame.to_file |
Available / partially available | Writes GeoJSON and GeoParquet through Spark; GeoPackage output, schema, engine, and GeoPandas metadata options are unsupported. |
GeoDataFrame.to_json |
Available / partially available | Collects the distributed frame to the driver and delegates to GeoPandas. |
GeoDataFrame.to_geo_dict |
Unsupported | Intentionally unsupported local feature-collection interface for distributed data; current stub raises NotImplementedError. |
GeoDataFrame.to_parquet |
Available / partially available | Uses the Sedona GeoParquet writer and Spark options; GeoPandas/PyArrow writer-option parity is not provided. |
GeoDataFrame.to_arrow |
Available / partially available | Collects the distributed frame to the driver and delegates to GeoPandas; index=None includes the distributed index. |
GeoDataFrame.to_feather |
Unsupported | Stub raises NotImplementedError. |
GeoDataFrame.to_postgis |
Unsupported | No GeoDataFrame implementation is present. |
GeoDataFrame.to_wkb |
Available / partially available | Distributed binary and hexadecimal output work; Shapely serialization keyword options are rejected. |
GeoDataFrame.to_wkt |
Available / partially available | Distributed output works; Shapely formatting keywords are rejected and stored precision is retained rather than default six-place rounding. |
GeoDataFrame.crs |
Available / partially available | Delegates CRS metadata access to the active geometry column. |
GeoDataFrame.set_crs |
Available / partially available | Assigns or removes active-column CRS metadata, including epsg, inplace, and allow_override. |
GeoDataFrame.to_crs |
Available / partially available | Transforms the active geometry column; supports crs, epsg, and inplace. |
GeoDataFrame.estimate_utm_crs |
Available / partially available | Uses a distributed bounds aggregation; only four aggregate values reach the driver. |
GeoDataFrame.rename_geometry |
Available / partially available | Renames the active geometry column, with inplace support. |
GeoDataFrame.set_geometry |
Available / partially available | Existing-column drop=True is rejected; array-like and column selection otherwise work. |
GeoDataFrame.active_geometry_name |
Available / partially available | Returns the active geometry column label, or None. |
GeoDataFrame.dissolve |
Available / partially available | Unary union only, without grid_size; supported aggregate aliases and grouping forms are restricted, and unobserved categorical groups and MultiIndex columns are unsupported. |
GeoDataFrame.explode |
Available / partially available | Distributed geometry-part expansion supports column, ignore_index, and index_parts; non-geometry columns delegate to pandas-on-Spark. |
GeoDataFrame.sjoin |
Available / partially available | Contains-properly is unavailable; dwithin requires scalar distance; right joins retain left geometries and row order is not preserved. |
GeoDataFrame.sjoin_nearest |
Available / partially available | Point-only inner joins, default suffixes, exclusive=False, flat string columns, and single-level indexes; KNN tie behavior can omit equidistant or coincident rows. |
GeoDataFrame.clip |
Available / partially available | Rectangular masks use ST_Intersection; boundary-only results can differ from GeoPandas fast rectangle clipping. |
GeoDataFrame.overlay |
Available / partially available | All five modes are distributed; MultiIndex columns are unsupported, and keep_geom_type=None omits the conditional dropped-geometry warning. |
GeoDataFrame.explore |
Unsupported | No GeoDataFrame implementation is present. |
GeoDataFrame.plot |
Available / partially available | Collects the distributed frame to the driver and delegates to GeoPandas. |
GeoDataFrame.sindex |
Available / partially available | Returns a Sedona spatial index with different query results and options; the GeoDataFrame does not retain the index cache. |
GeoDataFrame.has_sindex |
Available / partially available | GeoDataFrame spatial-index state is not retained; use a retained active GeoSeries for cache state. |
GeoDataFrame.cx |
Available / partially available | Distributed coordinate bounding-box selection supports open, reversed, and inclusive slice bounds. |
GeoDataFrame.__geo_interface__ |
Unsupported | Intentionally unsupported local feature-collection interface for distributed data; current stub raises NotImplementedError. |
GeoDataFrame.iterfeatures |
Unsupported | Intentionally unsupported row iterator for distributed data; current stub raises NotImplementedError. |
Input/output¶
| API | Status | Notes |
|---|---|---|
geopandas.list_layers |
Available / partially available | GeoPackage only; string/path-like inputs only. Reads layer metadata through Spark and collects the small layer listing to pandas. |
geopandas.read_file |
Available / partially available | Reads Shapefile, GeoJSON, GeoPackage and GeoParquet only. GeoPandas bbox/mask/columns/rows/engine options are warned about and ignored; GeoPackage requires table_name rather than layer. |
geopandas.read_postgis |
Unsupported | No implementation or public export in sedona.spark.geopandas. |
geopandas.read_feather |
Unsupported | No implementation or public export in sedona.spark.geopandas. |
geopandas.read_parquet |
Available / partially available | Reads GeoParquet through Spark. The columns, storage_options, bbox and to_pandas_kwargs parameters are accepted but silently ignored (no warning); column selection and bbox filtering are not applied. Extra kwargs trigger a warning. |
Tools¶
| API | Status | Notes |
|---|---|---|
geopandas.sjoin |
Available / partially available | Contains-properly is unavailable; dwithin requires scalar distance; right joins retain left geometries and row order is not preserved. |
geopandas.sjoin_nearest |
Available / partially available | Point-only inner joins with exclusive=False, default suffixes, flat unique string columns and single-level indexes. All equidistant rows are not guaranteed; max_distance filters results after the KNN search. |
geopandas.overlay |
Available / partially available | All five overlay modes are implemented natively; MultiIndex columns are explicitly unsupported. keep_geom_type=None does not emit the conditional dropped-geometry warning. |
geopandas.clip |
Available / partially available | Rectangular masks use ST_Intersection; boundary-only results can differ from GeoPandas fast rectangle clipping. |
geopandas.tools.geocode |
Unsupported | No geocode implementation or tools export. |
geopandas.tools.reverse_geocode |
Unsupported | No reverse_geocode implementation or tools export. |
geopandas.tools.collect |
Available / partially available | Distributed inputs use ST_Collect_Agg and materialize only the metadata and one scalar geometry required by the API; local inputs delegate to GeoPandas. |
geopandas.points_from_xy |
Available / partially available | Constructs 2D/3D points with CRS through native expressions, but returns a distributed GeoSeries instead of upstream GeometryArray. Distributed coordinate Series must share a frame and index. |
Spatial index¶
| API | Status | Notes |
|---|---|---|
SpatialIndex.intersection |
Available / partially available | Bounding-box wrapper; a distributed index collects matching geometry objects to the driver instead of returning positional indices. Bounds are required as four coordinates. |
SpatialIndex.is_empty |
Available / partially available | Checks whether the input row count is zero; an input containing only null or empty geometries reports False, unlike the upstream index. |
SpatialIndex.nearest |
Available / partially available | Scalar Shapely input only with a Sedona k argument; no return_all, max_distance or exclusive arguments. Distributed results are collected geometry objects rather than the upstream index-pair array. |
SpatialIndex.query |
Available / partially available | Scalar Shapely input only; predicates limited to None/intersects/contains, without distance or output_format arguments. Distributed results are collected geometry objects; the local intersects path queries bounding boxes. |
SpatialIndex.size |
Available / partially available | Counts input rows, including null and empty geometries; upstream counts actual indexed geometries. |
SpatialIndex.valid_query_predicates |
Available / partially available | Returns a fresh set containing only None, intersects and contains, reflecting the narrower query implementation. |
Maintaining this reference¶
When API support changes, update its status and notes, recalculate the category and overall counts, and update the percentage in the repository README badge. Keep the upstream baseline version fixed unless the entire catalog is refreshed. Adding a stub does not increase availability, and adding one supported parameter does not make an API fully compatible. The GeoPandas implementation tracker records ongoing work; this page records the implementation available in the version above.