GeoParquet 2.0 is an evolution of the specification, re-centering the core on the Parquet Geospatial Logical Types that are now part of the core Parquet format. Where GeoParquet 1.x layered geospatial metadata on top of plain binary columns, 2.0 makes native Parquet GEOMETRY and GEOGRAPHY types the foundation: geometries are understood by the format itself, and per–row-group geospatial statistics enable efficient spatial filtering without the extra bbox covering column that 1.1 relied on. The GeoParquet geo metadata remains as an optional, more explicit layer on top — providing things Parquet core doesn't, like a guaranteed inline CRS definition.
The overall goal of 2.0 is to align the geospatial world with mainstream Parquet tooling: any tool that writes the native Parquet geospatial types correctly is compatible with GeoParquet 2.0, and the spec just provides the metadata in the same way as previous GeoParquet versions.
This release is a 'release candidate' to get final testing from implementations before 2.0.0 is declared final. It uses the 2.0.0 version numbers so that writers don't need to produce weird version numbers for a small testing period, but it is possible that small things could change before 2.0.0.
Highlights
Native Parquet geospatial types (#278)
The core of the 2.0 spec. GeoParquet now requires the native Parquet GEOMETRY/GEOGRAPHY logical types as the storage encoding, and the GeoParquet metadata must match the Parquet-level metadata. Changes include:
- Removed the GeoArrow-based native encodings introduced in 1.1 (superseded by the Parquet types).
- Removed the
covering/bboxcolumn mechanism — the native types' built-in row-group statistics do this job more efficiently, and files (especially point data) get smaller. - Add new
edgesoptions to align with thealgorithmfield (spherical, vincenty, etc.) in Parquet types for non-planar edge interpolation.
CRS handling (#286)
Encodes the CRS decisions from the June 2026 community call, cleanly separating the two places a CRS can live:
- The GeoParquet
geometadatacrsmust be inline PROJJSON (ornull), so a reader can always obtain a complete CRS definition without resolving an authority code against an external registry. - The native Parquet
crsproperty is the source of truth and may use any Parquet-core form — inline PROJJSON,<authority>:<code>,srid:<identifier>, orprojjson:<key_name>. Writers tha(e.g. pure-SQL pipelines) are encouraged to write plainnative Parquet with an<authority>:<code>CRS. crs: null(unknown/undefined CRS) is kept for 1.x compd:0` on the Parquet side, following the GeoPackage convention.
Distribution best practices (#254, #281, #288)
A new best practices guide for creating and distributing good GeoParquet files, introduced in #254 and expanded with a section on powering frontend/web applications (#281). For 2.0 it was reworked and split in two (#288): a focused recommendations page (spatial ordering, zstd compression at level 15+, row-group sizing, efficient spatial access via native statistics) and a companion tools guide with verified how-tos for GDAL/OGR, DuckDB, geoparquet-io, and Sedona — including how to get native 2.0 output from each.
What's Changed
- Fix typo in multipolygon example by @msbarry in #237
- pattern => enum by @m-mohr in #245
- Update poetry spec for updated Python + Poetry by @paleolimbot in #272
- Best Practices guide for creation of good GeoParquet files (focused on distribution) by @cholmes in #254
- Initial attempt at 2.0 spec by @cholmes in #278
- Add section in distribution best practices for frontend applications by @C-Loftus in #281
- CI: Update GitHub Actions versions by @EwoutH in #282
- Update example file for GeoParquet 2.0 by @paleolimbot in #280
- GeoParquet 2.0 CRS: PROJJSON in geo metadata, flexible native Parquet
crs,srid:0for unknown by @cholmes in #286 - Updates for the 2.0.0 release by @cholmes in #287
- Add zstd compression to example storing GeoParquet with sedona by @JakobMiksch in #293
- Update distribution best practices guide for GeoParquet 2.0 by @cholmes in #288
New Contributors
- @msbarry made their first contribution in #237
- @C-Loftus made their first contribution in #281
- @EwoutH made their first contribution in #282
- @JakobMiksch made their first contribution in #293
Full Changelog: v1.1.0+p1...v2.0.0-rc.1
What's Changed
- Add GeoParquet.jl, an implementation in Julia by @evetion in #109
- add R examples and geoarrow by @yeelauren in #108
- fix lint error by @kylebarron in #125
- Include suggestion about feature identifiers by @tschaub in #121
- Consistent spelling of GeoParquet by @tschaub in #142
- Add link to gpq by @tschaub in #139
- Correct the 'bbox' description for 3D geometries by @jorisvandenbossche in #88
- Clarify nesting and repetition of geometry columns by @tschaub in #138
- Clarify that bbox follows column's CRS by @jorisvandenbossche in #143
- Clarify geographic vs non-geographic bbox values by @tschaub in #145
- Array of geometry types by @tschaub in #140
- More consistent spelling and punctuation for JSON types by @tschaub in #149
- Add Apache Sedona to known libraries by @jiayuasu in #150
- schema.json: update reference to projjson schema to v0.5 by @rouault in #151
- Require minimum length of 1 for primary_geometry #129 by @m-mohr in #153
- Clean-up spec and JSON Schema by @m-mohr in #131
- Clean-up README by @m-mohr in #156
- The default value of the crs field is required #152 by @m-mohr in #154
- Require at least one column by @m-mohr in #158
- Add basic valid and invalid tests for the json schema by @jorisvandenbossche in #141
- Refer to RFC 2119 for definition of requirement levels by @tschaub in #160
- Read version number from the schema by @tschaub in #159
- Updates for the 1.0.0-beta.1 release by @tschaub in #161
- Remove example link from spec by @tschaub in #162
- Readme updates for 1.0-beta.1 release by @cholmes in #163
- Parquet Geospatial Compatibility Recommendations by @cholmes in #172
- updates for geography column name option by @cholmes in #175
- Release Candidate 1 by @cholmes in #176
- Update scripts dependencies by @kylebarron in #179
- Link to the release procedure by @tschaub in #181
- Updates for the 1.0.0-rc.1 release by @tschaub in #182
- 1.0.0 release by @cholmes in #184
- Spec: add a note about mapping of Parquet BYTE_ARRAY type to Arrow types by @rouault in #190
- Add missing link, make sure people find stable by @m-mohr in #194
- fix typo on geoparquet.md by @Jap8nted in #195
- Fixes the link from
compatible-parquet.mdto the schema. by @xaviernogueira in #196 - Introduce bounding box column definition by @jwass in #191
- Add GeoArrow encoding as an option to the specification by @paleolimbot in #189
- Require two elements in covering elements by @m-mohr in #210
- Migration of the GeoParquet specification to the official OGC document template by @ghobona in #206
- Update README.md by @ghobona in #214
- Added file extension recommendation by @cholmes in #212
- Revert changes to fix CI by @m-mohr in #219
- Added Media Type by @cholmes in #213
- Added disclosure that 1.0.0 is not yet OGC approved by @jatorre in #205
- Add test data covering different native (geoarrow-based) encodings by @jorisvandenbossche in #204
- Improves Covering Schema #208 by @m-mohr in #209
- Bounding box column updates by @kylebarron in #202
- Clarify null/missing crs key by @kylebarron in #225
- clarified that the bbox must be in the same crs as the geometry by @cholmes in #226
- Updated projjson schema link to 0.7 (and new link) by @cholmes in #227
- Add version compatibility documentation by @TheNeuralBit in #229
- Updates for the 1.1.0 release by @cholmes in #230
- Remove requirement that geometry columns must not be a group field by @tschaub in #234
- Fix typo in multipolygon example by @msbarry in #237
- pattern => enum by @m-mohr in #245
- Update poetry spec for updated Python + Poetry by @paleolimbot in #272
- Add the initial draft of the Parquet Raster standard by @jiayuasu in #259
- Added language to warn users this isn't stable. by @cholmes in #273
- Best Practices guide for creation of good GeoParquet files (focused on distribution) by @cholmes in #254
- Initial attempt at 2.0 spec by @cholmes in #278
- Add section in distribution best practices for frontend applications by @C-Loftus in #281
- CI: Update GitHub Actions versions by @EwoutH in #282
- Update example file for GeoParquet 2.0 by @paleolimbot in #280
- GeoParquet 2.0 CRS: PROJJSON in geo metadata, flexible native Parquet
crs,srid:0for unknown by @cholmes in #286 - Updates for the 2.0.0 release by @cholmes in #287
- Add zstd compression to example storing GeoParquet with sedona by @JakobMiksch in #293
- Update distribution best practices guide for GeoParquet 2.0 by @cholmes in #288
New Contributors
- @evetion made their first contribution in #109
- @yeelauren made their first contribution in #108
- @tschaub made their first contribution in #121
- @jiayuasu made their first contribution in #150
- @Jap8nted made their first contribution in #195
- @xaviernogueira made their first contribution in #196
- @jwass made their first contribution in #191
- @paleolimbot made their first contribution in #189
- @ghobona made their first contribution in #206
- @jatorre made their first contribution in #205
- @TheNeuralBit made their first contribution in #229
- @msbarry made their first contribution in #237
- @C-Loftus made their first contribution in #281
- @EwoutH made their first contribution in #282
- @JakobMiksch made their first contribution in #293
Full Changelog: v0.4.0...v2.0.0-rc.1