HERE Technologies and Wherobots announce partnership Learn More

Comparison

SedonaDB vs. DuckDB for spatial SQL on one machine

SedonaDB and DuckDB both run spatial SQL on one machine. SedonaDB adds a geography type, coordinate reference system (CRS) checks before a query runs, spatial joins that spill to disk and raster functions. DuckDB adds spatial SQL to a general-purpose embedded database.

Single-node engines

Both run in process on one machine.

Spatial and KNN joins

SedonaDB joins spill to disk.

Raster and vector

SedonaDB reads rasters in SQL.

Feature comparison

SedonaDB and DuckDB side by side

Each answer comes from the project’s own documentation, release posts or repository, linked below the table. SedonaDB 0.5.0 and DuckDB 1.5.6 are the current releases.

SedonaDB and DuckDB side by side
Capability Apache Sedona SedonaDB Single-node spatial engine in Rust, on Apache Arrow and DataFusion. Embedded database DuckDB In-process analytical database with the spatial extension.
Engine and license
Query engine What runs the SQL Built on Apache DataFusion (Rust); general-purpose SQL works alongside spatial functions DuckDB's own columnar-vectorized engine; spatial through the spatial extension
Execution model Single node, written in Rust on Apache Arrow and Apache DataFusion In process, embedded in the host application
License Apache License 2.0, an Apache Software Foundation project MIT, held by the DuckDB Foundation
APIs SQL, Python (apache-sedona[db]), R and Rust SQL, Python, R, Rust, CLI, and clients for C, Java, Go, Node.js and Wasm
Spatial types and functions
Geometry type Included: Geometry Included: GEOMETRY, a built-in type since 1.5
Geography type Calculations on the sphere or spheroid Included: Geography, built on s2geography since 0.4.0 Partial: No geography type; _Spheroid functions such as ST_Distance_Spheroid
Spatial functions Included: 212 functions in the SQL reference (141 ST_, 67 RS_), compatible with SedonaSpark Included: 158 functions in the spatial function index, including aggregate and table functions
Coordinate reference system Included: CRS carried in the column type and read from Parquet; mismatched CRSs fail at planning Included: Optional CRS in the GEOMETRY type since 1.5; functions check that inputs share a CRS
Raster data Raster functions in SQL Included: RS_ functions since 0.3.0, including RS_ZonalStats and RS_Clip Not included: Raster formats are not supported
Raster and vector in one query Statistics of raster pixels inside vector polygons Included: RS_ZonalStats over polygons in SQL Not included: No raster support
Spatial joins
Spatial join Included: Spatial index join with automatic disk spilling for larger-than-memory joins Included: In-memory R-tree join; the right side must fit in memory
KNN join Find the k nearest features to each record Included: ST_KNN in the join condition Not included: Not documented
GPU acceleration Included: Optional GPU spatial join since 0.4 Not included: Not documented
Data formats
GeoParquet Included: Read, and write GeoParquet 1.1 Included: Read and write
Parquet geometry and geography types Included: Write since 0.4.0 Not included: Not documented
GeoArrow Included: GeoArrow integration Included: Arrow import and export since 1.5
GDAL vector formats Shapefile, GeoPackage, FlatGeobuf and more Included: Read and write through GDAL/OGR Included: ST_Read and COPY through GDAL
Remote files Included: S3 and HTTPS Included: S3 read and write, HTTP(S) read

Sources: Apache DataFusion; DuckDB Why DuckDB; SedonaDB repository, documentation, CRS examples, SQL joins and release posts for 0.3.0, 0.4.0 and 0.5.0; DuckDB why DuckDB, GEOMETRY type, spatial functions, GDAL integration, spatial joins, DuckDB 1.5.0 and httpfs. Checked October 2026. “Not documented” means the project’s documentation does not describe the capability.

SpatialBench

SpatialBench results on one machine

