Native-grid Google Earth Engine downloader with optional alignment-aware Zarr stacking.
Project description
edown
edown is a Google Earth Engine downloader that discovers images for a location and time range, downloads each image in its native grid as GeoTIFF, and can optionally build Zarr stacks for grid-compatible groups.
What It Does
- Searches an ImageCollection by date range and AOI.
- Preserves each image's native CRS and transform instead of forcing a common projection.
- Downloads intersecting chunks in parallel across multiple images.
- Writes a run manifest with discovery, download, and stack metadata.
- Builds Zarr outputs only when images share an alignment signature.
Installation
python -m pip install edown
edown supports Python 3.9 through 3.14.
For local development:
python -m pip install -e ".[dev,stack,dask]"
Authentication
edown prefers Earth Engine service-account credentials when both of these environment variables are set:
GEE_SERVICE_ACCOUNTGEE_SERVICE_ACCOUNT_KEY
Otherwise it tries, in order:
- persistent Earth Engine user credentials
- Google application default credentials
If both user-auth and ADC refresh tokens are stale, reauthenticate before running downloads.
CLI
Search only:
edown search \
--collection-id COPERNICUS/S2_SR_HARMONIZED \
--start-date 2024-06-01 \
--end-date 2024-06-07 \
--bbox -0.15 51.48 0.02 51.56 \
--band B4 \
--band B8 \
--manifest-path manifests/search.json
Download native-grid GeoTIFFs:
edown download \
--collection-id COPERNICUS/S2_SR_HARMONIZED \
--start-date 2024-06-01 \
--end-date 2024-06-07 \
--geojson docs/examples/aoi.geojson \
--band B4 \
--band B8 \
--output-root ./data
Build Zarr stacks from compatible groups:
edown stack \
--manifest-path manifests/run.json \
--output-root ./data
Run the bundled end-to-end Sentinel-2 example:
python examples/s2_find_download_stack.py --output-root ./data/live-s2
Python API
from pathlib import Path
from edown import AOI, DownloadConfig, download_images
config = DownloadConfig(
collection_id="COPERNICUS/S2_SR_HARMONIZED",
start_date="2024-06-01",
end_date="2024-06-07",
aoi=AOI.from_bbox((-0.15, 51.48, 0.02, 51.56)),
bands=("B4", "B8"),
output_root=Path("data"),
)
summary = download_images(config)
print(summary.manifest_path)
Live Integration Test
The default test suite is mocked and offline. For a real end-to-end Sentinel-2 smoke test, install the stack extras:
python -m pip install -e ".[dev,stack]"
Then run:
export EDOWN_RUN_LIVE_TESTS=1
python -m pytest -s tests/test_live_s2.py
Default live settings:
- collection:
COPERNICUS/S2_SR_HARMONIZED - dates:
2024-06-01through2024-06-03 - bbox:
-0.1278,51.5072,-0.1270,51.5078 - bands:
B4,B8
You can override them with:
EDOWN_LIVE_COLLECTION_IDEDOWN_LIVE_START_DATEEDOWN_LIVE_END_DATEEDOWN_LIVE_BBOXEDOWN_LIVE_BANDS
This requires valid Earth Engine authentication, via either:
GEE_SERVICE_ACCOUNTandGEE_SERVICE_ACCOUNT_KEY(path to a service-account JSON key file)- existing local Earth Engine credentials
- valid Google application default credentials
Notes
--chunk-sizeis only used as an exact size when--chunk-size-mode fixedis set.- In the default
automode,edownestimates chunk sizes per image from the AOI window and request byte limits.
Development
python -m pytestruff check .mypy srcpython -m build
Docs are built with MkDocs Material and published to GitHub Pages from GitHub Actions.
Project details
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 edown-0.2.1.tar.gz.
File metadata
- Download URL: edown-0.2.1.tar.gz
- Upload date:
- Size: 224.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
006ea56b3e560d36a336d38d22c7cd7643f6ee2f41ae77c0b7fac78a30e3c98c
|
|
| MD5 |
c0f941237a6cbd595e54e7bce602fa0e
|
|
| BLAKE2b-256 |
173a44834fc46846b713533aa194af28e940548c7e09573c5464377b736ab995
|
Provenance
The following attestation bundles were made for edown-0.2.1.tar.gz:
Publisher:
publish.yml on MarcYin/edown
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edown-0.2.1.tar.gz -
Subject digest:
006ea56b3e560d36a336d38d22c7cd7643f6ee2f41ae77c0b7fac78a30e3c98c - Sigstore transparency entry: 1225631896
- Sigstore integration time:
-
Permalink:
MarcYin/edown@4355be15fb81a148576836fd71494ff013f664f1 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/MarcYin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4355be15fb81a148576836fd71494ff013f664f1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file edown-0.2.1-py3-none-any.whl.
File metadata
- Download URL: edown-0.2.1-py3-none-any.whl
- Upload date:
- Size: 34.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d88542077487556a1c56c4bc0662c47a275fa3041475c679ef76f95998689c38
|
|
| MD5 |
f74147e5f9e4184b718772d6482bb249
|
|
| BLAKE2b-256 |
7405f8080277ca4e39422956b9ba76cdceed48247a3bfd4e44a7f65e18bd2c01
|
Provenance
The following attestation bundles were made for edown-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on MarcYin/edown
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edown-0.2.1-py3-none-any.whl -
Subject digest:
d88542077487556a1c56c4bc0662c47a275fa3041475c679ef76f95998689c38 - Sigstore transparency entry: 1225632098
- Sigstore integration time:
-
Permalink:
MarcYin/edown@4355be15fb81a148576836fd71494ff013f664f1 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/MarcYin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4355be15fb81a148576836fd71494ff013f664f1 -
Trigger Event:
push
-
Statement type: