Releases: geoarrow/geoarrow-rs
py-v0.5.1
What's Changed
- ci: Build Python 3.13 wheels on Windows by @kylebarron in #1305
- chore: Prepare Python 0.5.1 release by @kylebarron in #1306
Full Changelog: py-v0.5.0...py-v0.5.1
rust-v0.5.0
Refer to CHANGELOG
files in individual crates for cleaner summaries.
What's Changed
- feat(geoarrow): Create geoarrow amalgam crate by @kylebarron in #1226
- feat(geoarrow-geo): add intersects function by @kylebarron in #1227
- feat(geodatafusion): ST_CoordDim and ST_NDims UDFs by @kylebarron in #1228
- feat(geoarrow-array): Pass down arbitrary parameters in
downcast_geoarrow_array
by @kylebarron in #1230 - feat(geodatafusion): ST_Area by @kylebarron in #1229
- feat(geodatafusion): ST_Centroid by @kylebarron in #1231
- feat(geodatafusion): Add
ST_Intersects
by @kylebarron in #1232 - feat(geodatafusion): Implement topological relationships by @kylebarron in #1233
- feat(geodatafusion): Add
ST_X
,ST_Y
,ST_Z
, andST_M
functions by @kylebarron in #1234 - feat(flatgeobuf): Restore the
FlatGeobuf
reader by @kylebarron in #1057 - feat: contains fn by @nuts-rice in #1235
- feat(geodatafusion): Allow loading WKB from BinaryView columns by @ianthetechie in #1239
- fix(geoarrow-geo): Fix compilation error when converting geo-traits to
geo
geometries by @kylebarron in #1241 - feat(geodatafusion): Allow loading WKT from StringView columns by @kylebarron in #1242
- feat(geodatafusion): Add ST_Distance by @kylebarron in #1243
- docs: Note conventional commits for PRs in the contributing doc by @ianthetechie in #1244
- feat(python): Add
path
property to GeoParquetFile by @kylebarron in #1246 - chore(python): Prepare version 0.4.1 by @kylebarron in #1247
- chore(geodatafusion): Upgrade to DataFusion 49.0.0 by @ianthetechie in #1248
- feat(geodatafusion-flatgeobuf): FlatGeobuf FileSource by @kylebarron in #1236
- feat(flatgeobuf): Remove wrappers around Fgb reader objects, simplify API by @kylebarron in #1250
- feat(geodatafusion): ST_IsValid and ST_IsValidReason by @kylebarron in #1252
- feat(geodatafusion): ST_Centroid and ST_ConvexHull by @kylebarron in #1253
- feat(geodatafusion): ST_PointOnSurface by @kylebarron in #1254
- feat(geodatafusion): ST_OrientedEnvelope by @kylebarron in #1255
- feat(geodatafusion): Update ST_GeoHash, ST_Box2dFromGeoHash, ST_PointFromGeoHash from old code by @kylebarron in #1256
- feat(geodatafusion): Add extrema functions for bounding boxes by @kylebarron in #1257
- feat(geodatafusion): ST_Extent (first UDAF) by @kylebarron in #1258
- fix(geodatafusion): Fix input field of ST_Extent by @kylebarron in #1259
- feat(geoarrow-flatgeobuf): Improved schema inference & expose more from header by @kylebarron in #1260
- chore(geoarrow-flatgeobuf): update flatgeobuf dep to 5.0 by @kylebarron in #1261
- chore: Bump to arrow 56 by @kylebarron in #1262
- perf(geoarrow-array): Cast Wkb/Wkt to WkbViewArray/WktViewArray without parsing/re-encoding geometries by @kylebarron in #1263
- chore: Avoid using
unwrap
aftertry_push_usize
by @kylebarron in #1264 - chore(geoarrow-old): Remove more code from old, unused
geoarrow
crate by @kylebarron in #1265 - feat(geoarrow-schema)!: Use GeoArrowError in TryFrom from geo_traits::Dimension by @kylebarron in #1266
- feat(geoarrow-schema): Check inferred dimension against list size for interleaved point input by @kylebarron in #1267
- feat(geoarrow-array): add shrink_to_fit methods to builders by @kylebarron in #1268
- fix(geoarrow-array): Allow pushing Rect to MultiPolygonBuilder by @kylebarron in #1269
- feat(geoarrow-geos, geoarrow-array): Remove unneeded todos by @kylebarron in #1270
- fix(geoarrow-array)!: WkbBuilder should return result when appending geometries by @kylebarron in #1271
- chore(geodatafusion): Use datafusion git pin on main to support Arrow 56 by @kylebarron in #1273
- feat(geoarrow-schema)!: Better distinction of creating GeoArrowType depending on extension metadata by @kylebarron in #1275
- refactor(geoarrow-flatgeobuf): Improved API for passing in or inferring schema by @kylebarron in #1272
- fix(geoarrow-array): Fix
num_bytes
calculations for non-XY dimensions by @kylebarron in #1277 - feat(geodatafusion): Add aliases for WKT and WKB functions by @kylebarron in #1278
- feat(python, geoarrow-rust-io): Add
read_flatgeobuf
,read_flatgeobuf_async
,write_flatgeobuf
by @kylebarron in #1279 - fix(geoarrow-python-io): Release GIL when blocking tokio runtime by @kylebarron in #1281
- chore: fix for clippy 1.89 by @kylebarron in #1284
- test(geoarrow-flatgeobuf): More tests for FlatGeobuf writer by @kylebarron in #1285
- fix(geoarrow-flatgeobuf): Fix calculation of
num_rows_remaining
to allocate record batch builders correctly by @kylebarron in #1286 - chore: Remove more old
geoarrow
crate code by @kylebarron in #1287 - chore(python): Bump to 0.5.0-beta.1 by @kylebarron in #1288
- docs: Use
doc_auto_cfg
feature by @kylebarron in #1289 - feat(geoarrow-rust-core): Add
get_type_id
to infer geometry types from array by @kylebarron in #1280 - fix(geoarrow-rust-io): Turn off flatgeobuf default features to fix building without openssl by @kylebarron in #1290
- chore(python): Bump to 0.5.0-beta.2 by @kylebarron in #1291
- fix(geodatafusion-flatgeobuf): make
http-range-client
dependency non-optional by @kylebarron in #1292 - chore: Prepare 0.5 release by @kylebarron in #1293
New Contributors
- @nuts-rice made their first contribution in #1235
- @ianthetechie made their first contribution in #1239
Full Changelog: rust-v0.4.0-geoparquet...rust-v0.5.0
py-v0.5.0
What's Changed
- chore(geodatafusion): Upgrade to DataFusion 49.0.0 by @ianthetechie in #1248
- feat(geodatafusion-flatgeobuf): FlatGeobuf FileSource by @kylebarron in #1236
- feat(flatgeobuf): Remove wrappers around Fgb reader objects, simplify API by @kylebarron in #1250
- feat(geodatafusion): ST_IsValid and ST_IsValidReason by @kylebarron in #1252
- feat(geodatafusion): ST_Centroid and ST_ConvexHull by @kylebarron in #1253
- feat(geodatafusion): ST_PointOnSurface by @kylebarron in #1254
- feat(geodatafusion): ST_OrientedEnvelope by @kylebarron in #1255
- feat(geodatafusion): Update ST_GeoHash, ST_Box2dFromGeoHash, ST_PointFromGeoHash from old code by @kylebarron in #1256
- feat(geodatafusion): Add extrema functions for bounding boxes by @kylebarron in #1257
- feat(geodatafusion): ST_Extent (first UDAF) by @kylebarron in #1258
- fix(geodatafusion): Fix input field of ST_Extent by @kylebarron in #1259
- feat(geoarrow-flatgeobuf): Improved schema inference & expose more from header by @kylebarron in #1260
- chore(geoarrow-flatgeobuf): update flatgeobuf dep to 5.0 by @kylebarron in #1261
- chore: Bump to arrow 56 by @kylebarron in #1262
- perf(geoarrow-array): Cast Wkb/Wkt to WkbViewArray/WktViewArray without parsing/re-encoding geometries by @kylebarron in #1263
- chore: Avoid using
unwrap
aftertry_push_usize
by @kylebarron in #1264 - chore(geoarrow-old): Remove more code from old, unused
geoarrow
crate by @kylebarron in #1265 - feat(geoarrow-schema)!: Use GeoArrowError in TryFrom from geo_traits::Dimension by @kylebarron in #1266
- feat(geoarrow-schema): Check inferred dimension against list size for interleaved point input by @kylebarron in #1267
- feat(geoarrow-array): add shrink_to_fit methods to builders by @kylebarron in #1268
- fix(geoarrow-array): Allow pushing Rect to MultiPolygonBuilder by @kylebarron in #1269
- feat(geoarrow-geos, geoarrow-array): Remove unneeded todos by @kylebarron in #1270
- fix(geoarrow-array)!: WkbBuilder should return result when appending geometries by @kylebarron in #1271
- chore(geodatafusion): Use datafusion git pin on main to support Arrow 56 by @kylebarron in #1273
- feat(geoarrow-schema)!: Better distinction of creating GeoArrowType depending on extension metadata by @kylebarron in #1275
- refactor(geoarrow-flatgeobuf): Improved API for passing in or inferring schema by @kylebarron in #1272
- fix(geoarrow-array): Fix
num_bytes
calculations for non-XY dimensions by @kylebarron in #1277 - feat(geodatafusion): Add aliases for WKT and WKB functions by @kylebarron in #1278
- feat(python, geoarrow-rust-io): Add
read_flatgeobuf
,read_flatgeobuf_async
,write_flatgeobuf
by @kylebarron in #1279 - fix(geoarrow-python-io): Release GIL when blocking tokio runtime by @kylebarron in #1281
- chore: fix for clippy 1.89 by @kylebarron in #1284
- test(geoarrow-flatgeobuf): More tests for FlatGeobuf writer by @kylebarron in #1285
- fix(geoarrow-flatgeobuf): Fix calculation of
num_rows_remaining
to allocate record batch builders correctly by @kylebarron in #1286 - chore: Remove more old
geoarrow
crate code by @kylebarron in #1287 - chore(python): Bump to 0.5.0-beta.1 by @kylebarron in #1288
- docs: Use
doc_auto_cfg
feature by @kylebarron in #1289 - feat(geoarrow-rust-core): Add
get_type_id
to infer geometry types from array by @kylebarron in #1280 - fix(geoarrow-rust-io): Turn off flatgeobuf default features to fix building without openssl by @kylebarron in #1290
- chore(python): Bump to 0.5.0-beta.2 by @kylebarron in #1291
- fix(geodatafusion-flatgeobuf): make
http-range-client
dependency non-optional by @kylebarron in #1292 - chore: Prepare 0.5 release by @kylebarron in #1293
- chore: Prepare Python 0.5.0 release by @kylebarron in #1294
Full Changelog: py-v0.4.1...py-v0.5.0
rust-v0.4.0-geoparquet
This is the tag for the v0.4 release of the geoparquet
crate, which was delayed compared to the 0.4 release of the other crates.
0.4.0 (geoparquet
crate) - 2025-07-08
New standalone geoparquet
crate!
New Features 🪄
- GeoParquet reader refactor to avoid making duplicate wrappers of upstream structs #1089
-
Removes wrapper structs for builders. So we no longer have a
GeoParquetRecordBatchReaderBuilder
or aGeoParquetRecordBatchStreamBuilder
. Users will use upstreamparquet
sync/asyncBuilder
structs directly. Means a significantly lower maintenance overhead here, and we don't need to do anything to support new upstream functionality. -
Adds
GeoParquetReaderBuilder
trait that extends the upstreamArrowReaderBuilder
. This allows users to implement a spatialRowFilter
directly on an upstream builder instance. It also allows low-level access, so that if a user wanted a spatial filter plus something else, that would be doable. -
Allows user to choose when the WKB column should be parsed to a native GeoArrow type or not in the
geoarrow_schema
method. (theparse_to_native
parameter) -
Keeps wrapper structs for readers. So we still have a
GeoParquetRecordBatchReader
and aGeoParquetRecordBatchStream
, but these are very lightweight wrappers.The benefit of having these wrapper structs is that we can ensure GeoArrow metadata is always applied onto the emitted
RecordBatch
es.
-
- Refactor of GeoParquetReaderMetadata and GeoParquetDatasetMetadata #1172
- Remove
Option
for the geospatial metadata of eachGeoParquetReaderMetadata
andGeoParquetDatasetMetadata
. We assume that if the user is using thegeoparquet
crate, all files will have valid GeoParquet metadata.
- Remove
- Remove GeoParquet writer wrappers and just expose encoder #1214
- Add support for writing covering column to GeoParquet #1216
- Add support for generating the a bounding box covering column while writing data.
- Reconfigure writer properties generation. This takes inspiration from the upstream
parquet
properties generation, and has both column specific properties and default properties. So you can set the encoding for all columns but you can also override the encodings for specific columns.
- Allow passing primary column to parquet writer #1159
- Correctly set geometry types in GeoParquet metadata when writing #1218
py-v0.4.0
This release contains the Python bindings for a full rewrite of the GeoArrow Rust library.
New Features 🪄
- Full support for the GeoArrow 0.2 specification, including all geometry array types and dimensions.
- See documentation for
GeoArray
,GeoChunkedArray
,GeoScalar
, andGeometryType
for more details. - Support for reading and writing GeoParquet 1.1 files, including spatial filtering, including support for reading from remote files.
rust-v0.4.0
This release contains more or less a full rewrite of the GeoArrow Rust library.
The
geoarrow-rs
project is about 3 years old. Early prototyping started inside thegeopolars
repo before deciding I needed something more general (not tied to Polars) and creating firstgeopolars/geoarrow
and then lastlygeoarrow/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. Thegeoarrow
crate is also too monolithic. Some parts ofgeoarrow
are production ready, but there's decidedly a lot of code ingeoarrow
that is not production ready. And it's very much not clear which parts ofgeoarrow
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, thegeoarrow-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, likegeoarrow-array
.
New Features 🪄
- Full support for the GeoArrow 0.2 specification, including all geometry array types and dimensions. See documentation in
geoarrow-array
. - Native support for the upstream Arrow
ExtensionType
concept introduced in arrow54.2
. See documentation ingeoarrow-schema
.
Removed functionality 🔧
A significant amount of code from the previous geoarrow
crate is not currently available in the refactored geoarrow-*
crates.
Some of this is intentional. Similar to the upstream arrow
crate, we no longer export a ChunkedArray
concept, suggesting the user to use streaming concepts like iterators where possible.
Other functionality like format readers and writers is intended to be restored once stable, but additional work needs to take place before there's enough confidence in that code.
rust-v0.3.0
New Features 🪄
- Preliminary support for 3D (XYZ) geometries
- Support for reading and writing GeoParquet 1.1
- Support for reading and writing GeoArrow (native) geometry encoding
- Support for reading with spatial filtering
- Both synchronous and asynchronous readers for GeoParquet. Readers will stream a RecordBatch at a time by default.
- Accept
RecordBatchReader
as input to all - New support for
geoarrow.box
array (equivalent toVec<Option<geo::Rect>>
).RectArray
is now laid out as aStructArray
internally instead of aFixedSizeListArray
. - Improved documentation
Performance Improvements 🏎️
- Remove
Cow
around scalar buffers by @kylebarron in #720
Bug fixes 🐛
- Don't serialize empty array metadata by @kylebarron in #678
- Fixed
MixedGeometryArray
handling. Exported ArrowUnionArrays
always have same data layout. - Support MapArrays when exporting to geozero by @kylebarron in #721
New Contributors
- @H-Plus-Time made their first contribution in #607
- @gadomski made their first contribution in #640
Full Changelog: rust-v0.2.0...rust-v0.3.0
py-v0.3.0
New Features 🪄
- Remove geometry class specializations. Instead of
PointArray
,LineStringArray
, etc, there's now justGeometryArray
,ChunkedGeometryArray
, andGeometry
(a scalar). - Remove GeoTable class, in favor of external, generic arrow Table implementations, such as
arro3.core.Table
. - Move to slimmer, functional API. No more geometry methods on classes.
- Don't materialize input data when writing to a file.
- New
GeometryType
class for understanding the geometry type of an array or chunked array. - Split Python code into three modules:
geoarrow-rust-core
,geoarrow-rust-compute
andgeoarrow-rust-io
. - Support for Pyodide Python environment
- Support Python file objects for reading and writing GeoParquet
Bug fixes 🐛
- Fix array indexing with negative integers by @kylebarron in #724
Full Changelog: py-v0.2.0...py-v0.3.0
rust-v0.2.0
New! ✨
New I/O support for reading and writing to geospatial formats
- Asynchronous FlatGeobuf reader. This also supports passing a spatial filter.
- Initial support for reading from PostGIS. Note that not all Postgres data types are supported yet. Create an issue if your query fails.
- Reading and writing newline-delimited GeoJSON.
- Asynchronous GeoParquet reader for reading from remote files. By @weiji14 in #493
- Also new support for writing GeoParquet files.
- Support for reading and writing Arrow IPC files.
New algorithms!
- Explode a Table where each multi-geometry expands into multiple rows of single geometries.
- total_bounds
frechet_distance
for LineString similarity.line_interpolate_point
andline_locate_point
for linear referencing.polylabel
for polygon labeling.
Improved usability:
New Contributors
- @Robinlovelace made their first contribution in #484
- @weiji14 made their first contribution in #493
Full Changelog: rust-v0.1.0...rust-v0.2.0
py-v0.2.0
New! ✨
New I/O support for reading and writing to geospatial formats
- Asynchronous FlatGeobuf reader. This also supports passing a spatial filter.
- Initial support for reading from PostGIS. Note that not all Postgres data types are supported yet. Create an issue if your query fails.
- Reading and writing newline-delimited GeoJSON.
- Pyogrio integration for reading from OGR/GDAL.
- Asynchronous GeoParquet reader for reading from remote files. By @weiji14 in #493
- Also new support for writing GeoParquet files.
- Most I/O readers and writers support Python file-like objects (in binary mode).
- Support for reading and writing Arrow IPC files.
Better interoperability with the Python geospatial ecosystem.
- Import from and export to GeoPandas GeoDataFrames. Refer to the GeoPandas interoperability documentation.
- Import from and export to Shapely arrays. Refer to the Shapely interoperability documentation.
- Better integration with Lonboard for fast visualization in Jupyter.
- All scalars, arrays, chunked arrays, and table objects implement
__geo_interface__
for interoperability with existing tools. - Numpy interoperability for float array output from algorithms. Pass any
Float64Array
orBooleanArray
tonumpy.asarray
. You can also pass a numpy array as vectorized input into a function likeline_interpolate_point
.
New algorithms!
- Explode a Table where each multi-geometry expands into multiple rows of single geometries.
total_bounds
- Unified
area
function for planar and geodesic area. - Unified
simplify
function for multiple simplification methods. Also new support for topology-preserving simplification. - Unified
length
function for euclidean and geodesic length calculations. frechet_distance
for LineString similarity.affine_transform
, which integrates with the Pythonaffine
library.line_interpolate_point
andline_locate_point
for linear referencing.polylabel
for polygon labeling.
Improved display of Python objects:
- Scalars now display as SVG geometries inside Jupyter environments.
- Tables, arrays, and chunked arrays implement
__repr__
so that you can inspect data easily.
Improved usability:
PointArray.from_xy
to simplify creating a point array from numpy arrays of coordinates.- Index into arrays and chunked arrays with square brackets. E.g.
point_array[0]
will access the first point in the array. Negative indexing is also supported, sopoint_array[-1]
will get the last item in the array. - New top-level docs website.
New Contributors
- @Robinlovelace made their first contribution in #484
- @weiji14 made their first contribution in #493
Full Changelog: py-v0.1.0...py-v0.2.0