The Apache Sedona project published these SpatialBench single-node results from a run on September 22, 2025. The run used SpatialBench v0.1.0, SedonaDB 0.1.0 and DuckDB 1.4.0 on an AWS EC2 m7i.2xlarge with 8 CPUs and 32 GB of RAM. Each query had a 1,200-second timeout. Times are in seconds at scale factor 10 and include loading data from Parquet. Both engines have shipped newer releases since.

SpatialBench results on one machine
Capability Apache Sedona SedonaDB 0.1.0 Embedded database DuckDB 1.4.0
Scale factor 10
Queries completed 12 queries Included: 12 of 12 Partial: 9 of 12
Q1 distance filter ST_DWithin 3.04 4.58
Q2 point-in-polygon filter 8.89 8.26
Q5 convex hull aggregation 50.81 14.40
Q9 building self-join Intersection over union 0.38 942.98
Q10 spatial left join 42.02 Not included: Error
Q11 multi-way spatial join 97.52 Not included: Error
Q12 KNN join 145.66 Not included: Error

Source: SpatialBench single-node benchmarks, which lists all 12 queries at scale factors 1 and 10, plus GeoPandas. SpatialBench comes from the Apache Sedona project, and SedonaDB is an Apache Sedona engine; the benchmark code is open at apache/sedona-spatialbench for anyone to rerun.

Function reference

Every spatial SQL function in SedonaDB and DuckDB

Search 280 spatial SQL functions from the SedonaDB SQL reference and the DuckDB spatial function index, filter by vector or raster, and see which engine has each one. Functions match by name, and the same operation can have a different name in each engine, such as ST_GeomFromWKT in SedonaDB and ST_GeomFromText in DuckDB.

