A Python package to easily retrieve data relevant to snow science.
easysnowdata unifies access to a wide range of snow-relevant geospatial
datasets — weather stations, satellite imagery, climate reanalysis, DEMs, and
more — under a consistent API that returns xarray objects. The emphasis is on
minimising downloads and local computation by leveraging cloud-optimised data
formats wherever possible.
One executed script per product — browse them, each with the code, the figure and a downloadable notebook.
Every route of every product is probed weekly. A failure opens an issue
labelled data-source
and a recovery closes it; latency and DMR++ readiness are on the
status page.
Last updated: 2026-09-17 21:39 UTC
| Data Source | Latest (Sep 17) | Sep 14 | Sep 7 | Aug 31 |
|---|---|---|---|---|
| AWDB stations (NRCS REST API) | ✅ | — | — | — |
| CDEC stations (JSON data servlet) | ✅ | — | — | — |
| BC snow stations (DataBC WFS) | ✅ | — | — | — |
| NVE stations (HydAPI) | — | — | — | |
| Yukon stations (AquaCache API) | ✅ | — | — | — |
| SNOTEL/CCSS station list (GitHub) | ✅ | ✅ | ✅ | ✅ |
| Snow station archive tarball (global_snow_networks) | ✅ | — | — | — |
| SNOTEL/CCSS station CSV (GitHub) | ✅ | ✅ | ✅ | ✅ |
| ARCO-ERA5 (GCS anonymous) | ✅ | ✅ | ✅ | ✅ |
| ERA5 (Google Earth Engine) | ✅ | ✅ | ✅ | ✅ |
| Köppen-Geiger classification (figshare) | ✅ | ✅ | ✅ | ✅ |
| HUC geometries (USGS WBD REST) | ✅ | — | — | — |
| HUC geometries (GEE/USGS WBD) | ✅ | ✅ | ✅ | ✅ |
| HydroATLAS basins (figshare) | ✅ | ✅ | ✅ | ✅ |
| HydroBASINS (HydroSHEDS regional zip) | ✅ | — | — | — |
| HydroBASINS (GEE/HydroATLAS) | ✅ | — | — | — |
| GRDC major river basins (World Bank) | ✅ | ✅ | ✅ | ✅ |
| GRDC WMO basins | ❌ | ❌ | ❌ | ❌ |
| MODIS snow cover MOD10A1F (NASA NSIDC) | ✅ | — | — | — |
| MODIS snow cover MOD10A1 (Planetary Computer) | ✅ | — | — | — |
| Mountain snow mask (Zenodo) | ✅ | ✅ | ✅ | ✅ |
| SNODAS (NSIDC G02158) | ✅ | — | — | — |
| SNODAS (GEE/Climate Engine) | ✅ | ✅ | ✅ | ✅ |
| Sturm & Liston snow classification (NSIDC-0768) | ✅ | — | — | — |
| Sturm & Liston snow classification (Azure) | ✅ | ✅ | ✅ | ✅ |
| UCLA Snow Reanalysis (NASA NSIDC) | ✅ | |||
| HMA Snow Reanalysis (NASA NSIDC) | ✅ | — | — | — |
| VIIRS snow cover VNP10A1F (NASA NSIDC) | ✅ | — | — | — |
| Forest cover fraction (Zenodo) | ✅ | ✅ | ✅ | ✅ |
| Forest cover fraction (GEE/CGLS-LC100) | ✅ | — | — | — |
| ESA WorldCover (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| ESA WorldCover (AWS bucket) | ✅ | — | — | — |
| Annual NLCD (GEE community asset) | ✅ | — | — | — |
| NLCD (GEE/USGS) | ✅ | ✅ | ✅ | ✅ |
| HLS L30 (CMR-STAC LPCLOUD) | ✅ | — | — | — |
| HLS S30 (Planetary Computer) | ✅ | — | — | — |
| PlanetScope (Planet Data API) | — | — | — | |
| Sentinel-2 L2A (Planetary Computer) | ✅ | — | — | — |
| Sentinel-2 L2A (Earth Search) | ✅ | — | — | — |
| Sentinel-1 RTC (Planetary Computer) | ✅ | — | — | — |
| Sentinel-1 RTC OPERA (CMR-STAC ASF) | ✅ | — | — | — |
| Sentinel-1 RTC OPERA (Earth Engine) | ✅ | — | — | — |
| Sentinel-1 static layers (CMR-STAC ASF) | ✅ | — | — | — |
| Copernicus DEM for the incidence angle (Planetary Computer) | ✅ | — | — | — |
| Sentinel-1 GRD angle band (Earth Engine) | ✅ | — | — | — |
| CHILI (GEE/CSP ERGo) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Earth Search) | ✅ | — | — | — |
pip install easysnowdataconda install -c conda-forge easysnowdatamamba install -c conda-forge easysnowdataDevelopment install (with pixi)
git clone https://github.com/egagli/easysnowdata.git
cd easysnowdata
pixi install # sets up the environments
pixi run -e test-py313 test-unit # offline tests (no network, no credentials)
pixi run -e test-py313 test-live # live tests against the data providers (credentialed ones skip without secrets)
pixi run -e docs docs-serve # preview the docs locallySome data sources need free accounts and credentials passed as environment variables:
| Service | Env vars | Sign-up |
|---|---|---|
| Google Earth Engine | EARTHENGINE_TOKEN (or ~/.config/earthengine/credentials from ee.Authenticate()) |
earthengine.google.com |
| NASA Earthdata | EARTHDATA_TOKEN (recommended), or EARTHDATA_USERNAME + EARTHDATA_PASSWORD, or a ~/.netrc entry from earthaccess.login(persist=True) |
urs.earthdata.nasa.gov |
Planetary Computer and anonymous GCS access require no credentials.
28 products across 8 themes, each with one or more access routes:
| theme | products | open without an account |
|---|---|---|
| climate | era5, koppen-geiger |
2 of 2 |
| hydro | grdc-major-river-basins, grdc-wmo-basins, huc, hydrobasins |
4 of 4 |
| land | esa-worldcover, forest-cover-fraction, nlcd |
2 of 3 |
| optical | hls, planetscope, sentinel-2-l2a |
2 of 3 |
| sar | sentinel-1-local-incidence-angle, sentinel-1-rtc |
2 of 2 |
| snow | modis-snow, mountain-snow-mask, snodas, snow-classification, ucla-snow-reanalysis, viirs-snow |
4 of 6 |
| stations | awdb-stations, cdec-stations, databc-stations, nve-stations, snow-station-archive, yukon-stations |
5 of 6 |
| terrain | chili, copernicus-dem |
1 of 2 |
Every product's routes, resolution, credentials, licence and health are on its own page: https://egagli.github.io/easysnowdata/catalog/.
import easysnowdata as esd
aoi = (-121.94, 46.72, -121.54, 46.99) # Mount Rainier; any AOI form works
# Snow stations: which are here, then one water year of observations
inv = esd.stations.inventory(aoi, daily_only=True)
obs = esd.stations.load(inv, variables=["swe", "snwd"], time="2023-10/2024-09")
# Terrain, SAR and snow water equivalent — lazy, Dask-backed, CRS attached
dem = esd.terrain.dem.load(aoi) # Copernicus GLO-30
s1 = esd.sar.sentinel1.load(aoi, "2024-03", units="dB") # Sentinel-1 RTC
swe = esd.snow.snodas.load(aoi, "2024-03") # SNODAS, no account
# Optical, masked and turned into a snow index
s2 = esd.optical.sentinel2.load(aoi, "2024-03", mask="scl-default")
ndsi = esd.processing.ndsi(s2)
# Categorical products carry CF flag attrs, so the legend draws itself
esd.plotting.categorical(esd.land.landcover.load(aoi))
# What is available, and what it needs
esd.catalog.search("swe")
esd.catalog.describe("snodas")
esd.auth.status()The pre-0.1 API (easysnowdata.remote_sensing.get_*,
automatic_weather_stations.StationCollection, …) still works and emits a
DeprecationWarning naming its replacement. It is removed one minor release
after 0.1.
Full API reference and example notebooks: https://egagli.github.io/easysnowdata
Contributions welcome! See CONTRIBUTING for guidelines.
If you use easysnowdata in your research, please cite the Zenodo archive:
