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, snow products, climate
reanalysis, DEMs and a hillshade, basins, and boundaries from countries and
counties to mountain ranges and glacier outlines — under a consistent API that
returns xarray objects (and GeoDataFrames for vector products). 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.
What a probe cannot see — a reprocessed collection, a republished file, a new
release (the next Census year, a new RGI version) — is caught by a weekly
upstream watch that opens one digest issue labelled
upstream-watch
and closes the previous one, carrying its unticked to-dos forward.
Last updated: 2026-09-29 22:45 UTC
| Data Source | Latest (Sep 29) | Sep 28 | Sep 23 | Sep 21 |
|---|---|---|---|---|
| AWDB stations (NRCS REST API) | ✅ | ✅ | ✅ | ✅ |
| CDEC stations (JSON data servlet) | ✅ | ✅ | ✅ | ✅ |
| BC snow stations (DataBC WFS) | ✅ | ✅ | ✅ | ✅ |
| NVE stations (HydAPI) | ✅ | ✅ | ✅ | ❌ |
| Yukon stations (AquaCache API) | ✅ | ✅ | ✅ | ✅ |
| Snow station Zarr archive (global_snow_networks) | ✅ | ✅ | ✅ | — |
| Snow station inventory (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
| Snow station archive tarball (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
| Snow station CSV (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
| Data Source | Latest (Sep 29) | Sep 28 | Sep 23 | Sep 21 |
|---|---|---|---|---|
| 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) | ✅ | ✅ | ✅ | ✅ |
| Data Source | Latest (Sep 29) | Sep 28 | Sep 23 | Sep 21 |
|---|---|---|---|---|
| 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) | ✅ | ✅ | ✅ | ✅ |
| Data Source | Latest (Sep 29) | Sep 28 | Sep 23 | Sep 21 |
|---|---|---|---|---|
| HLS L30 (CMR-STAC LPCLOUD) | ✅ | ✅ | ❌ | ✅ |
| HLS S30 (CMR-STAC LPCLOUD) | ✅ | — | — | — |
| HLS L30 COG read (CMR-STAC LPCLOUD, Earthdata Login) | ✅ | — | — | — |
| HLS S30 COG read (CMR-STAC LPCLOUD, Earthdata Login) | ✅ | — | — | — |
| HLS L30 (Planetary Computer) | ✅ | — | — | — |
| HLS S30 (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| PlanetScope (Planet Data API) | ✅ | ✅ | ✅ | ❌ |
| Sentinel-2 L2A (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| Sentinel-2 L2A (Earth Search) | ✅ | ✅ | ✅ | ✅ |
| Data Source | Latest (Sep 29) | Sep 28 | Sep 23 | Sep 21 |
|---|---|---|---|---|
| CHILI (GEE/CSP ERGo) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Earth Search) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Earth Engine) | ✅ | ✅ | ✅ | — |
| NASADEM (Planetary Computer) | ✅ | ✅ | ✅ | — |
| NASADEM (Earth Engine) | ✅ | ✅ | ✅ | — |
| SRTM GL1 (Earth Engine) | ✅ | ✅ | ✅ | — |
| 3DEP seamless (Planetary Computer) | ✅ | ✅ | ✅ | — |
| 3DEP 10 m (Earth Engine) | ✅ | ✅ | ✅ | — |
| ALOS World 3D (Planetary Computer) | ✅ | ✅ | ✅ | — |
| ALOS World 3D (Earth Engine) | ✅ | ✅ | ✅ | — |
| Natural Earth hillshade (S3) | ✅ | ✅ | ✅ | — |
| Data Source | Latest (Sep 29) | Sep 28 | Sep 23 | Sep 21 |
|---|---|---|---|---|
| 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) | ✅ | ✅ | ✅ | ✅ |
| Data Source | Latest (Sep 29) | Sep 28 | Sep 23 | Sep 21 |
|---|---|---|---|---|
| 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 | ✅ | ✅ | ✅ | ✅ |
| Data Source | Latest (Sep 29) | Sep 28 | Sep 23 | Sep 21 |
|---|---|---|---|---|
| Natural Earth countries (naciscdn) | ✅ | ✅ | ✅ | — |
| geoBoundaries countries (ADM0, gbOpen) | ✅ | ✅ | ✅ | — |
| Natural Earth states and provinces (naciscdn) | ✅ | ✅ | ✅ | — |
| US Census states (cartographic boundaries) | ✅ | ✅ | ✅ | — |
| geoBoundaries states and provinces (ADM1, gbOpen) | ✅ | ✅ | ✅ | — |
| US Census counties (cartographic boundaries) | ✅ | ✅ | ✅ | — |
| geoBoundaries admin units (ADM2, gbOpen) | ✅ | ✅ | ✅ | — |
| RGI 7.0 glacier outlines (NSIDC) | ✅ | ❌ | ✅ | — |
| RGI 6.0 glacier outlines (NSIDC) | ✅ | ❌ | ✅ | — |
| RGI 6.0 glacier outlines (OGGM mirror) | ✅ | ✅ | ✅ | — |
| GMBA mountains (EarthEnv) | ✅ | ✅ | ✅ | — |
| Natural Earth vector layers (naciscdn) | ✅ | ✅ | ✅ | — |
| Data Source | Latest (Sep 29) | Sep 28 | Sep 23 | Sep 21 |
|---|---|---|---|---|
| ARCO-ERA5 (GCS anonymous) | ✅ | ✅ | ✅ | ✅ |
| ERA5 (Google Earth Engine) | ✅ | ✅ | ✅ | ✅ |
| Köppen-Geiger classification (figshare) | ✅ | ✅ | ✅ | ✅ |
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 --all # every environment (plain `pixi install` sets up only the default one)
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-fast # build the site without running the gallery
pixi run -e docs docs-serve # serve the built site at http://localhost:8000Some 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_USERNAME + EARTHDATA_PASSWORD (recommended), a ~/.netrc entry from earthaccess.login(persist=True), or EARTHDATA_TOKEN. A token alone does not reach NSIDC's on-premises files (RGI glacier outlines, the NSIDC-0768 snow classification) or ASF's OPERA datapool, and user tokens expire after about 60 days |
urs.earthdata.nasa.gov |
| NVE HydAPI (Norwegian stations) | NVE_API_KEY |
hydapi.nve.no |
| Planet (PlanetScope, commercial) | PL_API_KEY, or planet auth login |
planet.com |
35 of the 41 products have at least one route that needs no account; each product's catalog page says which.
41 products across 9 themes, each with one or more access routes:
| theme | products | open without an account |
|---|---|---|
| stations | awdb-stations, cdec-stations, databc-stations, nve-stations, snow-station-archive, yukon-stations |
5 of 6 |
| snow | modis-snow, mountain-snow-mask, snodas, snow-classification, ucla-snow-reanalysis, viirs-snow |
4 of 6 |
| sar | sentinel-1-local-incidence-angle, sentinel-1-rtc |
2 of 2 |
| optical | hls, planetscope, sentinel-2-l2a |
2 of 3 |
| terrain | 3dep, alos-dem, chili, copernicus-dem, gedtm30, hillshade, nasadem, srtm |
7 of 8 |
| land | esa-worldcover, forest-cover-fraction, nlcd |
2 of 3 |
| hydro | grdc-major-river-basins, grdc-wmo-basins, huc, hydrobasins |
4 of 4 |
| boundaries | admin-boundaries, countries, gmba-mountains, natural-earth-vectors, rgi-glaciers, states-provinces, us-counties |
7 of 7 |
| climate | era5, koppen-geiger |
2 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_gdf = esd.stations.inventory(aoi, daily_only=True)
obs_ds = esd.stations.load(inv_gdf, variables=["swe", "snwd"], time="2023-10/2024-09")
# Terrain, SAR, and snow water equivalent — lazy, Dask-backed, CRS attached
dem_da = esd.terrain.dem.load(aoi) # Copernicus GLO-30 (default)
dem_da = esd.terrain.dem.load(aoi, product="3dep") # or NASADEM, SRTM, 3DEP, ALOS
dem_da = esd.terrain.dem.load(aoi, product="gedtm30") # global bare-earth DTM (OpenTopography)
s1_ds = esd.sar.sentinel1.load(aoi, "2024-03", units="dB") # Sentinel-1 RTC
snodas_ds = esd.snow.snodas.load(aoi, "2024-03") # SNODAS, no account
# Boundaries as GeoDataFrames: states, counties, mountain ranges, glaciers
wa_gdf = esd.boundaries.admin.states(aoi) # Washington (US Census)
ranges_gdf = esd.boundaries.mountains.load(aoi) # GMBA Mountain Inventory v2
glaciers_gdf = esd.boundaries.glaciers.load(aoi) # RGI 7.0 (Earthdata username + password); RGI 6.0 from source="oggm-mirror" needs none
# Optical, masked, and a snow index written out rather than hidden in a helper
s2_ds = esd.optical.sentinel2.load(aoi, "2024-03", mask="scl-default")
ndsi_da = (s2_ds["green"] - s2_ds["swir16"]) / (s2_ds["green"] + s2_ds["swir16"])
# Maps with equal aspect, a scale bar, and a graticule; legends from CF flags
ax = esd.plotting.map(dem_da, cmap="terrain")
esd.plotting.add_outline(ax, glaciers_gdf) # vectors in the map's CRS
esd.plotting.categorical(esd.land.landcover.load(aoi))
esd.plotting.timeseries(obs_ds["swe"]) # calendar dates, units in [ ]
# What is available, and what it needs
esd.catalog.search("swe")
esd.catalog.describe("snodas")
esd.auth.status()Coming from 0.0.x? The old module API (remote_sensing.get_*,
automatic_weather_stations.StationCollection, …) was deprecated in 0.2 and
removed in 0.3; the migration guide
maps every old name to its replacement.
Executed example gallery, data catalog, and API reference: https://egagli.github.io/easysnowdata
Contributions welcome! See CONTRIBUTING for guidelines.
If you use easysnowdata in your research, please cite the Zenodo archive:
