GeoParquet 2.0 CRS: PROJJSON in geo metadata, flexible native Parquet crs, srid:0 for unknown - #286
Merged
Merged
Conversation
… crs, srid:0 for unknown Reflects the June 1 community-call decisions on GeoParquet 2.0 CRS handling: - The GeoParquet `geo` column-metadata crs field MUST be inline PROJJSON (or null). Writing geo metadata is optional, but when present its crs is the guaranteed-PROJJSON restatement of the CRS, so readers can always obtain a full definition without resolving an authority code. - The native Parquet GEOMETRY/GEOGRAPHY crs property is the source of truth and is NOT restricted by GeoParquet: it MAY use any Parquet-core form (inline PROJJSON, <authority>:<code>, srid:<id>, projjson:<key>). authority:code is the recommended form for writers that cannot generate PROJJSON; such writers are encouraged to write plain native Parquet geo and omit geo metadata (not conformant GeoParquet 2.0, but readers should still read it). - Readers MUST understand PROJJSON and <authority>:<code> in the native Parquet crs property, and SHOULD tolerate the srid/projjson:key forms. - "null" (undefined/unknown CRS) is kept in GeoParquet metadata for 1.x compatibility, and maps to srid:0 in the native Parquet crs property. Keeps the structure and explanations from #284 but encodes the chosen decisions, superseding #284 (authority:code in metadata) and #285 (removing null). schema.json and the schema tests are unchanged from main (crs is object|null). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
paleolimbot
approved these changes
Jun 15, 2026
paleolimbot
left a comment
Collaborator
There was a problem hiding this comment.
Others should have a look as well, but this looks good to me. It preserves the ability of existing metadata parsers to parse a CRS, and also gives practical advice nudging people towards the subset of values allowed by the Parquet spec that they should actually be using.
Co-authored-by: Dewey Dunnington <dewey@wherobots.com>
This was referenced Jun 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Encodes the GeoParquet 2.0 CRS decisions reached on the June 1 community call. This supersedes the two exploratory PRs it grew out of:
<authority>:<code>in the GeoParquet metadatacrs) — the call leaned the other way: keep the GeoParquet metadatacrsas inline PROJJSON, and instead allow the flexible forms on the native Parquetcrsproperty.nullfrom thecrsfield) — the call decided to keepnullfor backwards compatibility, and map it tosrid:0on the Parquet side.This PR keeps the structure and explanations that #284 introduced (it's a nice approach), but reframes them around the decisions below. It is a docs-only change —
schema.jsonand the schema tests are unchanged frommain(crsstaysobject|null).Decisions encoded
1. The GeoParquet
geometadatacrsis PROJJSON; the native Parquetcrscan be any formThe spec now clearly separates the two
crsfields:crsfield — MUST be inline PROJJSON (ornull). Writinggeometadata is itself optional (a writer may emit only the native Parquet geospatial types), but any file that does carry GeoParquet metadata states its CRS as inline PROJJSON there. This is the key guarantee: a reader of the GeoParquet metadata can always obtain a complete CRS definition directly, without resolving an authority code against an external registry.crsproperty (on theGEOMETRY/GEOGRAPHYlogical type) — the source of truth, and not restricted by GeoParquet. It MAY use any Parquet-core form: inline PROJJSON,<authority>:<code>,srid:<identifier>, orprojjson:<key_name>.<authority>:<code>;<authority>:<code>is RECOMMENDED for writers that can't readily generate PROJJSON (pure-SQL pipelines, browser-side writers).<authority>:<code>crsand omit GeoParquet metadata. Such a file isn't conformant GeoParquet 2.0, but any GeoParquet reader should still read it.<authority>:<code>in the native Parquetcrsproperty, and SHOULD additionally toleratesrid:<identifier>/projjson:<key_name>.Spec framing: producing the native Parquet geospatial types is the foundation of GeoParquet 2.0 and what every writer should do; the GeoParquet
geometadata is the optional, more-explicit layer on top.2.
null(unknown / undefined CRS) is kept, and maps tosrid:0crsMAY still benullto mean "CRS undefined or unknown" (kept for 1.x compatibility — real use cases include local/engineering coordinates and legacy data).crsisnull, the native Parquetcrsproperty SHOULD be set tosrid:0. The Parquet core spec mentions thesrid:<identifier>form but assigns no meaning to0; GeoParquet 2.0 adoptssrid:0to mean undefined/unknown CRS, following the GeoPackage convention discussed on the call.Mirroring table (from the new spec text)
crscrs<authority>:<code>stringsrid:0nullChanges
format-specs/geoparquet.md:crsrow clarified (object|null; PROJJSON ornull; must describe the same CRS as the native Parquet property).crsrewritten: the GeoParquet field is the inline-PROJJSON restatement; native Parquet property is the source of truth and may use other forms;null→srid:0.crsParquet property rewritten: explicitly scoped to the native Parquet property; native types are primary/recommended; writer MAY use any Parquet form (<authority>:<code>recommended when not inlining PROJJSON); writers that can't do PROJJSON should write plain native Parquet and omitgeometadata; reader MUST/SHOULD rules;srid:0for unknown; mirroring table.<authority>:<code>OGC:CRS84andEPSG:4326are equivalent to OGC:CRS84.schema.json,scripts/test_json_schema.py: no change (alreadyobject|nullonmain).Test results
🤖 Generated with Claude Code