Function Category SedonaDB DuckDB What it does
DuckDB_PROJ_Compiled_Version Engine Utilities Not available Available Returns a text description of the PROJ library version that this instance of DuckDB was compiled against.
DuckDB_Proj_Version Engine Utilities Not available Available Returns a text description of the PROJ library version that is being used by this instance of DuckDB.
RS_AsGeoTiff Output Available Not available Encodes a raster as a GeoTIFF and returns the bytes as binary, with optional compression and tiling.
RS_AsRaster Operators Available Not available Rasterizes a geometry using the grid of a reference raster.
RS_BandIsNoData Band Accessors Available Not available Returns true if every pixel of the band holds the band’s nodata value. Returns false if any pixel holds data, or if the band has no nodata value.
RS_BandNoDataValue Band Accessors Available Not available Returns the nodata value of the specified band as a double. Returns null if the band has no nodata value defined.
RS_BandPath Raster Accessors Available Not available Retrieves the file path of an out-of-database (out-db) raster band, returning the external raster file location referenced by the raster.
RS_BandPixelType Band Accessors Available Not available Returns the pixel data type of the specified band as a string.
RS_BandToDim Raster Functions Available Not available Collapses all bands into a single band with a new dimension.
RS_Clip Operators Available Not available Clips a raster to a geometry, setting pixels outside the geometry to nodata and (by default) cropping to the geometry’s bounding box.
RS_Contains Predicates / Topological Relationships Available Not available Returns true if the first argument’s extent contains the second.
RS_ConvexHull Raster Geometry Functions Available Not available Returns the convex hull geometry of a raster.
RS_CRS Operators Available Not available Returns the CRS string for a raster.
RS_DimNames Raster Functions Available Not available Returns the ordered list of dimension names for a raster band.
RS_DimSize Raster Functions Available Not available Returns the size of a named dimension in a raster band.
RS_DimToBand Raster Functions Available Not available Promotes a within-band dimension into separate bands.
RS_Envelope Raster Geometry Functions Available Not available Returns the envelope (bounding box) of a raster as a geometry.
RS_Example Raster Functions Available Not available Creates a simple example raster for testing and demos.
RS_FromGDALRaster Raster Functions Available Not available Decodes a GDAL-readable raster (e.g. a GeoTIFF) from binary content into an in-database raster.
RS_FromPath Raster Constructors Available Not available Creates an out-of-database raster from a raster file path.
RS_GeoReference Raster Accessors Available Not available Returns the georeference metadata of raster as a string in GDAL or ESRI format as commonly seen in a world file. Default is GDAL if not specified. Both formats output six lines: scalex, skewy, skewx, scaley, upperleftx, upperlefty. In GDAL format the upper-left coordinates refer to the corner of the upper-left pixel, while in ESRI format they are shifted to the center of the upper-left pixel.
RS_GeoTransform Raster Accessors Available Not available Returns the raster’s geotransform decomposed into a struct of six doubles, matching Sedona Spark’s RS_GeoTransform: magnitudeI and magnitudeJ (pixel sizes along the transformed i and j axes), thetaI (rotation of the raster in radians, positive clockwise), thetaIJ (angle from the transformed i axis to the transformed j axis in radians, positive counter-clockwise), and offsetX and offsetY (the upper-left corner of the upper-left pixel). For the raw affine coefficients instead of this decomposition, use the individual accessors (RS_ScaleX, RS_SkewX, RS_UpperLeftX, …) or RS_GeoReference.
RS_Height Raster Accessors Available Not available Returns the height of a raster in pixels.
RS_Intersects Predicates / Topological Relationships Available Not available Returns true if the extents of the two arguments intersect.
RS_IsEmpty Raster Functions Available Not available Returns true when the raster has zero visible volume — some dimension has length 0, so it holds no cells. This is visible-volume emptiness, not byte-emptiness: a lazy raster whose pixels are resolved on demand carries no bytes but is not empty.
RS_MakeEmptyRaster Raster Constructors Available Not available Creates an in-database raster from a grid definition: a pixel count, a placement (an extent geometry, or an upper-left corner with pixel size or a full affine transform), and a number of zero-filled bands. Use it to define a target grid for RS_AsRaster or as a template for other rasters.
RS_MetaData Operators Available Not available Returns raster metadata as a struct.
RS_MinConvexHull Raster Geometry Functions Available Not available Returns the footprint of the raster’s data pixels: the polygon over the smallest pixel-aligned rectangle of the grid that holds every pixel not equal to its band’s nodata value. Returns null if no pixel holds data.
RS_NumBands Operators Available Not available Returns the number of bands in the raster.
RS_NumDimensions Raster Functions Available Not available Returns the number of dimensions in a raster band.
RS_PixelAsCentroid Pixel Functions Available Not available Returns the centroid of the specified pixel as a Point geometry.
RS_PixelAsPoint Pixel Functions Available Not available Returns the upper-left corner of the specified pixel as a Point geometry.
RS_PixelAsPolygon Pixel Functions Available Not available Returns the bounding polygon of the specified pixel.
RS_Polygonize Pixel Functions Available Not available Converts a raster band into polygons grouped by connected pixel value regions.
RS_RasterToWorldCoord Raster Accessors Available Not available Converts raster pixel coordinates to world coordinates as a point.
RS_RasterToWorldCoordX Raster Accessors Available Not available Converts raster pixel coordinates to world X coordinate.
RS_RasterToWorldCoordY Raster Accessors Available Not available Converts raster pixel coordinates to world Y coordinate.
RS_ReplaceBandNoDataValue Raster Functions Available Not available Moves a band’s nodata value to a new value, carrying the nodata pixels with it: every pixel that reads as nodata is rewritten to the new value, which then becomes the band’s nodata, so the same pixels read as nodata before and after.
RS_ReprojectMatch Operators Available Not available Reprojects a raster onto a reference raster’s CRS, grid, and extent.
RS_Resample Operators Available Not available Resamples a raster onto a new pixel grid — a new width/height, a new pixel size, and/or a snapped origin — in the same CRS.
RS_Rotation Raster Accessors Available Not available Returns the raster rotation in radians based on skew parameters.
RS_ScaleX Raster Accessors Available Not available Returns the pixel width (scale X) of a raster.
RS_ScaleY Raster Accessors Available Not available Returns the pixel height (scale Y) of a raster.
RS_SetBandNoDataValue Operators Available Not available Sets the nodata value of the specified band, packing the value into the band’s native data type. A null raster or band yields a null raster; a null nodata value instead clears the addressed band’s nodata. This is metadata-only: raster cell values are not modified.
RS_SetCRS Operators Available Not available Sets the Coordinate Reference System (CRS) for a raster.
RS_SetGeoReference Operators Available Not available Sets the affine geotransform of a raster from a world-file georeference string of six whitespace-separated numbers in the order scalex, skewy, skewx, scaley, upperleftx, upperlefty — the same order RS_GeoReference emits. The format is ‘GDAL’ (default) or ‘ESRI’; in GDAL the upper-left coordinates refer to the corner of the upper-left pixel, while in ESRI they refer to its center. The transform can also be given as six numeric arguments instead of a string, always as GDAL/corner coordinates. This is metadata-only: raster cell values are not resampled.
RS_SetSRID Operators Available Not available Sets the SRID (spatial reference identifier) for a raster.
RS_SetValue Operators Available Not available Returns the raster with one pixel of a band set to a new value.
RS_Shape Raster Functions Available Not available Returns the shape (size of each dimension) of a raster band.
RS_SkewX Raster Accessors Available Not available Returns the X skew (rotation) parameter of a raster.

