A Rust implementation of the GeoArrow specification and bindings to GeoRust algorithms for efficient spatial operations on GeoArrow memory.
This repository also includes Python bindings and JavaScript (WebAssembly) bindings, wrapping the GeoArrow memory layout and offering vectorized geometry operations.
May 7, 2025
The geoarrow-rs
project is about 3 years old. Early prototyping started inside the geopolars
repo before deciding I needed something more general (not tied to Polars) and creating first geopolars/geoarrow
and then lastly geoarrow/geoarrow-rs
.
However despite its age, the geoarrow
crate suffers from a couple issues. For one, it took a while to figure out the right abstractions. And learning Rust at the same time didn't help. The geoarrow
crate is also too monolithic. Some parts of geoarrow
are production ready, but there's decidedly a lot of code in geoarrow
that is not production ready. And it's very much not clear which parts of geoarrow
are production ready or not.
But I think geoarrow-rs
has potential to form part of the core geospatial data engineering stack in Rust. And as part of that, we need a better delineation of which parts of the code are stable or not. As such, the geoarrow-rs
repo is currently ongoing a large refactor from a single crate to a monorepo of smaller crates, each with a more well-defined scope.
As of May 2025, avoid using the geoarrow
crate and instead use the newer crates with a smaller scope, like geoarrow-array
.
These smaller crates are designed to mimic the upstream arrow
crates as much as possible.
geoarrow-schema
: Pretty stablegeoarrow-array
: Pretty stablegeoarrow-cast
: Pretty stablegeoarrow-flatgeobuf
: Somewhat stable.geoarrow-geoparquet
: Somewhat stable. A decently large refactor is expected in #1089.- Other Rust crates: unstable
- Python bindings: unstable
- JS bindings: unstable
- Prototyping GeoRust + GeoArrow in WebAssembly gives an early preview of the JavaScript API.
- GeoArrow and GeoParquet in deck.gl gives an overview of what GeoArrow's memory layout looks like under the hood, even though it's focused on how to render the data on a map.
- Thoughts on GEOS in WebAssembly introduces why I think GeoRust + GeoArrow on the web has significant potential.
- Zero-copy Apache Arrow with WebAssembly explains how the JavaScript bindings are able to move memory between JavaScript and WebAssembly so efficiently.