Official test corpus for the GeoParquet format.
Modeled after apache/parquet-testing.
Targets: GeoParquet 2.0.0 (version: "2.0.0" in geo metadata).
Corpus version: see CHANGELOG.md and releases.
| Tier | Purpose | Files |
|---|---|---|
data/ |
Small, systematic conformance fixtures exercising each spec axis | 42 |
samples/ |
Plausibly-real datasets flexing spec features at non-trivial scale | 9 |
bad_data/ |
Files that deliberately violate the spec, with a machine-readable manifest.json |
22 |
Each tier directory has its own README indexing every file and what it tests.
The corpus targets GeoParquet 2.0.0 and every file in data/ and samples/ validates
against the GeoParquet 2.0.0 JSON Schema (CI enforces this). Every
geometry column uses the native Parquet GEOMETRY/GEOGRAPHY logical type, and every
column whose CRS is not OGC:CRS84 carries that CRS on the native logical type (stamped
as inline PROJJSON via sedonadb — see scripts/gen_native_crs.py) so it agrees with the
geo metadata, as the spec requires.
Two niche CRS-representation variants remain intentionally deferred (tooling limits):
srid:0in the Parquet metadata +nullgeocrs(an unknown CRS), and- full PROJJSON in the geo
crs+ the compactauthority:codestring in the Parquet native metadata (our tooling only writes inline PROJJSON onto the native type).
git submodule add https://github.com/geoparquet/geoparquet-testing tests/data/geoparquet-testingPin to a tagged release by checking out the tag inside the submodule.
Download from the releases page. Suitable for projects that don't want a submodule dependency.
A reader implementation can iterate bad_data/manifest.json, attempt to open each file, and assert that the failure mode matches the manifest's expected_failure code. See bad_data/README.md for the controlled vocabulary.
cd scripts
uv sync --all-extras
uv run python generate_all.pyAll conformance (data/) and negative (bad_data/) files are deterministic — re-running produces byte-identical output, and CI enforces this on every PR. Realistic samples/ that fetch live upstream data are committed snapshots (not byte-diffed in CI).
To regenerate a single category:
uv run python gen_crs.py
uv run python gen_samples.py --only airports_global- Edit or add a generator under
scripts/. - Run
uv run python generate_all.py. - Make sure the relevant
data|samples|bad_data/README.mdtable includes any new file. - For new bad-data files, add an entry to
bad_data/manifest.json(the generator does this automatically when youregister(...)). - Open a PR. CI verifies reproducibility (data/ + bad_data/), schema validity, README index hygiene, and the 5 MB sample budget.
Apache 2.0 for everything generated by this repo. Realistic samples under samples/ retain their upstream licenses — see each entry in samples/README.md and the header comment of the matching scripts/samples/<name>.py for attribution requirements.