Check marks link to each engine’s documentation for the function. Sources: the SedonaDB SQL reference and the DuckDB spatial function index, checked October 2026.

Which engine fits your work

Spatial filters inside an application

DuckDB fits teams that already embed DuckDB and need point-in-polygon and distance filters on data that fits on one machine, from any of its language clients.

Spatial joins, geography and rasters on one machine

SedonaDB fits spatial joins and k-nearest-neighbor (KNN) joins larger than memory, calculations on the sphere, columns that must keep their CRS, and raster statistics inside polygons. It runs from SQL, Python, R or Rust. The same engine runs the non-spatial joins, aggregations and window functions in the pipeline, through Apache DataFusion.

Workloads larger than one machine

SedonaDB functions are compatible with SedonaSpark, so the same spatial SQL moves to a cluster. Wherobots Cloud runs it fully managed, with 389 spatial SQL functions and RasterFlow. See the Wherobots vs. Apache Sedona comparison.

SedonaDB vs. DuckDB FAQ

What is SedonaDB?

SedonaDB is a single-node analytical engine from the Apache Sedona project, written in Rust on Apache Arrow and Apache DataFusion, with geometry and geography as core types. It is free under the Apache License 2.0 and installs with pip install "apache-sedona[db]".

Can SedonaDB run regular SQL, not just spatial queries?

Yes. SedonaDB is built on Apache DataFusion, a general-purpose SQL query engine written in Rust, so joins, aggregations and window functions run in the same queries as spatial functions. See the SedonaDB documentation and the DataFusion SQL reference.

Does DuckDB support spatial data?

Yes. GEOMETRY is a built-in DuckDB type since version 1.5, and the spatial extension adds ST_ functions, an R-tree index and GDAL vector file formats. It does not read raster formats.

Which is faster for spatial joins, SedonaDB or DuckDB?

In the published SpatialBench run at scale factor 10, SedonaDB 0.1.0 completed all 12 queries. DuckDB 1.4.0 returned errors on the spatial left join, the multi-way join and the KNN join. DuckDB was faster on the convex hull aggregation. Both engines have released newer versions since that run.

Can SedonaDB and DuckDB read GeoParquet?

Yes. Both read and write GeoParquet, and SedonaDB also writes the native Parquet geometry and geography types.

When does a single-node engine stop being enough?

When the data or a join outgrows one machine, a distributed engine splits the work across a cluster. SedonaDB functions are compatible with SedonaSpark, and WherobotsDB runs the same spatial SQL fully managed in Wherobots Cloud. See what a spatial join is.

Who builds SedonaDB?

SedonaDB is part of Apache Sedona, an Apache Software Foundation project. Engineers at Wherobots, founded by the original creators of Apache Sedona, contribute to it alongside the Sedona community.