Cloud-native geospatial dataset processing toolkit
Project description
cng-datasets
A CLI toolkit for processing large geospatial datasets into cloud-native formats on Kubernetes.
What it does: Takes source geospatial data (Shapefiles, GeoPackages, FileGDB, GeoTIFFs) and produces:
- GeoParquet — columnar format for analytical queries (DuckDB, Polars)
- PMTiles — vector tiles for web map visualization
- H3 Hex Parquet — hexagonal grid indexed at configurable H3 resolution, hive-partitioned for fast spatial joins
- Cloud-Optimized GeoTIFF — for raster data, optimized for HTTP range requests
How it works: You run a single CLI command locally. It generates Kubernetes Job YAML files that orchestrate the entire pipeline on your cluster. You never process data on your local machine — the CLI just generates the jobs.
Installation
pip install cng-datasets
Or from source:
pip install -e "."
Usage
Generate a vector processing pipeline
cng-datasets workflow \
--dataset cpad-2024 \
--source-url https://example.com/cpad.gdb \
--bucket public-cpad \
--layer CPAD_SuperUnits \
--h3-resolution 10 \
--parent-resolutions "9,8,0" \
--hex-memory 32Gi \
--max-completions 200 \
--max-parallelism 50
This generates YAML files for a 5-step pipeline:
- setup-bucket — creates the S3 bucket with public-read policy
- convert — reads source data, reprojects to EPSG:4326, writes GeoParquet
- pmtiles — converts GeoParquet to PMTiles (parallel with step 4)
- hex — computes H3 cell assignments in parallel pods
- repartition — consolidates hex chunks into hive-partitioned layout
Multiple sources: Add --source-url multiple times to merge datasets:
cng-datasets workflow \
--dataset merged-regions \
--source-url https://example.com/region1.shp \
--source-url https://example.com/region2.shp \
--source-url https://example.com/region3.shp \
--bucket my-bucket
Apply them:
kubectl apply -f <output-dir>/workflow-rbac.yaml
kubectl apply -f <output-dir>/configmap.yaml
kubectl apply -f <output-dir>/workflow.yaml
The workflow orchestrator runs steps sequentially, launching pmtiles and hex in parallel.
Generate a raster processing pipeline
cng-datasets raster-workflow \
--dataset wetlands-cog \
--source-url https://example.com/wetlands.tif \
--bucket public-wetlands
Multi-layer sources
For GeoDatabase or GeoPackage files with multiple layers, run one workflow per layer. Use --layer to select each layer and --dataset with / for hierarchical S3 paths:
# Inspect layers
ogrinfo /vsicurl/https://example.com/data.gdb
# Process each layer separately
cng-datasets workflow --dataset mydata/layer-a --layer LayerA ...
cng-datasets workflow --dataset mydata/layer-b --layer LayerB ...
The / in --dataset creates nested S3 paths (e.g., mydata/layer-a.parquet) while using hyphens for k8s resource names.
CLI Reference
| Command | Purpose |
|---|---|
cng-datasets workflow |
Generate vector processing k8s pipeline |
cng-datasets raster-workflow |
Generate raster processing k8s pipeline |
cng-datasets storage setup-bucket |
Create and configure an S3 bucket |
cng-convert-to-parquet |
Convert vector data to GeoParquet |
cng-datasets vector |
Run H3 hex tiling (used inside k8s pods) |
cng-datasets raster |
Run raster H3 tiling (used inside k8s pods) |
cng-datasets repartition |
Consolidate hex chunks (used inside k8s pods) |
Commands marked "used inside k8s pods" are called by the generated jobs — you don't run them directly.
cng-datasets workflow options
--dataset NAME Dataset name for S3 paths. Use / for hierarchy (e.g., "padus/fee").
--source-url URL Public URL to source data.
--bucket BUCKET Target S3 bucket name.
--layer LAYER Layer name for multi-layer sources (GDB, GPKG).
--h3-resolution N H3 resolution for hex tiling (default: 10).
--parent-resolutions STR Comma-separated parent resolutions (default: "9,8,0").
--hex-memory SIZE Memory per hex pod (default: 8Gi).
--max-completions N Number of parallel chunks, max 200 (default: auto).
--max-parallelism N Max concurrent pods (default: 50).
--id-column COL ID column name (auto-detected if omitted).
--output-dir DIR Directory for generated YAML files.
--intermediate-chunk-size Rows per unnest batch (decrease if OOM).
--row-group-size N Rows per parquet row group (default: 100000).
S3 Output Layout
bucket/
├── dataset.parquet # GeoParquet
├── dataset.pmtiles # PMTiles
├── dataset/
│ └── hex/
│ └── h0={cell}/data_0.parquet # H3-indexed, hive-partitioned
├── README.md
└── stac-collection.json
Docker
The CLI and all dependencies are packaged in a Docker image used by the k8s jobs:
docker pull ghcr.io/boettiger-lab/datasets:latest
Troubleshooting
OOM on hex jobs: Increase --hex-memory (e.g., 32Gi → 64Gi), increase --max-completions for smaller chunks, or decrease --intermediate-chunk-size.
Convert fails on curved geometries (MULTISURFACE): Handled automatically — the converter linearizes curved geometry types via ogr2ogr before processing.
Monitoring:
kubectl get jobs # Pipeline status
kubectl logs job/<name> # Job logs
kubectl get pods | grep OOM # Check for memory issues
Development
pip install -e ".[dev]"
pytest tests/
License
Apache 2.0
Citation
If you use cng-datasets in your work, please cite it via its Zenodo archive.
The DOI badge at the top of this README resolves to the latest release; each
release also has its own version-specific DOI. Citation metadata (authors,
title, funding) lives in .zenodo.json and is minted
automatically by Zenodo on each GitHub release.
Boettiger, C., & Buhler, C. K. cng-datasets: A cloud-native toolkit for processing large geospatial datasets on Kubernetes. Zenodo. https://zenodo.org/badge/latestdoi/921944685
Once the first release is archived on Zenodo, replace the redirect above with the concrete versioned DOI it mints.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cng_datasets-0.3.0.tar.gz.
File metadata
- Download URL: cng_datasets-0.3.0.tar.gz
- Upload date:
- Size: 153.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e14b328eaa58c2214ff54ff838dcb72e9603bb02ba03d7b1771c606bacc02c4
|
|
| MD5 |
03f6866f7eb49b9148dd8e45074b655d
|
|
| BLAKE2b-256 |
a7b70e50da0818155ded9009f5d437883793b6ae5b6997912d29d1783fa5cae6
|
Provenance
The following attestation bundles were made for cng_datasets-0.3.0.tar.gz:
Publisher:
release.yml on boettiger-lab/datasets
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cng_datasets-0.3.0.tar.gz -
Subject digest:
4e14b328eaa58c2214ff54ff838dcb72e9603bb02ba03d7b1771c606bacc02c4 - Sigstore transparency entry: 2204741383
- Sigstore integration time:
-
Permalink:
boettiger-lab/datasets@da5c581fc01cbd43a2d45ee8b91ff035bcb06522 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/boettiger-lab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@da5c581fc01cbd43a2d45ee8b91ff035bcb06522 -
Trigger Event:
release
-
Statement type:
File details
Details for the file cng_datasets-0.3.0-py3-none-any.whl.
File metadata
- Download URL: cng_datasets-0.3.0-py3-none-any.whl
- Upload date:
- Size: 103.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6607ba50ba1ec289ea2c2543d6571469250dbb2b9515d8b9a31894aa52ac847a
|
|
| MD5 |
e7231cf5023fb242e5563b4ccd882d46
|
|
| BLAKE2b-256 |
d78be4a10e7ade320c1ddcd00fd98a9adbfd699a946f3565f4d8ff2a0a0bad64
|
Provenance
The following attestation bundles were made for cng_datasets-0.3.0-py3-none-any.whl:
Publisher:
release.yml on boettiger-lab/datasets
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cng_datasets-0.3.0-py3-none-any.whl -
Subject digest:
6607ba50ba1ec289ea2c2543d6571469250dbb2b9515d8b9a31894aa52ac847a - Sigstore transparency entry: 2204741387
- Sigstore integration time:
-
Permalink:
boettiger-lab/datasets@da5c581fc01cbd43a2d45ee8b91ff035bcb06522 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/boettiger-lab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@da5c581fc01cbd43a2d45ee8b91ff035bcb06522 -
Trigger Event:
release
-
Statement type: