easysnowdata 0.3.2__tar.gz → 0.3.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/CHANGELOG.md +27 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/CITATION.cff +2 -2
- easysnowdata-0.3.4/PKG-INFO +353 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/POTENTIAL_DATA_PRODUCTS_SOURCES_AND_EXAMPLES.md +359 -28
- easysnowdata-0.3.4/README.md +295 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/REVAMP_PLAN.md +29 -27
- easysnowdata-0.3.4/WATCHLIST.toml +589 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/__init__.py +2 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/_version.py +2 -2
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/__init__.py +2 -0
- easysnowdata-0.3.4/easysnowdata/auth/aisori.py +49 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/earthdata.py +137 -32
- easysnowdata-0.3.4/easysnowdata/boundaries/__init__.py +39 -0
- easysnowdata-0.3.4/easysnowdata/boundaries/admin.py +660 -0
- easysnowdata-0.3.4/easysnowdata/boundaries/glaciers.py +427 -0
- easysnowdata-0.3.4/easysnowdata/boundaries/mountains.py +192 -0
- easysnowdata-0.3.4/easysnowdata/boundaries/natural_earth.py +172 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/_models.py +6 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/_registry.py +4 -4
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/health.py +109 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/pages.py +73 -13
- easysnowdata-0.3.4/easysnowdata/climate/__init__.py +12 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/climate/era5.py +24 -19
- easysnowdata-0.3.4/easysnowdata/climate/indices.py +736 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/climate/koppen_geiger.py +10 -9
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/hydro/__init__.py +1 -1
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/hydro/basins.py +5 -10
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/land/forest_cover.py +3 -2
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/land/landcover.py +13 -11
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/land/nlcd.py +5 -4
- easysnowdata-0.3.4/easysnowdata/optical/__init__.py +16 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/optical/hls.py +84 -57
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/optical/planetscope.py +175 -43
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/optical/sentinel2.py +21 -18
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/plotting/__init__.py +94 -46
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/categorical.py +7 -7
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/contract.py +77 -19
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/masks.py +10 -10
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/optical.py +45 -29
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/sar.py +26 -26
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/snow.py +3 -3
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/wateryear.py +7 -4
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/__init__.py +8 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/earthdata.py +56 -1
- easysnowdata-0.3.4/easysnowdata/providers/opentopography.py +230 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/stac.py +8 -0
- easysnowdata-0.3.4/easysnowdata/providers/table_http.py +33 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/sar/__init__.py +1 -1
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/sar/sentinel1.py +59 -55
- easysnowdata-0.3.4/easysnowdata/snow/__init__.py +59 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/modis.py +25 -14
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/mountain_snow_mask.py +6 -5
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/snodas.py +9 -8
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/snow_classification.py +34 -32
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/ucla_sr.py +7 -6
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/viirs.py +19 -18
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/__init__.py +9 -8
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/_adapter.py +15 -15
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/_catalog.py +12 -7
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/_frames.py +52 -42
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/archive.py +38 -35
- easysnowdata-0.3.4/easysnowdata/stations/clients/README.md +2844 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/__init__.py +57 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/_common.py +193 -1
- easysnowdata-0.3.4/easysnowdata/stations/clients/alberta/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/alberta/alberta_client.py +991 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/canswe/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/canswe/_format.py +1417 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/canswe/canswe_client.py +187 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/cdec/cdec_client.py +26 -26
- easysnowdata-0.3.4/easysnowdata/stations/clients/ceaza/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/ceaza/ceaza_client.py +940 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/databc/databc_client.py +10 -10
- easysnowdata-0.3.4/easysnowdata/stations/clients/dwd/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/dwd/dwd_client.py +967 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/ghcnd/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/ghcnd/ghcnd_client.py +875 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/hydroquebec/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/hydroquebec/hydroquebec_client.py +1019 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/norswe/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/norswe/norswe_client.py +239 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/_aisori.py +501 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/rihmi_client.py +1693 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/route_survey_stations.csv +522 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/snow_cover_stations.csv +625 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/slf/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/slf/slf_client.py +1068 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/snih/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/snih/snih_client.py +1054 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/southern_andes/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/southern_andes/southern_andes_client.py +732 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/syke/__init__.py +3 -0
- easysnowdata-0.3.4/easysnowdata/stations/clients/syke/syke_client.py +748 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/yukon/yukon_client.py +28 -7
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/networks.py +1 -1
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/terrain/__init__.py +7 -3
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/terrain/chili.py +9 -7
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/terrain/dem.py +330 -57
- easysnowdata-0.3.4/easysnowdata/terrain/hillshade.py +237 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/pyproject.toml +1 -1
- easysnowdata-0.3.4/scripts/gallery_fallback.py +227 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/make_montage.py +8 -1
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/update_readme_status.py +5 -2
- easysnowdata-0.3.4/scripts/watch.py +1330 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/conftest.py +6 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/make_fixtures.py +238 -0
- easysnowdata-0.3.4/tests/static/test_boundaries.py +552 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_snow_classification.py +12 -4
- easysnowdata-0.3.4/tests/static/test_terrain_dem.py +451 -0
- easysnowdata-0.3.4/tests/static/test_terrain_hillshade.py +128 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_theme_common.py +12 -3
- easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/README.md +16 -0
- easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/route_semicolon.zip +0 -0
- easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/route_space.zip +0 -0
- easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/snow_cover_semicolon.zip +0 -0
- easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/snow_cover_space.zip +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_adapter.py +3 -1
- easysnowdata-0.3.4/tests/stations/test_alberta_client.py +493 -0
- easysnowdata-0.3.4/tests/stations/test_canswe_client.py +464 -0
- easysnowdata-0.3.4/tests/stations/test_ceaza_client.py +557 -0
- easysnowdata-0.3.4/tests/stations/test_clients_offline.py +923 -0
- easysnowdata-0.3.4/tests/stations/test_common_download.py +161 -0
- easysnowdata-0.3.4/tests/stations/test_dwd_client.py +390 -0
- easysnowdata-0.3.4/tests/stations/test_ghcnd_client.py +319 -0
- easysnowdata-0.3.4/tests/stations/test_hydroquebec_client.py +388 -0
- easysnowdata-0.3.4/tests/stations/test_norswe_client.py +215 -0
- easysnowdata-0.3.4/tests/stations/test_rihmi_client.py +679 -0
- easysnowdata-0.3.4/tests/stations/test_slf_client.py +503 -0
- easysnowdata-0.3.4/tests/stations/test_snih_client.py +599 -0
- easysnowdata-0.3.4/tests/stations/test_southern_andes_client.py +335 -0
- easysnowdata-0.3.4/tests/stations/test_syke_client.py +390 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_yukon_client.py +1 -1
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_auth.py +122 -31
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_catalog.py +47 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_docs_pages.py +12 -7
- easysnowdata-0.3.4/tests/test_gallery_fallback.py +128 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_health_reporting.py +11 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_montage.py +14 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_plotting.py +46 -0
- easysnowdata-0.3.4/tests/test_watch.py +860 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/fixtures/make_fixtures.py +1 -1
- easysnowdata-0.3.4/tests/timeseries/test_climate_indices.py +320 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_hls.py +17 -4
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_modis.py +17 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_planetscope.py +130 -0
- easysnowdata-0.3.2/PKG-INFO +0 -289
- easysnowdata-0.3.2/README.md +0 -231
- easysnowdata-0.3.2/WATCHLIST.toml +0 -281
- easysnowdata-0.3.2/easysnowdata/climate/__init__.py +0 -12
- easysnowdata-0.3.2/easysnowdata/optical/__init__.py +0 -14
- easysnowdata-0.3.2/easysnowdata/snow/__init__.py +0 -50
- easysnowdata-0.3.2/easysnowdata/stations/clients/README.md +0 -1102
- easysnowdata-0.3.2/easysnowdata/stations/clients/__init__.py +0 -18
- easysnowdata-0.3.2/scripts/watch.py +0 -757
- easysnowdata-0.3.2/tests/static/test_terrain_dem.py +0 -219
- easysnowdata-0.3.2/tests/stations/test_clients_offline.py +0 -372
- easysnowdata-0.3.2/tests/test_watch.py +0 -361
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/.editorconfig +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/.gitignore +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/.pre-commit-config.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/LICENSE +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/_gdal.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/aoi.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/_base.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/earthengine.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/nve.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/planet.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/planetary_computer.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/_access.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/config.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/land/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/gee.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/planet.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/raster_http.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/vector_http.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/zarr_cloud.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/awdb/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/awdb/awdb_client.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/cdec/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/databc/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/nve/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/nve/nve_client.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/yukon/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/temporal.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/check_data_sources.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/feedstock_requirements.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/report_health.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_cmr_lpcloud_hls_search_is_open.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_earth_search_sentinel2_search_with_time.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_health_first_byte_probe_replays.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_health_stac_probe_replays.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_planetary_computer_dem_search.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/fixtures/make_fixtures.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/cassettes/test_land_landcover/TestSearchRecorded.test_search_filters_by_version.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/cassettes/test_terrain_dem/TestSearchRecorded.test_search_on_earth_search.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/cassettes/test_terrain_dem/TestSearchRecorded.test_search_returns_tiles.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/conftest.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_hydro_basins.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_land_forest_cover.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_land_landcover.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_land_nlcd.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_snow_mountain_snow_mask.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_terrain_chili.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/conftest.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/fixtures/make_fixtures.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_adapter_offline.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_archive.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_awdb_client.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_cdec_client.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_databc_client.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_nve_client.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_aoi.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_config.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_credentials.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_easysnowdata.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_edges.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_feedstock_requirements.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_processing.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_providers.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_recorded.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_temporal.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/__init__.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_hls/test_search_cmr_lpcloud_is_open_and_labels_products.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_hls/test_search_planetary_computer_mirror.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_sentinel1/test_search_opera_rtc_is_open.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_sentinel1/test_search_planetary_computer.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_sentinel2/test_search_earth_search_collection_1.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_sentinel2/test_search_planetary_computer.yaml +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/conftest.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_contract.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_era5.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_koppen_geiger.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_sentinel1.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_sentinel2.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_snodas.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_ucla_sr.py +0 -0
- {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_viirs.py +0 -0
|
@@ -6,6 +6,33 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
|
|
6
6
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
8
|
<!-- insertion marker -->
|
|
9
|
+
## [v0.3.3](https://github.com/egagli/easysnowdata/releases/tag/v0.3.3) - 2026-10-21
|
|
10
|
+
|
|
11
|
+
<small>[Compare with v0.3.2](https://github.com/egagli/easysnowdata/compare/v0.3.2...v0.3.3)</small>
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- fix(snih): parse pre-1970 /Date()/ values on Windows ([5488a84](https://github.com/egagli/easysnowdata/commit/5488a8453c4bd07b607323e27f5a253ab1c5fc13) by Claude).
|
|
16
|
+
- fix(tests): read client sources as UTF-8 so the credential scan passes on Windows ([e57a543](https://github.com/egagli/easysnowdata/commit/e57a543a26c3a803e5736ef6a549f9213e0649c3) by Claude).
|
|
17
|
+
- fix(stations): RIHMI reads real AISORI-M exports; fixed-width layout, zips, column files ([4cb9bf5](https://github.com/egagli/easysnowdata/commit/4cb9bf541d8517aa6f63531e33cbb8b5a88a5d65) by Claude).
|
|
18
|
+
- fix(stations): bring the new clients to the established client conventions ([4b98936](https://github.com/egagli/easysnowdata/commit/4b98936252975bca81e3a1beaa031ef250c629f7) by Claude).
|
|
19
|
+
- fix(gallery): climate indices example reads SWE from the station archive; add a western-US analysis ([afa84ee](https://github.com/egagli/easysnowdata/commit/afa84eee7d46b9506613bec76deefebc11cbeb3e) by Claude).
|
|
20
|
+
- fix(planetscope): pair UDM2 with its scene, scale radiance with Planet's coefficients (#59) ([8c166c6](https://github.com/egagli/easysnowdata/commit/8c166c6a9ad243070f95ddab526bbfde3508ed74) by Eric Gagliano).
|
|
21
|
+
- fix(docs): gallery fallback uses POSIX page paths for git lookups (Windows) ([2db26ae](https://github.com/egagli/easysnowdata/commit/2db26ae9ed7d159c01473665f43744325e13fdaa) by egagli).
|
|
22
|
+
- fix(modis): name the sinusoidal grid for Planetary Computer loads ([e5eeaf4](https://github.com/egagli/easysnowdata/commit/e5eeaf4824d59e8e23f0f8c5da0dc251545df5d7) by egagli).
|
|
23
|
+
- fix(auth): bearer-token GDAL reads skip the HEAD request LP DAAC answers with 404 ([0728852](https://github.com/egagli/easysnowdata/commit/072885248021d2cf1433e86390681a14506bed5a) by egagli).
|
|
24
|
+
- fix(watch): name the product a change touches; stop routine moves looking new ([47d21ce](https://github.com/egagli/easysnowdata/commit/47d21ce7d4af24a798d51c5f1a2f3c66e5acdcab) by egagli).
|
|
25
|
+
- fix(health): probe HLS L30 and S30 on both routes, and the LPCLOUD reads ([cfd0634](https://github.com/egagli/easysnowdata/commit/cfd0634a059ead0274e18ee5f3483630296ed540) by egagli).
|
|
26
|
+
- fix(auth): NSIDC on-premises files log in with the password, even with a token set ([5827702](https://github.com/egagli/easysnowdata/commit/5827702291853895f97889e6e366dc49a079989d) by egagli).
|
|
27
|
+
- fix(auth): read an Earthdata token's expiry from the token, not from URS ([2951938](https://github.com/egagli/easysnowdata/commit/2951938646740dda547cf908b338efaba5005717) by egagli).
|
|
28
|
+
- fix(status): escape probe errors in the README tooltips ([826e7df](https://github.com/egagli/easysnowdata/commit/826e7dfd9c66f0de6f25427b4bed534bbb0c4348) by egagli).
|
|
29
|
+
- fix(boundaries): clearer health probes, Census 2025, explain NSIDC's login page ([0086513](https://github.com/egagli/easysnowdata/commit/008651397cd72abf3dc71437fb10d2d3c9b61e3d) by egagli).
|
|
30
|
+
- fix(plotting): graticule on global projected maps ([5d46dfa](https://github.com/egagli/easysnowdata/commit/5d46dfaf9732f5a0b331e36a6cfd52570b002e34) by egagli).
|
|
31
|
+
|
|
32
|
+
## [v0.3.2](https://github.com/egagli/easysnowdata/releases/tag/v0.3.2) - 2026-09-23
|
|
33
|
+
|
|
34
|
+
<small>[Compare with v0.3.1](https://github.com/egagli/easysnowdata/compare/v0.3.1...v0.3.2)</small>
|
|
35
|
+
|
|
9
36
|
## [v0.3.1](https://github.com/egagli/easysnowdata/releases/tag/v0.3.1) - 2026-09-22
|
|
10
37
|
|
|
11
38
|
<small>[Compare with v0.2.0](https://github.com/egagli/easysnowdata/compare/v0.2.0...v0.3.1)</small>
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: easysnowdata
|
|
3
|
+
Version: 0.3.4
|
|
4
|
+
Summary: A Python package to easily retrieve data relevant to snow science
|
|
5
|
+
Project-URL: Homepage, https://github.com/egagli/easysnowdata
|
|
6
|
+
Project-URL: Documentation, https://egagli.github.io/easysnowdata
|
|
7
|
+
Project-URL: Repository, https://github.com/egagli/easysnowdata
|
|
8
|
+
Project-URL: Bug Tracker, https://github.com/egagli/easysnowdata/issues
|
|
9
|
+
Author-email: Eric Gagliano <egagli@uw.edu>
|
|
10
|
+
License: MIT License
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: climate,geospatial,hydrology,remote-sensing,snow
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Natural Language :: English
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: GIS
|
|
21
|
+
Requires-Python: >=3.12
|
|
22
|
+
Requires-Dist: beautifulsoup4
|
|
23
|
+
Requires-Dist: contextily
|
|
24
|
+
Requires-Dist: dask
|
|
25
|
+
Requires-Dist: earthaccess>=0.17
|
|
26
|
+
Requires-Dist: earthengine-api
|
|
27
|
+
Requires-Dist: fsspec
|
|
28
|
+
Requires-Dist: gcsfs
|
|
29
|
+
Requires-Dist: geopandas>=1.1
|
|
30
|
+
Requires-Dist: h5netcdf
|
|
31
|
+
Requires-Dist: h5py
|
|
32
|
+
Requires-Dist: lxml
|
|
33
|
+
Requires-Dist: matplotlib
|
|
34
|
+
Requires-Dist: matplotlib-scalebar
|
|
35
|
+
Requires-Dist: numpy
|
|
36
|
+
Requires-Dist: odc-geo>=0.5
|
|
37
|
+
Requires-Dist: odc-stac>=0.5
|
|
38
|
+
Requires-Dist: pandas
|
|
39
|
+
Requires-Dist: planet>=3.6
|
|
40
|
+
Requires-Dist: planetary-computer
|
|
41
|
+
Requires-Dist: pooch
|
|
42
|
+
Requires-Dist: pyarrow
|
|
43
|
+
Requires-Dist: pyogrio>=0.12
|
|
44
|
+
Requires-Dist: pyproj
|
|
45
|
+
Requires-Dist: pystac-client>=0.8
|
|
46
|
+
Requires-Dist: pystac>=1.12
|
|
47
|
+
Requires-Dist: pyyaml
|
|
48
|
+
Requires-Dist: rasterio>=1.5
|
|
49
|
+
Requires-Dist: requests
|
|
50
|
+
Requires-Dist: rioxarray>=0.22
|
|
51
|
+
Requires-Dist: s3fs
|
|
52
|
+
Requires-Dist: shapely>=2
|
|
53
|
+
Requires-Dist: tqdm
|
|
54
|
+
Requires-Dist: xarray>=2026.2
|
|
55
|
+
Requires-Dist: xee>=0.1
|
|
56
|
+
Requires-Dist: zarr>=3.1
|
|
57
|
+
Description-Content-Type: text/markdown
|
|
58
|
+
|
|
59
|
+
# easysnowdata
|
|
60
|
+
|
|
61
|
+
[](https://pypi.python.org/pypi/easysnowdata)
|
|
62
|
+
[](https://anaconda.org/conda-forge/easysnowdata)
|
|
63
|
+
[](https://doi.org/10.5281/zenodo.14741501)
|
|
64
|
+
[](https://github.com/egagli/easysnowdata/actions/workflows/ci.yml)
|
|
65
|
+
|
|
66
|
+
**A Python package to easily retrieve data relevant to snow science.**
|
|
67
|
+
|
|
68
|
+
`easysnowdata` unifies access to a wide range of snow-relevant geospatial
|
|
69
|
+
datasets — weather stations, satellite imagery, snow products, climate
|
|
70
|
+
reanalysis, DEMs and a hillshade, basins, and boundaries from countries and
|
|
71
|
+
counties to mountain ranges and glacier outlines — under a consistent API that
|
|
72
|
+
returns xarray objects (and GeoDataFrames for vector products). The emphasis is
|
|
73
|
+
on minimising downloads and local computation by leveraging cloud-optimised
|
|
74
|
+
data formats wherever possible.
|
|
75
|
+
|
|
76
|
+
## Gallery
|
|
77
|
+
|
|
78
|
+
<!-- GALLERY_START -->
|
|
79
|
+
<!-- Built by scripts/make_montage.py from the thumbnails of the scheduled
|
|
80
|
+
docs build and published with the site, so this picture is always the
|
|
81
|
+
figures the package currently produces. Do not paste an upload here. -->
|
|
82
|
+
[](https://egagli.github.io/easysnowdata/auto_examples/index.html)
|
|
83
|
+
|
|
84
|
+
One executed script per product — [browse them](https://egagli.github.io/easysnowdata/auto_examples/index.html),
|
|
85
|
+
each with the code, the figure, and a downloadable notebook.
|
|
86
|
+
<!-- GALLERY_END -->
|
|
87
|
+
|
|
88
|
+
## Data Source Status
|
|
89
|
+
|
|
90
|
+
Every route of every product is probed weekly. A failure opens an issue
|
|
91
|
+
labelled [`data-source`](https://github.com/egagli/easysnowdata/issues?q=label%3Adata-source)
|
|
92
|
+
and a recovery closes it; latency and DMR++ readiness are on the
|
|
93
|
+
[status page](https://egagli.github.io/easysnowdata/status.html).
|
|
94
|
+
|
|
95
|
+
What a probe cannot see — a reprocessed collection, a republished file, a new
|
|
96
|
+
release (the next Census year, a new RGI version) — is caught by a weekly
|
|
97
|
+
[upstream watch](WATCHLIST.toml) that opens one digest issue labelled
|
|
98
|
+
[`upstream-watch`](https://github.com/egagli/easysnowdata/issues?q=label%3Aupstream-watch)
|
|
99
|
+
and closes the previous one, carrying its unticked to-dos forward. The same
|
|
100
|
+
digest lists datasets nobody has told us about yet: new snow, ice and frozen-ground
|
|
101
|
+
collections in NASA's CMR, and new collections on Planetary Computer, Earth Search
|
|
102
|
+
and both Earth Engine catalogs, under "Worth adding" when they are about the
|
|
103
|
+
cryosphere.
|
|
104
|
+
|
|
105
|
+
<!-- DATA_STATUS_START -->
|
|
106
|
+
_Last updated: 2026-10-26 08:22 UTC_
|
|
107
|
+
_⚠️ = skipped (credentials not available in this run). Latency and virtualization probes are on the [status page](https://egagli.github.io/easysnowdata/status.html)._
|
|
108
|
+
|
|
109
|
+
### Stations (`esd.stations`)
|
|
110
|
+
|
|
111
|
+
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|
|
112
|
+
| :---------- | :------: | :------: | :------: | :------: |
|
|
113
|
+
| AWDB stations (NRCS REST API) | ✅ | ✅ | ✅ | ✅ |
|
|
114
|
+
| CDEC stations (JSON data servlet) | ✅ | ✅ | ✅ | ✅ |
|
|
115
|
+
| BC snow stations (DataBC WFS) | ✅ | ✅ | ✅ | ✅ |
|
|
116
|
+
| NVE stations (HydAPI) | ✅ | ✅ | ✅ | ✅ |
|
|
117
|
+
| Yukon stations (AquaCache API) | ✅ | ✅ | ✅ | ✅ |
|
|
118
|
+
| Snow station Zarr archive (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
|
|
119
|
+
| Snow station inventory (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
|
|
120
|
+
| Snow station archive tarball (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
|
|
121
|
+
| Snow station CSV (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
|
|
122
|
+
|
|
123
|
+
### Snow (`esd.snow`)
|
|
124
|
+
|
|
125
|
+
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|
|
126
|
+
| :---------- | :------: | :------: | :------: | :------: |
|
|
127
|
+
| MODIS snow cover MOD10A1F (NASA NSIDC) | ✅ | ✅ | ✅ | ✅ |
|
|
128
|
+
| MODIS snow cover MOD10A1 (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
129
|
+
| Mountain snow mask (Zenodo) | ✅ | ✅ | ✅ | ✅ |
|
|
130
|
+
| SNODAS (NSIDC G02158) | ✅ | ✅ | ✅ | ✅ |
|
|
131
|
+
| SNODAS (GEE/Climate Engine) | ✅ | ✅ | ✅ | ✅ |
|
|
132
|
+
| Sturm & Liston snow classification (NSIDC-0768) | ✅ | ✅ | ✅ | ✅ |
|
|
133
|
+
| Sturm & Liston snow classification (Azure) | ✅ | ✅ | ✅ | ✅ |
|
|
134
|
+
| UCLA Snow Reanalysis (NASA NSIDC) | ✅ | ✅ | ✅ | ✅ |
|
|
135
|
+
| HMA Snow Reanalysis (NASA NSIDC) | ✅ | ✅ | ✅ | ✅ |
|
|
136
|
+
| VIIRS snow cover VNP10A1F (NASA NSIDC) | ✅ | ✅ | ✅ | ✅ |
|
|
137
|
+
|
|
138
|
+
### SAR (`esd.sar`)
|
|
139
|
+
|
|
140
|
+
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|
|
141
|
+
| :---------- | :------: | :------: | :------: | :------: |
|
|
142
|
+
| Sentinel-1 RTC (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
143
|
+
| Sentinel-1 RTC OPERA (CMR-STAC ASF) | ✅ | ✅ | ✅ | ✅ |
|
|
144
|
+
| Sentinel-1 RTC OPERA (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
|
|
145
|
+
| Sentinel-1 static layers (CMR-STAC ASF) | ✅ | ✅ | ✅ | ✅ |
|
|
146
|
+
| Copernicus DEM for the incidence angle (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
147
|
+
| Sentinel-1 GRD angle band (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
|
|
148
|
+
|
|
149
|
+
### Optical imagery (`esd.optical`)
|
|
150
|
+
|
|
151
|
+
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|
|
152
|
+
| :---------- | :------: | :------: | :------: | :------: |
|
|
153
|
+
| HLS L30 (CMR-STAC LPCLOUD) | ✅ | ✅ | ✅ | ✅ |
|
|
154
|
+
| HLS S30 (CMR-STAC LPCLOUD) | ✅ | ✅ | ✅ | ✅ |
|
|
155
|
+
| HLS L30 COG read (CMR-STAC LPCLOUD, Earthdata Login) | ✅ | ✅ | ✅ | ✅ |
|
|
156
|
+
| HLS S30 COG read (CMR-STAC LPCLOUD, Earthdata Login) | ✅ | ✅ | ✅ | ✅ |
|
|
157
|
+
| HLS L30 (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
158
|
+
| HLS S30 (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
159
|
+
| PlanetScope (Planet Data API) | ✅ | ✅ | ✅ | ✅ |
|
|
160
|
+
| Sentinel-2 L2A (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
161
|
+
| Sentinel-2 L2A (Earth Search) | ✅ | ✅ | ✅ | ✅ |
|
|
162
|
+
|
|
163
|
+
### Terrain (`esd.terrain`)
|
|
164
|
+
|
|
165
|
+
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|
|
166
|
+
| :---------- | :------: | :------: | :------: | :------: |
|
|
167
|
+
| CHILI (GEE/CSP ERGo) | ✅ | ✅ | ✅ | ✅ |
|
|
168
|
+
| Copernicus DEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
169
|
+
| Copernicus DEM (Earth Search) | ✅ | ✅ | ✅ | ✅ |
|
|
170
|
+
| Copernicus DEM (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
|
|
171
|
+
| Copernicus DEM (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
|
|
172
|
+
| NASADEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
173
|
+
| NASADEM (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
|
|
174
|
+
| NASADEM (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
|
|
175
|
+
| SRTM GL1 (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
|
|
176
|
+
| SRTM GL1 (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
|
|
177
|
+
| 3DEP seamless (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
178
|
+
| 3DEP 10 m (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
|
|
179
|
+
| ALOS World 3D (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
180
|
+
| ALOS World 3D (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
|
|
181
|
+
| ALOS World 3D (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
|
|
182
|
+
| GEDTM30 (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
|
|
183
|
+
| Natural Earth hillshade (S3) | ✅ | ✅ | ✅ | ✅ |
|
|
184
|
+
|
|
185
|
+
### Land cover (`esd.land`)
|
|
186
|
+
|
|
187
|
+
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|
|
188
|
+
| :---------- | :------: | :------: | :------: | :------: |
|
|
189
|
+
| Forest cover fraction (Zenodo) | ✅ | ✅ | <abbr title="ReadTimeout: HTTPSConnectionPool(host='zenodo.org', port=443): Read timed out. (">❌</abbr> | ✅ |
|
|
190
|
+
| Forest cover fraction (GEE/CGLS-LC100) | ✅ | ✅ | ✅ | ✅ |
|
|
191
|
+
| ESA WorldCover (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
|
|
192
|
+
| ESA WorldCover (AWS bucket) | ✅ | ✅ | ✅ | ✅ |
|
|
193
|
+
| Annual NLCD (GEE community asset) | ✅ | ✅ | ✅ | ✅ |
|
|
194
|
+
| NLCD (GEE/USGS) | ✅ | ✅ | ✅ | ✅ |
|
|
195
|
+
|
|
196
|
+
### Hydrography (`esd.hydro`)
|
|
197
|
+
|
|
198
|
+
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|
|
199
|
+
| :---------- | :------: | :------: | :------: | :------: |
|
|
200
|
+
| HUC geometries (USGS WBD REST) | ✅ | ✅ | ✅ | ✅ |
|
|
201
|
+
| HUC geometries (GEE/USGS WBD) | ✅ | ✅ | ✅ | ✅ |
|
|
202
|
+
| HydroATLAS basins (figshare) | ✅ | ✅ | ✅ | ✅ |
|
|
203
|
+
| HydroBASINS (HydroSHEDS regional zip) | ✅ | ✅ | ✅ | ✅ |
|
|
204
|
+
| HydroBASINS (GEE/HydroATLAS) | ✅ | ✅ | ✅ | ✅ |
|
|
205
|
+
| GRDC major river basins (World Bank) | ✅ | ✅ | ✅ | ✅ |
|
|
206
|
+
| GRDC WMO basins | ✅ | ✅ | ✅ | ✅ |
|
|
207
|
+
|
|
208
|
+
### Boundaries (`esd.boundaries`)
|
|
209
|
+
|
|
210
|
+
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|
|
211
|
+
| :---------- | :------: | :------: | :------: | :------: |
|
|
212
|
+
| Natural Earth countries (naciscdn) | ✅ | ✅ | ✅ | ✅ |
|
|
213
|
+
| geoBoundaries countries (ADM0, gbOpen) | ✅ | ✅ | ✅ | ✅ |
|
|
214
|
+
| Natural Earth states and provinces (naciscdn) | ✅ | ✅ | ✅ | ✅ |
|
|
215
|
+
| US Census states (cartographic boundaries) | ✅ | ✅ | ✅ | ✅ |
|
|
216
|
+
| geoBoundaries states and provinces (ADM1, gbOpen) | ✅ | ✅ | ✅ | ✅ |
|
|
217
|
+
| US Census counties (cartographic boundaries) | ✅ | ✅ | ✅ | ✅ |
|
|
218
|
+
| geoBoundaries admin units (ADM2, gbOpen) | ✅ | ✅ | ✅ | ✅ |
|
|
219
|
+
| RGI 7.0 glacier outlines (NSIDC) | ✅ | ✅ | ✅ | ✅ |
|
|
220
|
+
| RGI 6.0 glacier outlines (NSIDC) | ✅ | ✅ | ✅ | ✅ |
|
|
221
|
+
| RGI 6.0 glacier outlines (OGGM mirror) | ✅ | ✅ | ✅ | ✅ |
|
|
222
|
+
| GMBA mountains (EarthEnv) | ✅ | ✅ | ✅ | ✅ |
|
|
223
|
+
| Natural Earth vector layers (naciscdn) | ✅ | ✅ | ✅ | ✅ |
|
|
224
|
+
|
|
225
|
+
### Climate (`esd.climate`)
|
|
226
|
+
|
|
227
|
+
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|
|
228
|
+
| :---------- | :------: | :------: | :------: | :------: |
|
|
229
|
+
| ARCO-ERA5 (GCS anonymous) | ✅ | ✅ | ✅ | ✅ |
|
|
230
|
+
| ERA5 (Google Earth Engine) | ✅ | ✅ | ✅ | ✅ |
|
|
231
|
+
| Climate indices (CPC RONI) | ✅ | ✅ | — | — |
|
|
232
|
+
| Climate indices (NCEI PDO) | ✅ | ✅ | — | — |
|
|
233
|
+
| Climate indices (PSL MEI.v2) | ✅ | ✅ | — | — |
|
|
234
|
+
| Climate indices (PSL pdo.data) | ✅ | ✅ | — | — |
|
|
235
|
+
| Köppen-Geiger classification (figshare) | ✅ | ✅ | ✅ | ✅ |
|
|
236
|
+
<!-- DATA_STATUS_END -->
|
|
237
|
+
|
|
238
|
+
## Installation
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
pip install easysnowdata
|
|
242
|
+
```
|
|
243
|
+
```bash
|
|
244
|
+
conda install -c conda-forge easysnowdata
|
|
245
|
+
```
|
|
246
|
+
```bash
|
|
247
|
+
mamba install -c conda-forge easysnowdata
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Development install (with [pixi](https://pixi.sh))
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
git clone https://github.com/egagli/easysnowdata.git
|
|
254
|
+
cd easysnowdata
|
|
255
|
+
pixi install --all # every environment (plain `pixi install` sets up only the default one)
|
|
256
|
+
pixi run -e test-py313 test-unit # offline tests (no network, no credentials)
|
|
257
|
+
pixi run -e test-py313 test-live # live tests against the data providers (credentialed ones skip without secrets)
|
|
258
|
+
pixi run -e docs docs-fast # build the site without running the gallery
|
|
259
|
+
pixi run -e docs docs-serve # serve the built site at http://localhost:8000
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Services that require account setup
|
|
263
|
+
|
|
264
|
+
Some data sources need free accounts and credentials passed as environment variables:
|
|
265
|
+
|
|
266
|
+
| Service | Env vars | Sign-up |
|
|
267
|
+
|---------|----------|---------|
|
|
268
|
+
| Google Earth Engine | `EARTHENGINE_TOKEN` (or `~/.config/earthengine/credentials` from `ee.Authenticate()`) | [earthengine.google.com](https://earthengine.google.com) |
|
|
269
|
+
| 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](https://urs.earthdata.nasa.gov) |
|
|
270
|
+
| NVE HydAPI (Norwegian stations) | `NVE_API_KEY` | [hydapi.nve.no](https://hydapi.nve.no) |
|
|
271
|
+
| RIHMI АИСОРИ-М (Russian snow surveys, `RIHMIClient`) | `AISORI_USERNAME` + `AISORI_PASSWORD` | [aisori-m.meteo.ru](http://aisori-m.meteo.ru/waisori/registration.xhtml) |
|
|
272
|
+
| Planet (PlanetScope, commercial) | `PL_API_KEY`, or `planet auth login` | [planet.com](https://www.planet.com) |
|
|
273
|
+
|
|
274
|
+
35 of the 41 products have at least one route that needs no account; each product's catalog page says which.
|
|
275
|
+
|
|
276
|
+
## What is in it
|
|
277
|
+
|
|
278
|
+
<!-- CATALOG_START -->
|
|
279
|
+
42 products across 9 themes, each with one or more access routes:
|
|
280
|
+
|
|
281
|
+
| theme | products | open without an account |
|
|
282
|
+
| --- | --- | --- |
|
|
283
|
+
| **stations** | [`awdb-stations`](https://egagli.github.io/easysnowdata/catalog/awdb-stations.html), [`cdec-stations`](https://egagli.github.io/easysnowdata/catalog/cdec-stations.html), [`databc-stations`](https://egagli.github.io/easysnowdata/catalog/databc-stations.html), [`nve-stations`](https://egagli.github.io/easysnowdata/catalog/nve-stations.html), [`snow-station-archive`](https://egagli.github.io/easysnowdata/catalog/snow-station-archive.html), [`yukon-stations`](https://egagli.github.io/easysnowdata/catalog/yukon-stations.html) | 5 of 6 |
|
|
284
|
+
| **snow** | [`modis-snow`](https://egagli.github.io/easysnowdata/catalog/modis-snow.html), [`mountain-snow-mask`](https://egagli.github.io/easysnowdata/catalog/mountain-snow-mask.html), [`snodas`](https://egagli.github.io/easysnowdata/catalog/snodas.html), [`snow-classification`](https://egagli.github.io/easysnowdata/catalog/snow-classification.html), [`ucla-snow-reanalysis`](https://egagli.github.io/easysnowdata/catalog/ucla-snow-reanalysis.html), [`viirs-snow`](https://egagli.github.io/easysnowdata/catalog/viirs-snow.html) | 4 of 6 |
|
|
285
|
+
| **sar** | [`sentinel-1-local-incidence-angle`](https://egagli.github.io/easysnowdata/catalog/sentinel-1-local-incidence-angle.html), [`sentinel-1-rtc`](https://egagli.github.io/easysnowdata/catalog/sentinel-1-rtc.html) | 2 of 2 |
|
|
286
|
+
| **optical** | [`hls`](https://egagli.github.io/easysnowdata/catalog/hls.html), [`planetscope`](https://egagli.github.io/easysnowdata/catalog/planetscope.html), [`sentinel-2-l2a`](https://egagli.github.io/easysnowdata/catalog/sentinel-2-l2a.html) | 2 of 3 |
|
|
287
|
+
| **terrain** | [`3dep`](https://egagli.github.io/easysnowdata/catalog/3dep.html), [`alos-dem`](https://egagli.github.io/easysnowdata/catalog/alos-dem.html), [`chili`](https://egagli.github.io/easysnowdata/catalog/chili.html), [`copernicus-dem`](https://egagli.github.io/easysnowdata/catalog/copernicus-dem.html), [`gedtm30`](https://egagli.github.io/easysnowdata/catalog/gedtm30.html), [`hillshade`](https://egagli.github.io/easysnowdata/catalog/hillshade.html), [`nasadem`](https://egagli.github.io/easysnowdata/catalog/nasadem.html), [`srtm`](https://egagli.github.io/easysnowdata/catalog/srtm.html) | 7 of 8 |
|
|
288
|
+
| **land** | [`esa-worldcover`](https://egagli.github.io/easysnowdata/catalog/esa-worldcover.html), [`forest-cover-fraction`](https://egagli.github.io/easysnowdata/catalog/forest-cover-fraction.html), [`nlcd`](https://egagli.github.io/easysnowdata/catalog/nlcd.html) | 2 of 3 |
|
|
289
|
+
| **hydro** | [`grdc-major-river-basins`](https://egagli.github.io/easysnowdata/catalog/grdc-major-river-basins.html), [`grdc-wmo-basins`](https://egagli.github.io/easysnowdata/catalog/grdc-wmo-basins.html), [`huc`](https://egagli.github.io/easysnowdata/catalog/huc.html), [`hydrobasins`](https://egagli.github.io/easysnowdata/catalog/hydrobasins.html) | 4 of 4 |
|
|
290
|
+
| **boundaries** | [`admin-boundaries`](https://egagli.github.io/easysnowdata/catalog/admin-boundaries.html), [`countries`](https://egagli.github.io/easysnowdata/catalog/countries.html), [`gmba-mountains`](https://egagli.github.io/easysnowdata/catalog/gmba-mountains.html), [`natural-earth-vectors`](https://egagli.github.io/easysnowdata/catalog/natural-earth-vectors.html), [`rgi-glaciers`](https://egagli.github.io/easysnowdata/catalog/rgi-glaciers.html), [`states-provinces`](https://egagli.github.io/easysnowdata/catalog/states-provinces.html), [`us-counties`](https://egagli.github.io/easysnowdata/catalog/us-counties.html) | 7 of 7 |
|
|
291
|
+
| **climate** | [`climate-indices`](https://egagli.github.io/easysnowdata/catalog/climate-indices.html), [`era5`](https://egagli.github.io/easysnowdata/catalog/era5.html), [`koppen-geiger`](https://egagli.github.io/easysnowdata/catalog/koppen-geiger.html) | 3 of 3 |
|
|
292
|
+
<!-- CATALOG_END -->
|
|
293
|
+
|
|
294
|
+
Every product's routes, resolution, credentials, licence, and health are on its
|
|
295
|
+
own page: <https://egagli.github.io/easysnowdata/catalog/>.
|
|
296
|
+
|
|
297
|
+
## Quick Start
|
|
298
|
+
|
|
299
|
+
```python
|
|
300
|
+
import easysnowdata as esd
|
|
301
|
+
|
|
302
|
+
aoi = (-121.94, 46.72, -121.54, 46.99) # Mount Rainier; any AOI form works
|
|
303
|
+
|
|
304
|
+
# Snow stations: which are here, then one water year of observations
|
|
305
|
+
inv_gdf = esd.stations.inventory(aoi, daily_only=True)
|
|
306
|
+
obs_ds = esd.stations.load(inv_gdf, variables=["swe", "snwd"], time="2023-10/2024-09")
|
|
307
|
+
|
|
308
|
+
# Terrain, SAR, and snow water equivalent — lazy, Dask-backed, CRS attached
|
|
309
|
+
dem_da = esd.terrain.dem.load(aoi) # Copernicus GLO-30 (default)
|
|
310
|
+
dem_da = esd.terrain.dem.load(aoi, product="3dep") # or NASADEM, SRTM, 3DEP, ALOS
|
|
311
|
+
dem_da = esd.terrain.dem.load(aoi, product="gedtm30") # global bare-earth DTM (OpenTopography)
|
|
312
|
+
s1_ds = esd.sar.sentinel1.load(aoi, "2024-03", units="dB") # Sentinel-1 RTC
|
|
313
|
+
snodas_ds = esd.snow.snodas.load(aoi, "2024-03") # SNODAS, no account
|
|
314
|
+
|
|
315
|
+
# Boundaries as GeoDataFrames: states, counties, mountain ranges, glaciers
|
|
316
|
+
wa_gdf = esd.boundaries.admin.states(aoi) # Washington (US Census)
|
|
317
|
+
ranges_gdf = esd.boundaries.mountains.load(aoi) # GMBA Mountain Inventory v2
|
|
318
|
+
glaciers_gdf = esd.boundaries.glaciers.load(aoi) # RGI 7.0 (Earthdata username + password); RGI 6.0 from source="oggm-mirror" needs none
|
|
319
|
+
|
|
320
|
+
# Optical, masked, and a snow index written out rather than hidden in a helper
|
|
321
|
+
s2_ds = esd.optical.sentinel2.load(aoi, "2024-03", mask="scl-default")
|
|
322
|
+
ndsi_da = (s2_ds["green"] - s2_ds["swir16"]) / (s2_ds["green"] + s2_ds["swir16"])
|
|
323
|
+
|
|
324
|
+
# Maps with equal aspect, a scale bar, and a graticule; legends from CF flags
|
|
325
|
+
ax = esd.plotting.map(dem_da, cmap="terrain")
|
|
326
|
+
esd.plotting.add_outline(ax, glaciers_gdf) # vectors in the map's CRS
|
|
327
|
+
esd.plotting.categorical(esd.land.landcover.load(aoi))
|
|
328
|
+
esd.plotting.timeseries(obs_ds["swe"]) # calendar dates, units in [ ]
|
|
329
|
+
|
|
330
|
+
# What is available, and what it needs
|
|
331
|
+
esd.catalog.search("swe")
|
|
332
|
+
esd.catalog.describe("snodas")
|
|
333
|
+
esd.auth.status()
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Coming from 0.0.x? The old module API (`remote_sensing.get_*`,
|
|
337
|
+
`automatic_weather_stations.StationCollection`, …) was deprecated in 0.2 and
|
|
338
|
+
removed in 0.3; the [migration guide](https://egagli.github.io/easysnowdata/migration.html)
|
|
339
|
+
maps every old name to its replacement.
|
|
340
|
+
|
|
341
|
+
## Documentation
|
|
342
|
+
|
|
343
|
+
Executed example gallery, data catalog, and API reference: <https://egagli.github.io/easysnowdata>
|
|
344
|
+
|
|
345
|
+
## Contributing
|
|
346
|
+
|
|
347
|
+
Contributions welcome! See [CONTRIBUTING](docs/contributing.md) for guidelines.
|
|
348
|
+
|
|
349
|
+
## Citing
|
|
350
|
+
|
|
351
|
+
If you use easysnowdata in your research, please cite the Zenodo archive:
|
|
352
|
+
|
|
353
|
+
[](https://doi.org/10.5281/zenodo.14741501)
|