Skip to content

About

package for snow science data, providing streamlined access to satellite imagery (Sentinel-1/2, HLS, MODIS, etc), weather station data, climate reanalysis, land cover data, DEMs, and derived snow products as xarray objects.

Topics

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Repository files navigation

easysnowdata

PyPI conda-forge DOI CI

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.

Gallery

easysnowdata example gallery

One executed script per product — browse them, each with the code, the figure, and a downloadable notebook.

Data Source Status

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. The same digest lists datasets nobody has told us about yet: new snow, ice and frozen-ground collections in NASA's CMR, and new collections on Planetary Computer, Earth Search and both Earth Engine catalogs, under "Worth adding" when they are about the cryosphere.

Last updated: 2026-10-12 08:31 UTC
⚠️ = skipped (credentials not available in this run). Latency and virtualization probes are on the status page.

Stations (esd.stations)

Data Source Latest (Oct 12) Oct 5 Sep 29 Sep 28
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) ✅ ✅ ✅ ✅

Snow (esd.snow)

Data Source Latest (Oct 12) Oct 5 Sep 29 Sep 28
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) ✅ ✅ ✅ ✅

SAR (esd.sar)

Data Source Latest (Oct 12) Oct 5 Sep 29 Sep 28
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) ✅ ✅ ✅ ✅

Optical imagery (esd.optical)

Data Source Latest (Oct 12) Oct 5 Sep 29 Sep 28
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) ✅ ✅ ✅ ✅

Terrain (esd.terrain)

Data Source Latest (Oct 12) Oct 5 Sep 29 Sep 28
CHILI (GEE/CSP ERGo) ✅ ✅ ✅ ✅
Copernicus DEM (Planetary Computer) ✅ ✅ ✅ ✅
Copernicus DEM (Earth Search) ✅ ✅ ✅ ✅
Copernicus DEM (Earth Engine) ✅ ✅ ✅ ✅
Copernicus DEM (OpenTopography) ✅ ✅ — —
NASADEM (Planetary Computer) ✅ ✅ ✅ ✅
NASADEM (Earth Engine) ✅ ✅ ✅ ✅
NASADEM (OpenTopography) ✅ ✅ — —
SRTM GL1 (OpenTopography) ✅ ✅ — —
SRTM GL1 (Earth Engine) ✅ ✅ ✅ ✅
3DEP seamless (Planetary Computer) ✅ ✅ ✅ ✅
3DEP 10 m (Earth Engine) ✅ ✅ ✅ ✅
ALOS World 3D (Planetary Computer) ✅ ✅ ✅ ✅
ALOS World 3D (Earth Engine) ✅ ✅ ✅ ✅
ALOS World 3D (OpenTopography) ✅ ✅ — —
GEDTM30 (OpenTopography) ✅ ✅ — —
Natural Earth hillshade (S3) ✅ ✅ ✅ ✅

Land cover (esd.land)

Data Source Latest (Oct 12) Oct 5 Sep 29 Sep 28
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) ✅ ✅ ✅ ✅

Hydrography (esd.hydro)

Data Source Latest (Oct 12) Oct 5 Sep 29 Sep 28
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 ✅ ✅ ✅ ✅

Boundaries (esd.boundaries)

Data Source Latest (Oct 12) Oct 5 Sep 29 Sep 28
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) ✅ ✅ ✅ ✅

Climate (esd.climate)

Data Source Latest (Oct 12) Oct 5 Sep 29 Sep 28
ARCO-ERA5 (GCS anonymous) ✅ ✅ ✅ ✅
ERA5 (Google Earth Engine) ✅ ✅ ✅ ✅
Köppen-Geiger classification (figshare) ✅ ✅ ✅ ✅

Installation

pip install easysnowdata
conda install -c conda-forge easysnowdata
mamba install -c conda-forge easysnowdata

Development 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:8000

Services that require account setup

Some 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
RIHMI АИСОРИ-М (Russian snow surveys, RIHMIClient) AISORI_USERNAME + AISORI_PASSWORD aisori-m.meteo.ru
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.

What is in it

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/.

Quick Start

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.

Documentation

Executed example gallery, data catalog, and API reference: https://egagli.github.io/easysnowdata

Contributing

Contributions welcome! See CONTRIBUTING for guidelines.

Citing

If you use easysnowdata in your research, please cite the Zenodo archive:

DOI

About

package for snow science data, providing streamlined access to satellite imagery (Sentinel-1/2, HLS, MODIS, etc), weather station data, climate reanalysis, land cover data, DEMs, and derived snow products as xarray objects.

Topics

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Releases

Used by

Contributors

Languages