Skip to main content

terrazarr

Test PyPI License

GeoZarr multiscale pyramids for planetary-scale rasters: a lazy, windowed and resumable writer of zarr v3 stores with sharding, for any xarray object with a CRS. Documentation: mindearth.github.io/terrazarr.

Why terrazarr

eopf-geozarr, written by Development Seed for ESA, turns Sentinel products into GeoZarr multiscale pyramids: native CRS, /2 overviews, a tile matrix set, consolidated metadata. It is built for a scene, a few thousand pixels a side, and it computes every overview level from the whole previous level as one array in memory. It is fine at scene size, but a design that runs out of memory or runs for days once the raster stops being scene-sized.

terrazarr is a rewrite of that pipeline for rasters of any size, keeping the same metadata layout and output shape, so it's a drop-in for anyone with an xarray object and a CRS who has outgrown the scene-sized assumption. Reach for it if you need:

  • Low, flat memory use. Peak memory doesn't grow with the raster: task memory is always one shard, and the main process' graph is bounded by a window rather than by the whole raster. A raster with a million-plus level-0 shard tasks still peaks under a gigabyte, where a writer that loads a whole level into memory first needs tens of gigabytes before it reads a pixel.
  • Real scalability. The same lazy, windowed, shard-aligned execution applies unchanged from a single scene to a raster with billions of pixels, no separate code path or reconfiguration for "big" inputs, no ceiling where it stops working.
  • Lazy end to end. Level 0 is one task per output shard, level 1 is reduced inside the same task, every further level reads its parent shards from the store one at a time; nothing is ever materialised as a whole array in memory.
  • Resumable. Level 0 is written in windows and each one done is recorded, so an interrupted run with --resume finishes from the missing windows instead of starting over.
  • Store-aware. One read per input block, shard-aligned reads and writes, all-nodata blocks never touch the store, and a band-last image is read and transposed once per block.
  • Exact. Level L has exactly 2**L native pixels per pixel, anchored top-left; nodata is a rule (mean of valid pixels, block blanked below 30 % valid), integers round; every level has a decodable CRS.

Install

pip install terrazarr

or from a clone, with uv:

uv venv --python 3.11 .venv
uv pip install --python .venv/bin/python -e . --group dev

Use

to_geozarr is the counterpart of rioxarray's to_raster for GeoZarr: it takes a DataArray, a Dataset or a DataTree with a CRS and writes the pyramid.

import xarray as xr
from terrazarr import to_geozarr

ds = xr.open_dataset("in.zarr", engine="zarr", chunks={"y": 4096, "x": 4096})   # lazy, any size
to_geozarr(ds, "out.zarr", chunk_size=256, shard_size=4096, method="mean", nodata=0)

or as an accessor, ds.terrazarr.to_geozarr("out.zarr", ...), or from the command line:

terrazarr --input in.zarr --output out.zarr \
  --chunk-size 256 --shard-size 4096 --sharding \
  --method mean --nodata 0 \
  --workers 8 --threads-per-worker 1 --memory-limit 4GB \
  --compressor zstd --clevel 3

Local paths and s3:// URLs work for both input and output. The API page lists every option, the output layout and the conventions the store follows; examples/ has a synthetic raster that runs in under a minute, a GeoTIFF to GeoZarr script and an S3 to S3 run for a large sparse raster.

Results at a glance

WSF-3D Italy, a 178 335 × 200 599 float64 raster (286 GB uncompressed) and its 32768² window, written as a ten-level (eight-level) pyramid with 256² chunks in 4096² shards, same machine (24 cores, 43 GB), same settings. Following the wall time and peak memory of the whole process tree.

32768x32768 float64

writer wall time peak memory
terrazarr, 8 processes 26 s 0.5 GB
eopf-geozarr 0.11.0 460 s 18.7 GB
topozarr 0.1.9 33 s 2.9 GB
GDAL 3.13.3 34 s 2.2 GB

178 335 × 200 599 float64

writer wall time peak memory
terrazarr, 8 processes 314 s 0.7 GB
eopf-geozarr 0.11.0 stopped after 42 min, nothing written 30 GB cap
topozarr 0.1.9 1006 s 1.3 GB
GDAL 3.13.3 655 s 8.8 GB

The full comparison, on synthetic rasters as well, with the writers' characteristics and the correctness checks: benchmarks. The demo serves the WSF-3D Italy pyramid from a public bucket through TiTiler.

WSF dataset

The World Settlement Footprint (WSF) is a global map of human settlements at 10 m resolution. It shows where built-up areas are and, for each settlement, the year it first appeared. It has been updated every six months since 2016, and population is planned as a further layer.

The WSF geozarr produced with terrazarr is published by MindEarth on Source Cooperative and powers the WSF platform.

Metrics of the conversion that produced it:

Layout

Parameter Value
Chunk shape 512 × 512 px
Shard shape 8192 × 8192 px (256 chunks)
Native-level shards 92,120
Compression Blosc with Zstandard
Projection EPSG:4326

Profiling

Parameter Value
Runtime levels 0–1 2 h 39 m
Runtime levels 2–12 31 m
Runtime total 3 h 10 m
Peak RSS 5.1 GB
Resources 8 workers × 4 GB

Authors and contributors

Origin and license

Derived from eopf_geozarr.conversion.geozarr of EOPF-Explorer/data-model, Copyright 2025 European Space Agency (ESA), written by Development Seed, Apache License 2.0.

Terrazarr is licensed under the Apache License 2.0 credited in NOTICE; see LICENSE and cite with CITATION.cff.

Metadata

Release files for terrazarr 0.1.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for terrazarr 0.1.4
File Size Uploaded
terrazarr-0.1.4.tar.gz 111.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for terrazarr 0.1.4
File Interpreter ABI Platform
terrazarr-0.1.4-py3-none-any.whl Python 3 none any Details

Total release size: 158.0 kB

Release files / terrazarr-0.1.4.tar.gz

Download URL terrazarr-0.1.4.tar.gz
Size 111.2 kB
Tags Source
SHA-256 checksum
How to use checksums
e3461df6a43b7072c45ae30aaf7342820d491da0a45a8734125852891d985353
BLAKE2b-256 checksum
How to use checksums
cac8fd7de300635148eb4fdaecdff5152567e84239db7022a6e725590ab817be
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / terrazarr-0.1.4-py3-none-any.whl

Download URL terrazarr-0.1.4-py3-none-any.whl
Size 46.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ecb5b2f1f8f1532b460c5858dbb9fecc93160d0288508c1e5dd414bc9ecc9ce8
BLAKE2b-256 checksum
How to use checksums
f4ed83cfbe9e0720e8f5c04d8ccb5efe6c3d4649ff18a34f483f072d6c89ec67
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.4 This release

2 release files

0.1.3

2 release files

0.1.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page