easysnowdata 0.2.0__tar.gz → 0.3.2__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.
Files changed (191) hide show
  1. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/CHANGELOG.md +64 -0
  2. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/CITATION.cff +2 -2
  3. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/PKG-INFO +108 -67
  4. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/POTENTIAL_DATA_PRODUCTS_SOURCES_AND_EXAMPLES.md +1 -1
  5. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/README.md +105 -65
  6. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/REVAMP_PLAN.md +170 -7
  7. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/__init__.py +13 -23
  8. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/_version.py +2 -2
  9. easysnowdata-0.3.2/easysnowdata/auth/earthdata.py +324 -0
  10. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/catalog/__init__.py +11 -1
  11. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/catalog/_models.py +28 -3
  12. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/catalog/_registry.py +3 -1
  13. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/catalog/health.py +7 -2
  14. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/catalog/pages.py +85 -38
  15. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/hydro/basins.py +2 -0
  16. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/optical/hls.py +3 -1
  17. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/optical/planetscope.py +70 -14
  18. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/optical/sentinel2.py +1 -1
  19. easysnowdata-0.3.2/easysnowdata/plotting/__init__.py +974 -0
  20. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/processing/__init__.py +3 -23
  21. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/processing/contract.py +2 -1
  22. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/processing/optical.py +13 -188
  23. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/processing/sar.py +9 -7
  24. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/processing/snow.py +8 -60
  25. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/providers/planet.py +31 -3
  26. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/providers/raster_http.py +29 -2
  27. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/providers/stac.py +4 -1
  28. easysnowdata-0.3.2/easysnowdata/sar/sentinel1.py +1312 -0
  29. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/snow/modis.py +16 -4
  30. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/snow/snow_classification.py +16 -9
  31. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/snow/viirs.py +6 -5
  32. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/_adapter.py +52 -5
  33. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/_catalog.py +31 -21
  34. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/archive.py +341 -64
  35. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/_common.py +57 -49
  36. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/awdb/awdb_client.py +227 -88
  37. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/cdec/cdec_client.py +193 -130
  38. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/databc/databc_client.py +160 -165
  39. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/nve/nve_client.py +79 -63
  40. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/yukon/yukon_client.py +124 -116
  41. easysnowdata-0.3.2/easysnowdata/terrain/__init__.py +28 -0
  42. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/terrain/chili.py +2 -2
  43. easysnowdata-0.3.2/easysnowdata/terrain/dem.py +930 -0
  44. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/pyproject.toml +11 -26
  45. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/scripts/make_montage.py +5 -12
  46. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/scripts/update_readme_status.py +55 -15
  47. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/test_hydro_basins.py +0 -18
  48. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/test_land_forest_cover.py +0 -11
  49. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/test_land_nlcd.py +0 -11
  50. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/test_snow_classification.py +3 -17
  51. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/test_snow_mountain_snow_mask.py +0 -13
  52. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/test_terrain_chili.py +0 -11
  53. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/test_terrain_dem.py +100 -8
  54. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/test_theme_common.py +0 -30
  55. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/conftest.py +1 -0
  56. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/fixtures/make_fixtures.py +69 -1
  57. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/test_adapter.py +2 -2
  58. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/test_adapter_offline.py +68 -8
  59. easysnowdata-0.3.2/tests/stations/test_archive.py +482 -0
  60. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/test_clients_offline.py +45 -0
  61. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/test_nve_client.py +5 -2
  62. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_auth.py +119 -15
  63. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_catalog.py +10 -3
  64. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_credentials.py +9 -1
  65. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_docs_pages.py +40 -17
  66. easysnowdata-0.3.2/tests/test_easysnowdata.py +73 -0
  67. easysnowdata-0.3.2/tests/test_plotting.py +440 -0
  68. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_processing.py +0 -69
  69. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_providers.py +45 -2
  70. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_era5.py +0 -28
  71. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_hls.py +10 -31
  72. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_koppen_geiger.py +0 -27
  73. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_modis.py +3 -67
  74. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_planetscope.py +86 -0
  75. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_sentinel1.py +375 -60
  76. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_sentinel2.py +7 -35
  77. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_snodas.py +0 -30
  78. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_ucla_sr.py +0 -36
  79. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_viirs.py +2 -13
  80. easysnowdata-0.2.0/easysnowdata/_deprecation.py +0 -152
  81. easysnowdata-0.2.0/easysnowdata/auth/earthdata.py +0 -191
  82. easysnowdata-0.2.0/easysnowdata/automatic_weather_stations.py +0 -467
  83. easysnowdata-0.2.0/easysnowdata/hydroclimatology.py +0 -430
  84. easysnowdata-0.2.0/easysnowdata/plotting/__init__.py +0 -125
  85. easysnowdata-0.2.0/easysnowdata/remote_sensing.py +0 -593
  86. easysnowdata-0.2.0/easysnowdata/sar/sentinel1.py +0 -746
  87. easysnowdata-0.2.0/easysnowdata/terrain/__init__.py +0 -23
  88. easysnowdata-0.2.0/easysnowdata/terrain/dem.py +0 -246
  89. easysnowdata-0.2.0/easysnowdata/topography.py +0 -135
  90. easysnowdata-0.2.0/easysnowdata/utils.py +0 -454
  91. easysnowdata-0.2.0/tests/stations/test_archive.py +0 -247
  92. easysnowdata-0.2.0/tests/stations/test_legacy_shim.py +0 -261
  93. easysnowdata-0.2.0/tests/test_automatic_weather_stations.py +0 -136
  94. easysnowdata-0.2.0/tests/test_deprecation.py +0 -100
  95. easysnowdata-0.2.0/tests/test_easysnowdata.py +0 -51
  96. easysnowdata-0.2.0/tests/test_hydroclimatology.py +0 -330
  97. easysnowdata-0.2.0/tests/test_plotting.py +0 -94
  98. easysnowdata-0.2.0/tests/test_remote_sensing.py +0 -307
  99. easysnowdata-0.2.0/tests/test_topography.py +0 -138
  100. easysnowdata-0.2.0/tests/test_utils.py +0 -263
  101. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/.editorconfig +0 -0
  102. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/.gitignore +0 -0
  103. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/.pre-commit-config.yaml +0 -0
  104. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/LICENSE +0 -0
  105. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/WATCHLIST.toml +0 -0
  106. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/_gdal.py +0 -0
  107. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/aoi.py +0 -0
  108. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/auth/__init__.py +0 -0
  109. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/auth/_base.py +0 -0
  110. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/auth/earthengine.py +0 -0
  111. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/auth/nve.py +0 -0
  112. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/auth/planet.py +0 -0
  113. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/auth/planetary_computer.py +0 -0
  114. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/catalog/_access.py +0 -0
  115. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/climate/__init__.py +0 -0
  116. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/climate/era5.py +0 -0
  117. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/climate/koppen_geiger.py +0 -0
  118. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/config.py +0 -0
  119. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/hydro/__init__.py +0 -0
  120. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/land/__init__.py +0 -0
  121. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/land/forest_cover.py +0 -0
  122. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/land/landcover.py +0 -0
  123. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/land/nlcd.py +0 -0
  124. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/optical/__init__.py +0 -0
  125. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/processing/categorical.py +0 -0
  126. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/processing/masks.py +0 -0
  127. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/processing/wateryear.py +0 -0
  128. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/providers/__init__.py +0 -0
  129. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/providers/earthdata.py +0 -0
  130. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/providers/gee.py +0 -0
  131. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/providers/vector_http.py +0 -0
  132. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/providers/zarr_cloud.py +0 -0
  133. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/sar/__init__.py +0 -0
  134. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/snow/__init__.py +0 -0
  135. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/snow/mountain_snow_mask.py +0 -0
  136. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/snow/snodas.py +0 -0
  137. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/snow/ucla_sr.py +0 -0
  138. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/__init__.py +0 -0
  139. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/_frames.py +0 -0
  140. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/README.md +0 -0
  141. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/__init__.py +0 -0
  142. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/awdb/__init__.py +0 -0
  143. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/cdec/__init__.py +0 -0
  144. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/databc/__init__.py +0 -0
  145. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/nve/__init__.py +0 -0
  146. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/clients/yukon/__init__.py +0 -0
  147. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/stations/networks.py +0 -0
  148. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/easysnowdata/temporal.py +0 -0
  149. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/scripts/check_data_sources.py +0 -0
  150. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/scripts/feedstock_requirements.py +0 -0
  151. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/scripts/report_health.py +0 -0
  152. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/scripts/watch.py +0 -0
  153. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/__init__.py +0 -0
  154. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/cassettes/test_recorded/test_cmr_lpcloud_hls_search_is_open.yaml +0 -0
  155. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/cassettes/test_recorded/test_earth_search_sentinel2_search_with_time.yaml +0 -0
  156. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/cassettes/test_recorded/test_health_first_byte_probe_replays.yaml +0 -0
  157. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/cassettes/test_recorded/test_health_stac_probe_replays.yaml +0 -0
  158. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/cassettes/test_recorded/test_planetary_computer_dem_search.yaml +0 -0
  159. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/conftest.py +0 -0
  160. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/fixtures/make_fixtures.py +0 -0
  161. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/__init__.py +0 -0
  162. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/cassettes/test_land_landcover/TestSearchRecorded.test_search_filters_by_version.yaml +0 -0
  163. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/cassettes/test_terrain_dem/TestSearchRecorded.test_search_on_earth_search.yaml +0 -0
  164. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/cassettes/test_terrain_dem/TestSearchRecorded.test_search_returns_tiles.yaml +0 -0
  165. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/conftest.py +0 -0
  166. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/make_fixtures.py +0 -0
  167. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/static/test_land_landcover.py +0 -0
  168. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/__init__.py +0 -0
  169. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/test_awdb_client.py +0 -0
  170. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/test_cdec_client.py +0 -0
  171. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/test_databc_client.py +0 -0
  172. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/stations/test_yukon_client.py +0 -0
  173. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_aoi.py +0 -0
  174. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_config.py +0 -0
  175. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_edges.py +0 -0
  176. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_feedstock_requirements.py +0 -0
  177. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_health_reporting.py +0 -0
  178. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_montage.py +0 -0
  179. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_recorded.py +0 -0
  180. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_temporal.py +0 -0
  181. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/test_watch.py +0 -0
  182. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/__init__.py +0 -0
  183. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/cassettes/test_hls/test_search_cmr_lpcloud_is_open_and_labels_products.yaml +0 -0
  184. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/cassettes/test_hls/test_search_planetary_computer_mirror.yaml +0 -0
  185. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/cassettes/test_sentinel1/test_search_opera_rtc_is_open.yaml +0 -0
  186. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/cassettes/test_sentinel1/test_search_planetary_computer.yaml +0 -0
  187. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/cassettes/test_sentinel2/test_search_earth_search_collection_1.yaml +0 -0
  188. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/cassettes/test_sentinel2/test_search_planetary_computer.yaml +0 -0
  189. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/conftest.py +0 -0
  190. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/fixtures/make_fixtures.py +0 -0
  191. {easysnowdata-0.2.0 → easysnowdata-0.3.2}/tests/timeseries/test_contract.py +0 -0
@@ -6,6 +6,70 @@ 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.1](https://github.com/egagli/easysnowdata/releases/tag/v0.3.1) - 2026-09-22
10
+
11
+ <small>[Compare with v0.2.0](https://github.com/egagli/easysnowdata/compare/v0.2.0...v0.3.1)</small>
12
+
13
+ ### Fixed
14
+
15
+ - fix(planetscope): make a real order work end to end; gallery renders a real scene ([bd25c45](https://github.com/egagli/easysnowdata/commit/bd25c45c4212db5b1a5e212dec2fe295a9f1f5d6) by egagli).
16
+ - fix(archive): open a scheme-less store path as a local store ([d71b0ee](https://github.com/egagli/easysnowdata/commit/d71b0ee753cef56ec9fdc0dc248b85fda202b5b5) by Eric Gagliano).
17
+ - fix(sar): never fuse Sentinel-1 geometries — one raster per relative orbit ([c9fbe53](https://github.com/egagli/easysnowdata/commit/c9fbe53433a9ed8a36edadca1f72cafe67b387d8) by egagli).
18
+ - fix(hls): a failed band read raises instead of filling the Dataset with nodata ([101d97f](https://github.com/egagli/easysnowdata/commit/101d97f5aa482ed74c4185486dbc8a3710c4fb26) by egagli).
19
+ - fix(auth): log in at URS with the netrc for GDAL reads whenever a password exists ([1b7a1a1](https://github.com/egagli/easysnowdata/commit/1b7a1a13a66f3e71288967e41dcc61723dac5922) by egagli).
20
+ - fix(sar): drop the nominal Sentinel-1 heading and the constant 39° incidence angle ([736499e](https://github.com/egagli/easysnowdata/commit/736499e0fcfdef3c1f4bfdc9ea33c5417198806a) by egagli).
21
+ - fix(snow): Terra-only MODIS mosaics from Planetary Computer; real NSIDC-0768 file names ([8bbbdbd](https://github.com/egagli/easysnowdata/commit/8bbbdbdbe6d6c11411c867b07f5d578a672233ec) by egagli).
22
+ - fix(sar): incidence angle from each track's geometry, with the right sign; OPERA reads work ([d12dc9f](https://github.com/egagli/easysnowdata/commit/d12dc9f37684c9dfb73287c08e0c2472f11254f3) by egagli).
23
+ - fix(health): probe Planet through the SDK, send a User-Agent on first-byte probes ([e5aeb82](https://github.com/egagli/easysnowdata/commit/e5aeb82fc28802f3539aaea69c93e3d185b32553) by egagli).
24
+ - fix(stations): finish the transfer — format the clients, relabel the probes, refresh the archive ([fb1bf3e](https://github.com/egagli/easysnowdata/commit/fb1bf3e191e27ee7453e23830a99bd6c85731016) by egagli).
25
+ - fix(deprecation): the shims promised removal in the release they shipped in ([24e93b5](https://github.com/egagli/easysnowdata/commit/24e93b549e928cb6cfabd103b8ae40f9d1581b07) by egagli).
26
+
27
+ ## [v0.2.0](https://github.com/egagli/easysnowdata/releases/tag/v0.2.0) - 2026-09-17
28
+
29
+ <small>[Compare with v0.0.26](https://github.com/egagli/easysnowdata/compare/v0.0.26...v0.2.0)</small>
30
+
31
+ ### Fixed
32
+
33
+ - fix(live): three real bugs behind the failing live tests, one marker for the fourth ([0cbfafb](https://github.com/egagli/easysnowdata/commit/0cbfafb7821980be9ed7101e1dae5f7d839f8387) by egagli).
34
+ - fix(providers): spell a local zip as /vsizip/ so Windows can open it ([599a296](https://github.com/egagli/easysnowdata/commit/599a296e0d8f6f95bdfa093f0cc8e642233658f3) by egagli).
35
+ - fix(ci): generate the autosummary stubs on a first build, and stop writing COGs in fixtures ([7c3952c](https://github.com/egagli/easysnowdata/commit/7c3952c02f69a88dd978470d54306cd6f2671b95) by egagli).
36
+ - fix(docs): drop the minigallery directive, and keep doctrees out of the site ([e051058](https://github.com/egagli/easysnowdata/commit/e051058dc47f1edf474c3a343c5f30d243dc0173) by egagli).
37
+ - fix(docs): document a re-exported object once, not per module ([10a9b94](https://github.com/egagli/easysnowdata/commit/10a9b94b75ce151c190725c26f2e2de080c35c1a) by egagli).
38
+ - fix(yukon): snowfall is its own type, not precipitation in centimetres ([e89ed0e](https://github.com/egagli/easysnowdata/commit/e89ed0ed3b376b216fd41ab9505f2be0242ae706) by egagli).
39
+ - fix(stations): never rescale a depth of snowfall into a depth of water ([37e8aa8](https://github.com/egagli/easysnowdata/commit/37e8aa84c363935677837cf79a83be51ff2a931a) by egagli).
40
+ - fix(clients): conform get_metadata for one station, emit hPa from Yukon ([defc053](https://github.com/egagli/easysnowdata/commit/defc05342fb1630206cc226aeedb1967b9071a8b) by egagli).
41
+ - fix(awdb): serve TAVG, and prefer it over TOBS for the `temp` type ([87c8ea2](https://github.com/egagli/easysnowdata/commit/87c8ea2d23a9b883cf1997a2ac7903b4d754413f) by egagli).
42
+ - fix(stations): three contract gaps the live tier found ([00560f6](https://github.com/egagli/easysnowdata/commit/00560f6106cf4f6d89722174029a4c379ddb1f1e) by egagli).
43
+ - fix(snow): stream the NSIDC download with iter_content ([ad1473e](https://github.com/egagli/easysnowdata/commit/ad1473e34d45491390e74075d61bc036cf89a670) by Claude).
44
+ - fix(earthaccess): do not treat a half-initialised login as logged in; retry once ([fa5f309](https://github.com/egagli/easysnowdata/commit/fa5f3094dc4c3866a02a14fcbadd4d47e1a6bda1) by egagli).
45
+ - fix(modis): fail fast when GDAL has no HDF4 driver (MOD10A1F) ([f506c13](https://github.com/egagli/easysnowdata/commit/f506c1341943ec1d0bb059d8fae89028baf2adc7) by egagli).
46
+ - fix(yukon): raise on unknown variables and unsupported intervals ([513bc0c](https://github.com/egagli/easysnowdata/commit/513bc0ca93498e16512e52199b1246726211b1e2) by egagli).
47
+ - fix(nve): datetime on hourly records, no silent fallbacks, correct stale docstrings ([c7d499c](https://github.com/egagli/easysnowdata/commit/c7d499c3a4b2d30337e03311b0fe002e7b036551) by egagli).
48
+ - fix(awdb): convert all variables to metric, add datetime to hourly records, validate inputs ([bdcda3c](https://github.com/egagli/easysnowdata/commit/bdcda3c257a315b1839366f533af9304a4e2ec4f) by egagli).
49
+ - fix(cdec): preserve hourly timestamps, clean SWE priority logic, validate inputs ([8a75dbb](https://github.com/egagli/easysnowdata/commit/8a75dbb50c089a50434103000202de17475ef25a) by egagli).
50
+ - fix(databc): wire hourly through get_data, scope negative-value filter, validate interval ([01a1a16](https://github.com/egagli/easysnowdata/commit/01a1a16e10c4f14d3911b43d6b03d5e753d2044f) by egagli).
51
+ - fix: correct Nepal station coordinates via detect-and-override, not exclusion ([e6a3e0b](https://github.com/egagli/easysnowdata/commit/e6a3e0bd10c88bfcba6ab3542004d2e165640d56) by egagli).
52
+ - fix: correct NVE parameter IDs, response parsing, flags — verified live ([fe202a9](https://github.com/egagli/easysnowdata/commit/fe202a97b6065dd96fd7b43ed8a64035101112e6) by egagli).
53
+ - fix: NVE fetch self-diagnoses when /Series matches nothing ([71220bf](https://github.com/egagli/easysnowdata/commit/71220bfcd8a9a0a0ec03f58da9279ac0de84035c) by egagli).
54
+ - fix: NVE Observations 404s — request only series that exist, chunked ([ff0f318](https://github.com/egagli/easysnowdata/commit/ff0f318d8ed3742b77947764392f853c65f4b8f3) by egagli).
55
+ - fix: NVE Observations uses ReferenceTime not StartDate/EndDate ([c4f8aee](https://github.com/egagli/easysnowdata/commit/c4f8aeee52650259aca0f41162cf6433b652487c) by egagli).
56
+ - fix: use correct NVE Observations query param name ([c6b44f5](https://github.com/egagli/easysnowdata/commit/c6b44f5178b8c0de79063f4c69aef30a0a9a386d) by egagli).
57
+ - fix: NVE Observations 400 (date format), 429 (rate limit), begin_date ([18d0a51](https://github.com/egagli/easysnowdata/commit/18d0a515769703c651e4f0a2ca8ae29fe465f856) by egagli).
58
+ - fix: NVE parameters missing when filtering by ParameterId, CI missing API key ([5deee41](https://github.com/egagli/easysnowdata/commit/5deee415a5793ff175f368ca900b3729af3f338d) by egagli).
59
+ - fix: NVE API key auth, Pages permissions, detached HEAD push ([fbbc4d7](https://github.com/egagli/easysnowdata/commit/fbbc4d7a6826ef23c34d8a81357ca1b2c7daeb5b) by egagli).
60
+ - fix awdb metadata adaptive batching ([367639a](https://github.com/egagli/easysnowdata/commit/367639a61ecadd583ff2ed28c41c4b082245820f) by egagli).
61
+ - fix: restore variables_daily for CDEC/DataBC; update README field docs ([8a256ff](https://github.com/egagli/easysnowdata/commit/8a256ff8431be7bde33d346024762c06d55bec4a) by egagli).
62
+
63
+ ## [v0.0.26](https://github.com/egagli/easysnowdata/releases/tag/v0.0.26) - 2026-09-15
64
+
65
+ <small>[Compare with v0.0.25](https://github.com/egagli/easysnowdata/compare/v0.0.25...v0.0.26)</small>
66
+
67
+ ### Fixed
68
+
69
+ - fix(hydro): read Köppen-Geiger file 61012822 via ndownloader.figshare.com ([e78aece](https://github.com/egagli/easysnowdata/commit/e78aeceb347fb56e625f347fe9f848c8c5739521) by egagli).
70
+ - fix(earthaccess): explicit login, cloud-hosted MOD10A1F, cache dir, UCLA stats index ([a8c2d3e](https://github.com/egagli/easysnowdata/commit/a8c2d3e73a5929a627eac826b750f80f8305223f) by egagli).
71
+ - fix(hydro): fetch GRDC WMO basins with GET into a cache; GET-first health probe ([69ab0e0](https://github.com/egagli/easysnowdata/commit/69ab0e0a49275fdcc7737f53a2ca39f0569af6e6) by egagli).
72
+
9
73
  ## [v0.0.25](https://github.com/egagli/easysnowdata/releases/tag/v0.0.25) - 2026-08-25
10
74
 
11
75
  <small>[Compare with v0.0.24](https://github.com/egagli/easysnowdata/compare/v0.0.24...v0.0.25)</small>
@@ -38,5 +38,5 @@ keywords:
38
38
  - snow classification
39
39
  - easysnowdata
40
40
  license: MIT
41
- version: v0.2.0
42
- date-released: '2026-09-17'
41
+ version: v0.3.2
42
+ date-released: '2026-09-23'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: easysnowdata
3
- Version: 0.2.0
3
+ Version: 0.3.2
4
4
  Summary: A Python package to easily retrieve data relevant to snow science
5
5
  Project-URL: Homepage, https://github.com/egagli/easysnowdata
6
6
  Project-URL: Documentation, https://egagli.github.io/easysnowdata
@@ -20,6 +20,7 @@ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
20
20
  Classifier: Topic :: Scientific/Engineering :: GIS
21
21
  Requires-Python: >=3.12
22
22
  Requires-Dist: beautifulsoup4
23
+ Requires-Dist: contextily
23
24
  Requires-Dist: dask
24
25
  Requires-Dist: earthaccess>=0.17
25
26
  Requires-Dist: earthengine-api
@@ -30,6 +31,7 @@ Requires-Dist: h5netcdf
30
31
  Requires-Dist: h5py
31
32
  Requires-Dist: lxml
32
33
  Requires-Dist: matplotlib
34
+ Requires-Dist: matplotlib-scalebar
33
35
  Requires-Dist: numpy
34
36
  Requires-Dist: odc-geo>=0.5
35
37
  Requires-Dist: odc-stac>=0.5
@@ -47,7 +49,6 @@ Requires-Dist: rasterio>=1.5
47
49
  Requires-Dist: requests
48
50
  Requires-Dist: rioxarray>=0.22
49
51
  Requires-Dist: s3fs
50
- Requires-Dist: scikit-image
51
52
  Requires-Dist: shapely>=2
52
53
  Requires-Dist: tqdm
53
54
  Requires-Dist: xarray>=2026.2
@@ -90,59 +91,96 @@ and a recovery closes it; latency and DMR++ readiness are on the
90
91
  [status page](https://egagli.github.io/easysnowdata/status.html).
91
92
 
92
93
  <!-- DATA_STATUS_START -->
93
- _Last updated: 2026-09-17 21:39 UTC_
94
+ _Last updated: 2026-09-22 01:46 UTC_
94
95
  _⚠️ = skipped (credentials not available in this run). Latency and virtualization probes are on the [status page](https://egagli.github.io/easysnowdata/status.html)._
95
96
 
96
- | Data Source | Latest (Sep 17) | Sep 14 | Sep 7 | Aug 31 |
97
+ ### Stations (`esd.stations`)
98
+
99
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
97
100
  | :---------- | :------: | :------: | :------: | :------: |
98
- | AWDB stations (NRCS REST API) | ✅ | — | — | — |
99
- | CDEC stations (JSON data servlet) | ✅ | — | — | — |
100
- | BC snow stations (DataBC WFS) | ✅ | — | — | — |
101
- | NVE stations (HydAPI) | ⚠️ | — | — | — |
102
- | Yukon stations (AquaCache API) | ✅ | — | — | — |
103
- | SNOTEL/CCSS station list (GitHub) | ✅ | ✅ | ✅ | ✅ |
104
- | Snow station archive tarball (global_snow_networks) | ✅ | — | — | — |
105
- | SNOTEL/CCSS station CSV (GitHub) | ✅ | ✅ | ✅ | ✅ |
106
- | ARCO-ERA5 (GCS anonymous) | ✅ | ✅ | ✅ | ✅ |
107
- | ERA5 (Google Earth Engine) | ✅ | ✅ | ✅ | ✅ |
108
- | Köppen-Geiger classification (figshare) | ✅ | ✅ | ✅ | ✅ |
109
- | HUC geometries (USGS WBD REST) | ✅ | — | — | — |
110
- | HUC geometries (GEE/USGS WBD) | ✅ | ✅ | ✅ | ✅ |
111
- | HydroATLAS basins (figshare) | ✅ | ✅ | ✅ | ✅ |
112
- | HydroBASINS (HydroSHEDS regional zip) | ✅ | — | — | — |
113
- | HydroBASINS (GEE/HydroATLAS) | ✅ | — | — | — |
114
- | GRDC major river basins (World Bank) | ✅ | ✅ | ✅ | ✅ |
115
- | GRDC WMO basins | <abbr title="ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection r">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> |
116
- | MODIS snow cover MOD10A1F (NASA NSIDC) | ✅ | — | — | — |
117
- | MODIS snow cover MOD10A1 (Planetary Computer) | ✅ | — | — | — |
101
+ | AWDB stations (NRCS REST API) | ✅ | ✅ | — | — |
102
+ | CDEC stations (JSON data servlet) | ✅ | ✅ | — | — |
103
+ | BC snow stations (DataBC WFS) | ✅ | ✅ | — | — |
104
+ | NVE stations (HydAPI) | <abbr title="RuntimeError: Unreachable: HTTP 401">❌</abbr> | ⚠️ | — | — |
105
+ | Yukon stations (AquaCache API) | ✅ | ✅ | — | — |
106
+ | Snow station inventory (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
107
+ | Snow station archive tarball (global_snow_networks) | ✅ | ✅ | — | — |
108
+ | Snow station CSV (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
109
+
110
+ ### Snow (`esd.snow`)
111
+
112
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
113
+ | :---------- | :------: | :------: | :------: | :------: |
114
+ | MODIS snow cover MOD10A1F (NASA NSIDC) | ✅ | ✅ | — | — |
115
+ | MODIS snow cover MOD10A1 (Planetary Computer) | ✅ | ✅ | — | — |
118
116
  | Mountain snow mask (Zenodo) | ✅ | ✅ | ✅ | ✅ |
119
- | SNODAS (NSIDC G02158) | ✅ | — | — | — |
117
+ | SNODAS (NSIDC G02158) | ✅ | ✅ | — | — |
120
118
  | SNODAS (GEE/Climate Engine) | ✅ | ✅ | ✅ | ✅ |
121
- | Sturm & Liston snow classification (NSIDC-0768) | ✅ | — | — | — |
119
+ | Sturm & Liston snow classification (NSIDC-0768) | ✅ | ✅ | — | — |
122
120
  | Sturm & Liston snow classification (Azure) | ✅ | ✅ | ✅ | ✅ |
123
- | UCLA Snow Reanalysis (NASA NSIDC) | ✅ | ⚠️ | ⚠️ | ⚠️ |
124
- | HMA Snow Reanalysis (NASA NSIDC) | ✅ | — | — | — |
125
- | VIIRS snow cover VNP10A1F (NASA NSIDC) | ✅ | — | — | — |
121
+ | UCLA Snow Reanalysis (NASA NSIDC) | ✅ | ✅ | ⚠️ | ⚠️ |
122
+ | HMA Snow Reanalysis (NASA NSIDC) | ✅ | ✅ | — | — |
123
+ | VIIRS snow cover VNP10A1F (NASA NSIDC) | ✅ | ✅ | — | — |
124
+
125
+ ### SAR (`esd.sar`)
126
+
127
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
128
+ | :---------- | :------: | :------: | :------: | :------: |
129
+ | Sentinel-1 RTC (Planetary Computer) | ✅ | ✅ | — | — |
130
+ | Sentinel-1 RTC OPERA (CMR-STAC ASF) | ✅ | ✅ | — | — |
131
+ | Sentinel-1 RTC OPERA (Earth Engine) | ✅ | ✅ | — | — |
132
+ | Sentinel-1 static layers (CMR-STAC ASF) | ✅ | ✅ | — | — |
133
+ | Copernicus DEM for the incidence angle (Planetary Computer) | ✅ | ✅ | — | — |
134
+ | Sentinel-1 GRD angle band (Earth Engine) | ✅ | ✅ | — | — |
135
+
136
+ ### Optical imagery (`esd.optical`)
137
+
138
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
139
+ | :---------- | :------: | :------: | :------: | :------: |
140
+ | HLS L30 (CMR-STAC LPCLOUD) | ✅ | ✅ | — | — |
141
+ | HLS S30 (Planetary Computer) | ✅ | ✅ | — | — |
142
+ | PlanetScope (Planet Data API) | <abbr title="DeprecationWarning: Auth.value has been deprecated.">❌</abbr> | ⚠️ | — | — |
143
+ | Sentinel-2 L2A (Planetary Computer) | ✅ | ✅ | — | — |
144
+ | Sentinel-2 L2A (Earth Search) | ✅ | ✅ | — | — |
145
+
146
+ ### Terrain (`esd.terrain`)
147
+
148
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
149
+ | :---------- | :------: | :------: | :------: | :------: |
150
+ | CHILI (GEE/CSP ERGo) | ✅ | ✅ | ✅ | ✅ |
151
+ | Copernicus DEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
152
+ | Copernicus DEM (Earth Search) | ✅ | ✅ | — | — |
153
+
154
+ ### Land cover (`esd.land`)
155
+
156
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
157
+ | :---------- | :------: | :------: | :------: | :------: |
126
158
  | Forest cover fraction (Zenodo) | ✅ | ✅ | ✅ | ✅ |
127
- | Forest cover fraction (GEE/CGLS-LC100) | ✅ | — | — | — |
159
+ | Forest cover fraction (GEE/CGLS-LC100) | ✅ | ✅ | — | — |
128
160
  | ESA WorldCover (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
129
- | ESA WorldCover (AWS bucket) | ✅ | — | — | — |
130
- | Annual NLCD (GEE community asset) | ✅ | — | — | — |
161
+ | ESA WorldCover (AWS bucket) | ✅ | ✅ | — | — |
162
+ | Annual NLCD (GEE community asset) | ✅ | ✅ | — | — |
131
163
  | NLCD (GEE/USGS) | ✅ | ✅ | ✅ | ✅ |
132
- | HLS L30 (CMR-STAC LPCLOUD) | ✅ | — | — | — |
133
- | HLS S30 (Planetary Computer) | ✅ | — | — | — |
134
- | PlanetScope (Planet Data API) | ⚠️ | — | — | — |
135
- | Sentinel-2 L2A (Planetary Computer) | ✅ | — | — | — |
136
- | Sentinel-2 L2A (Earth Search) | ✅ | — | — | — |
137
- | Sentinel-1 RTC (Planetary Computer) | ✅ | — | — | — |
138
- | Sentinel-1 RTC OPERA (CMR-STAC ASF) | ✅ | — | — | — |
139
- | Sentinel-1 RTC OPERA (Earth Engine) | ✅ | — | — | — |
140
- | Sentinel-1 static layers (CMR-STAC ASF) | ✅ | — | — | — |
141
- | Copernicus DEM for the incidence angle (Planetary Computer) | ✅ | — | — | — |
142
- | Sentinel-1 GRD angle band (Earth Engine) | ✅ | — | — | — |
143
- | CHILI (GEE/CSP ERGo) | ✅ | ✅ | ✅ | ✅ |
144
- | Copernicus DEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
145
- | Copernicus DEM (Earth Search) | ✅ | — | — | — |
164
+
165
+ ### Hydrography (`esd.hydro`)
166
+
167
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
168
+ | :---------- | :------: | :------: | :------: | :------: |
169
+ | HUC geometries (USGS WBD REST) | ✅ | ✅ | — | — |
170
+ | HUC geometries (GEE/USGS WBD) | ✅ | ✅ | ✅ | ✅ |
171
+ | HydroATLAS basins (figshare) | ✅ | ✅ | ✅ | ✅ |
172
+ | HydroBASINS (HydroSHEDS regional zip) | <abbr title="RuntimeError: Unreachable: HTTP 403">❌</abbr> | ✅ | — | — |
173
+ | HydroBASINS (GEE/HydroATLAS) | ✅ | ✅ | — | — |
174
+ | GRDC major river basins (World Bank) | ✅ | ✅ | ✅ | ✅ |
175
+ | GRDC WMO basins | ✅ | <abbr title="ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection r">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> |
176
+
177
+ ### Climate (`esd.climate`)
178
+
179
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
180
+ | :---------- | :------: | :------: | :------: | :------: |
181
+ | ARCO-ERA5 (GCS anonymous) | ✅ | ✅ | ✅ | ✅ |
182
+ | ERA5 (Google Earth Engine) | ✅ | ✅ | ✅ | ✅ |
183
+ | Köppen-Geiger classification (figshare) | ✅ | ✅ | ✅ | ✅ |
146
184
  <!-- DATA_STATUS_END -->
147
185
 
148
186
  ## Installation
@@ -162,10 +200,10 @@ mamba install -c conda-forge easysnowdata
162
200
  ```bash
163
201
  git clone https://github.com/egagli/easysnowdata.git
164
202
  cd easysnowdata
165
- pixi install # sets up the environment
166
- pixi run test-unit # offline tests (no network, no credentials)
167
- pixi run test-live # live tests against the data providers (credentialed ones skip without secrets)
168
- pixi run docs-serve # preview the docs locally
203
+ pixi install # sets up the environments
204
+ pixi run -e test-py313 test-unit # offline tests (no network, no credentials)
205
+ pixi run -e test-py313 test-live # live tests against the data providers (credentialed ones skip without secrets)
206
+ pixi run -e docs docs-serve # preview the docs locally
169
207
  ```
170
208
 
171
209
  ### Services that require account setup
@@ -182,18 +220,18 @@ Planetary Computer and anonymous GCS access require no credentials.
182
220
  ## What is in it
183
221
 
184
222
  <!-- CATALOG_START -->
185
- 28 products across 8 themes, each with one or more access routes:
223
+ 32 products across 8 themes, each with one or more access routes:
186
224
 
187
225
  | theme | products | open without an account |
188
226
  | --- | --- | --- |
189
- | **climate** | [`era5`](https://egagli.github.io/easysnowdata/catalog/era5.html), [`koppen-geiger`](https://egagli.github.io/easysnowdata/catalog/koppen-geiger.html) | 2 of 2 |
190
- | **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 |
191
- | **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 |
192
- | **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 |
193
- | **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 |
194
- | **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 |
195
227
  | **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 |
196
- | **terrain** | [`chili`](https://egagli.github.io/easysnowdata/catalog/chili.html), [`copernicus-dem`](https://egagli.github.io/easysnowdata/catalog/copernicus-dem.html) | 1 of 2 |
228
+ | **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 |
229
+ | **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 |
230
+ | **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 |
231
+ | **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), [`nasadem`](https://egagli.github.io/easysnowdata/catalog/nasadem.html), [`srtm`](https://egagli.github.io/easysnowdata/catalog/srtm.html) | 4 of 6 |
232
+ | **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 |
233
+ | **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 |
234
+ | **climate** | [`era5`](https://egagli.github.io/easysnowdata/catalog/era5.html), [`koppen-geiger`](https://egagli.github.io/easysnowdata/catalog/koppen-geiger.html) | 2 of 2 |
197
235
  <!-- CATALOG_END -->
198
236
 
199
237
  Every product's routes, resolution, credentials, licence and health are on its
@@ -211,16 +249,19 @@ inv = esd.stations.inventory(aoi, daily_only=True)
211
249
  obs = esd.stations.load(inv, variables=["swe", "snwd"], time="2023-10/2024-09")
212
250
 
213
251
  # Terrain, SAR and snow water equivalent — lazy, Dask-backed, CRS attached
214
- dem = esd.terrain.dem.load(aoi) # Copernicus GLO-30
252
+ dem = esd.terrain.dem.load(aoi) # Copernicus GLO-30 (default)
253
+ dem = esd.terrain.dem.load(aoi, product="3dep") # or NASADEM, SRTM, 3DEP, ALOS
215
254
  s1 = esd.sar.sentinel1.load(aoi, "2024-03", units="dB") # Sentinel-1 RTC
216
255
  swe = esd.snow.snodas.load(aoi, "2024-03") # SNODAS, no account
217
256
 
218
- # Optical, masked and turned into a snow index
257
+ # Optical, masked, and a snow index written out rather than hidden in a helper
219
258
  s2 = esd.optical.sentinel2.load(aoi, "2024-03", mask="scl-default")
220
- ndsi = esd.processing.ndsi(s2)
259
+ ndsi = (s2["green"] - s2["swir16"]) / (s2["green"] + s2["swir16"])
221
260
 
222
- # Categorical products carry CF flag attrs, so the legend draws itself
261
+ # Maps with equal aspect, a scale bar and a graticule; legends from CF flags
262
+ esd.plotting.map(dem, cmap="terrain")
223
263
  esd.plotting.categorical(esd.land.landcover.load(aoi))
264
+ esd.plotting.timeseries(obs["swe"]) # calendar dates, units in [ ]
224
265
 
225
266
  # What is available, and what it needs
226
267
  esd.catalog.search("swe")
@@ -228,14 +269,14 @@ esd.catalog.describe("snodas")
228
269
  esd.auth.status()
229
270
  ```
230
271
 
231
- The pre-0.1 API (`easysnowdata.remote_sensing.get_*`,
232
- `automatic_weather_stations.StationCollection`, …) still works and emits a
233
- `DeprecationWarning` naming its replacement. It is removed one minor release
234
- after 0.1.
272
+ Coming from 0.0.x? The old module API (`remote_sensing.get_*`,
273
+ `automatic_weather_stations.StationCollection`, …) was deprecated in 0.2 and
274
+ removed in 0.3; the [migration guide](https://egagli.github.io/easysnowdata/migration.html)
275
+ maps every old name to its replacement.
235
276
 
236
277
  ## Documentation
237
278
 
238
- Full API reference and example notebooks: <https://egagli.github.io/easysnowdata>
279
+ Executed example gallery, data catalog and API reference: <https://egagli.github.io/easysnowdata>
239
280
 
240
281
  ## Contributing
241
282
 
@@ -276,7 +276,7 @@ re-implement · **reference** = not a product; kept in §E as an access pattern
276
276
  | ICESat-2 ATL06/ATL08 | laser altimetry heights | snow depth by differencing | NSIDC · HDF5 · EDL | medium; `icepyx`/`sliderule` exist | **wrap** |
277
277
  | S2/HLS snow cover (#9) | NDSI-threshold and let-it-snow style snow maps | turns imagery into a snow product; the most-asked feature | computed | medium | **follow-on** (NDSI first; algorithm links in E.3) |
278
278
  | 3DEP 1/3″ and lidar | US 10 m DEM, point clouds | finer terrain for small basins; `py3dep` already a dependency | S3/PC · COG/EPT · none | low | **follow-on** |
279
- | NASADEM | 30 m void-filled SRTM | alternative DEM where GLO-30 has artefacts | LPCLOUD/PC/GEE | low | **follow-on** |
279
+ | NASADEM | 30 m void-filled SRTM | alternative DEM where GLO-30 has artefacts | PC/GEE | low | **shipped 0.3** as `product="nasadem"`, with SRTM GL1 (`"srtm"`, GEE) and ALOS World 3D (`"alos-dem"`) beside it |
280
280
  | Insolation proxies (CHILI, heat load) | topographic radiation indices | aspect control on melt timing (P4's CHILI classes) | GEE; or computed from a DEM with McCune & Keon 2002 | low | **rewrite** (CHILI exists) + **follow-on** (local computation) |
281
281
  | Dynamic World | 10 m near-real-time land cover | current-year land cover for masking | GEE | low | **follow-on** |
282
282
  | Hansen GFC 2025 | tree cover and loss year | forest change affects snow interception | GEE | low | **follow-on** |
@@ -33,59 +33,96 @@ and a recovery closes it; latency and DMR++ readiness are on the
33
33
  [status page](https://egagli.github.io/easysnowdata/status.html).
34
34
 
35
35
  <!-- DATA_STATUS_START -->
36
- _Last updated: 2026-09-17 21:39 UTC_
36
+ _Last updated: 2026-09-22 01:46 UTC_
37
37
  _⚠️ = skipped (credentials not available in this run). Latency and virtualization probes are on the [status page](https://egagli.github.io/easysnowdata/status.html)._
38
38
 
39
- | Data Source | Latest (Sep 17) | Sep 14 | Sep 7 | Aug 31 |
39
+ ### Stations (`esd.stations`)
40
+
41
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
40
42
  | :---------- | :------: | :------: | :------: | :------: |
41
- | AWDB stations (NRCS REST API) | ✅ | — | — | — |
42
- | CDEC stations (JSON data servlet) | ✅ | — | — | — |
43
- | BC snow stations (DataBC WFS) | ✅ | — | — | — |
44
- | NVE stations (HydAPI) | ⚠️ | — | — | — |
45
- | Yukon stations (AquaCache API) | ✅ | — | — | — |
46
- | SNOTEL/CCSS station list (GitHub) | ✅ | ✅ | ✅ | ✅ |
47
- | Snow station archive tarball (global_snow_networks) | ✅ | — | — | — |
48
- | SNOTEL/CCSS station CSV (GitHub) | ✅ | ✅ | ✅ | ✅ |
49
- | ARCO-ERA5 (GCS anonymous) | ✅ | ✅ | ✅ | ✅ |
50
- | ERA5 (Google Earth Engine) | ✅ | ✅ | ✅ | ✅ |
51
- | Köppen-Geiger classification (figshare) | ✅ | ✅ | ✅ | ✅ |
52
- | HUC geometries (USGS WBD REST) | ✅ | — | — | — |
53
- | HUC geometries (GEE/USGS WBD) | ✅ | ✅ | ✅ | ✅ |
54
- | HydroATLAS basins (figshare) | ✅ | ✅ | ✅ | ✅ |
55
- | HydroBASINS (HydroSHEDS regional zip) | ✅ | — | — | — |
56
- | HydroBASINS (GEE/HydroATLAS) | ✅ | — | — | — |
57
- | GRDC major river basins (World Bank) | ✅ | ✅ | ✅ | ✅ |
58
- | GRDC WMO basins | <abbr title="ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection r">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> |
59
- | MODIS snow cover MOD10A1F (NASA NSIDC) | ✅ | — | — | — |
60
- | MODIS snow cover MOD10A1 (Planetary Computer) | ✅ | — | — | — |
43
+ | AWDB stations (NRCS REST API) | ✅ | ✅ | — | — |
44
+ | CDEC stations (JSON data servlet) | ✅ | ✅ | — | — |
45
+ | BC snow stations (DataBC WFS) | ✅ | ✅ | — | — |
46
+ | NVE stations (HydAPI) | <abbr title="RuntimeError: Unreachable: HTTP 401">❌</abbr> | ⚠️ | — | — |
47
+ | Yukon stations (AquaCache API) | ✅ | ✅ | — | — |
48
+ | Snow station inventory (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
49
+ | Snow station archive tarball (global_snow_networks) | ✅ | ✅ | — | — |
50
+ | Snow station CSV (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
51
+
52
+ ### Snow (`esd.snow`)
53
+
54
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
55
+ | :---------- | :------: | :------: | :------: | :------: |
56
+ | MODIS snow cover MOD10A1F (NASA NSIDC) | ✅ | ✅ | — | — |
57
+ | MODIS snow cover MOD10A1 (Planetary Computer) | ✅ | ✅ | — | — |
61
58
  | Mountain snow mask (Zenodo) | ✅ | ✅ | ✅ | ✅ |
62
- | SNODAS (NSIDC G02158) | ✅ | — | — | — |
59
+ | SNODAS (NSIDC G02158) | ✅ | ✅ | — | — |
63
60
  | SNODAS (GEE/Climate Engine) | ✅ | ✅ | ✅ | ✅ |
64
- | Sturm & Liston snow classification (NSIDC-0768) | ✅ | — | — | — |
61
+ | Sturm & Liston snow classification (NSIDC-0768) | ✅ | ✅ | — | — |
65
62
  | Sturm & Liston snow classification (Azure) | ✅ | ✅ | ✅ | ✅ |
66
- | UCLA Snow Reanalysis (NASA NSIDC) | ✅ | ⚠️ | ⚠️ | ⚠️ |
67
- | HMA Snow Reanalysis (NASA NSIDC) | ✅ | — | — | — |
68
- | VIIRS snow cover VNP10A1F (NASA NSIDC) | ✅ | — | — | — |
63
+ | UCLA Snow Reanalysis (NASA NSIDC) | ✅ | ✅ | ⚠️ | ⚠️ |
64
+ | HMA Snow Reanalysis (NASA NSIDC) | ✅ | ✅ | — | — |
65
+ | VIIRS snow cover VNP10A1F (NASA NSIDC) | ✅ | ✅ | — | — |
66
+
67
+ ### SAR (`esd.sar`)
68
+
69
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
70
+ | :---------- | :------: | :------: | :------: | :------: |
71
+ | Sentinel-1 RTC (Planetary Computer) | ✅ | ✅ | — | — |
72
+ | Sentinel-1 RTC OPERA (CMR-STAC ASF) | ✅ | ✅ | — | — |
73
+ | Sentinel-1 RTC OPERA (Earth Engine) | ✅ | ✅ | — | — |
74
+ | Sentinel-1 static layers (CMR-STAC ASF) | ✅ | ✅ | — | — |
75
+ | Copernicus DEM for the incidence angle (Planetary Computer) | ✅ | ✅ | — | — |
76
+ | Sentinel-1 GRD angle band (Earth Engine) | ✅ | ✅ | — | — |
77
+
78
+ ### Optical imagery (`esd.optical`)
79
+
80
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
81
+ | :---------- | :------: | :------: | :------: | :------: |
82
+ | HLS L30 (CMR-STAC LPCLOUD) | ✅ | ✅ | — | — |
83
+ | HLS S30 (Planetary Computer) | ✅ | ✅ | — | — |
84
+ | PlanetScope (Planet Data API) | <abbr title="DeprecationWarning: Auth.value has been deprecated.">❌</abbr> | ⚠️ | — | — |
85
+ | Sentinel-2 L2A (Planetary Computer) | ✅ | ✅ | — | — |
86
+ | Sentinel-2 L2A (Earth Search) | ✅ | ✅ | — | — |
87
+
88
+ ### Terrain (`esd.terrain`)
89
+
90
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
91
+ | :---------- | :------: | :------: | :------: | :------: |
92
+ | CHILI (GEE/CSP ERGo) | ✅ | ✅ | ✅ | ✅ |
93
+ | Copernicus DEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
94
+ | Copernicus DEM (Earth Search) | ✅ | ✅ | — | — |
95
+
96
+ ### Land cover (`esd.land`)
97
+
98
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
99
+ | :---------- | :------: | :------: | :------: | :------: |
69
100
  | Forest cover fraction (Zenodo) | ✅ | ✅ | ✅ | ✅ |
70
- | Forest cover fraction (GEE/CGLS-LC100) | ✅ | — | — | — |
101
+ | Forest cover fraction (GEE/CGLS-LC100) | ✅ | ✅ | — | — |
71
102
  | ESA WorldCover (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
72
- | ESA WorldCover (AWS bucket) | ✅ | — | — | — |
73
- | Annual NLCD (GEE community asset) | ✅ | — | — | — |
103
+ | ESA WorldCover (AWS bucket) | ✅ | ✅ | — | — |
104
+ | Annual NLCD (GEE community asset) | ✅ | ✅ | — | — |
74
105
  | NLCD (GEE/USGS) | ✅ | ✅ | ✅ | ✅ |
75
- | HLS L30 (CMR-STAC LPCLOUD) | ✅ | — | — | — |
76
- | HLS S30 (Planetary Computer) | ✅ | — | — | — |
77
- | PlanetScope (Planet Data API) | ⚠️ | — | — | — |
78
- | Sentinel-2 L2A (Planetary Computer) | ✅ | — | — | — |
79
- | Sentinel-2 L2A (Earth Search) | ✅ | — | — | — |
80
- | Sentinel-1 RTC (Planetary Computer) | ✅ | — | — | — |
81
- | Sentinel-1 RTC OPERA (CMR-STAC ASF) | ✅ | — | — | — |
82
- | Sentinel-1 RTC OPERA (Earth Engine) | ✅ | — | — | — |
83
- | Sentinel-1 static layers (CMR-STAC ASF) | ✅ | — | — | — |
84
- | Copernicus DEM for the incidence angle (Planetary Computer) | ✅ | — | — | — |
85
- | Sentinel-1 GRD angle band (Earth Engine) | ✅ | — | — | — |
86
- | CHILI (GEE/CSP ERGo) | ✅ | ✅ | ✅ | ✅ |
87
- | Copernicus DEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
88
- | Copernicus DEM (Earth Search) | ✅ | — | — | — |
106
+
107
+ ### Hydrography (`esd.hydro`)
108
+
109
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
110
+ | :---------- | :------: | :------: | :------: | :------: |
111
+ | HUC geometries (USGS WBD REST) | ✅ | ✅ | — | — |
112
+ | HUC geometries (GEE/USGS WBD) | ✅ | ✅ | ✅ | ✅ |
113
+ | HydroATLAS basins (figshare) | ✅ | ✅ | ✅ | ✅ |
114
+ | HydroBASINS (HydroSHEDS regional zip) | <abbr title="RuntimeError: Unreachable: HTTP 403">❌</abbr> | ✅ | — | — |
115
+ | HydroBASINS (GEE/HydroATLAS) | ✅ | ✅ | — | — |
116
+ | GRDC major river basins (World Bank) | ✅ | ✅ | ✅ | ✅ |
117
+ | GRDC WMO basins | ✅ | <abbr title="ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection r">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> | <abbr title="RuntimeError: Unreachable: HTTP 404">❌</abbr> |
118
+
119
+ ### Climate (`esd.climate`)
120
+
121
+ | Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
122
+ | :---------- | :------: | :------: | :------: | :------: |
123
+ | ARCO-ERA5 (GCS anonymous) | ✅ | ✅ | ✅ | ✅ |
124
+ | ERA5 (Google Earth Engine) | ✅ | ✅ | ✅ | ✅ |
125
+ | Köppen-Geiger classification (figshare) | ✅ | ✅ | ✅ | ✅ |
89
126
  <!-- DATA_STATUS_END -->
90
127
 
91
128
  ## Installation
@@ -105,10 +142,10 @@ mamba install -c conda-forge easysnowdata
105
142
  ```bash
106
143
  git clone https://github.com/egagli/easysnowdata.git
107
144
  cd easysnowdata
108
- pixi install # sets up the environment
109
- pixi run test-unit # offline tests (no network, no credentials)
110
- pixi run test-live # live tests against the data providers (credentialed ones skip without secrets)
111
- pixi run docs-serve # preview the docs locally
145
+ pixi install # sets up the environments
146
+ pixi run -e test-py313 test-unit # offline tests (no network, no credentials)
147
+ pixi run -e test-py313 test-live # live tests against the data providers (credentialed ones skip without secrets)
148
+ pixi run -e docs docs-serve # preview the docs locally
112
149
  ```
113
150
 
114
151
  ### Services that require account setup
@@ -125,18 +162,18 @@ Planetary Computer and anonymous GCS access require no credentials.
125
162
  ## What is in it
126
163
 
127
164
  <!-- CATALOG_START -->
128
- 28 products across 8 themes, each with one or more access routes:
165
+ 32 products across 8 themes, each with one or more access routes:
129
166
 
130
167
  | theme | products | open without an account |
131
168
  | --- | --- | --- |
132
- | **climate** | [`era5`](https://egagli.github.io/easysnowdata/catalog/era5.html), [`koppen-geiger`](https://egagli.github.io/easysnowdata/catalog/koppen-geiger.html) | 2 of 2 |
133
- | **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 |
134
- | **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 |
135
- | **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 |
136
- | **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 |
137
- | **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 |
138
169
  | **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 |
139
- | **terrain** | [`chili`](https://egagli.github.io/easysnowdata/catalog/chili.html), [`copernicus-dem`](https://egagli.github.io/easysnowdata/catalog/copernicus-dem.html) | 1 of 2 |
170
+ | **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 |
171
+ | **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 |
172
+ | **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 |
173
+ | **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), [`nasadem`](https://egagli.github.io/easysnowdata/catalog/nasadem.html), [`srtm`](https://egagli.github.io/easysnowdata/catalog/srtm.html) | 4 of 6 |
174
+ | **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 |
175
+ | **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 |
176
+ | **climate** | [`era5`](https://egagli.github.io/easysnowdata/catalog/era5.html), [`koppen-geiger`](https://egagli.github.io/easysnowdata/catalog/koppen-geiger.html) | 2 of 2 |
140
177
  <!-- CATALOG_END -->
141
178
 
142
179
  Every product's routes, resolution, credentials, licence and health are on its
@@ -154,16 +191,19 @@ inv = esd.stations.inventory(aoi, daily_only=True)
154
191
  obs = esd.stations.load(inv, variables=["swe", "snwd"], time="2023-10/2024-09")
155
192
 
156
193
  # Terrain, SAR and snow water equivalent — lazy, Dask-backed, CRS attached
157
- dem = esd.terrain.dem.load(aoi) # Copernicus GLO-30
194
+ dem = esd.terrain.dem.load(aoi) # Copernicus GLO-30 (default)
195
+ dem = esd.terrain.dem.load(aoi, product="3dep") # or NASADEM, SRTM, 3DEP, ALOS
158
196
  s1 = esd.sar.sentinel1.load(aoi, "2024-03", units="dB") # Sentinel-1 RTC
159
197
  swe = esd.snow.snodas.load(aoi, "2024-03") # SNODAS, no account
160
198
 
161
- # Optical, masked and turned into a snow index
199
+ # Optical, masked, and a snow index written out rather than hidden in a helper
162
200
  s2 = esd.optical.sentinel2.load(aoi, "2024-03", mask="scl-default")
163
- ndsi = esd.processing.ndsi(s2)
201
+ ndsi = (s2["green"] - s2["swir16"]) / (s2["green"] + s2["swir16"])
164
202
 
165
- # Categorical products carry CF flag attrs, so the legend draws itself
203
+ # Maps with equal aspect, a scale bar and a graticule; legends from CF flags
204
+ esd.plotting.map(dem, cmap="terrain")
166
205
  esd.plotting.categorical(esd.land.landcover.load(aoi))
206
+ esd.plotting.timeseries(obs["swe"]) # calendar dates, units in [ ]
167
207
 
168
208
  # What is available, and what it needs
169
209
  esd.catalog.search("swe")
@@ -171,14 +211,14 @@ esd.catalog.describe("snodas")
171
211
  esd.auth.status()
172
212
  ```
173
213
 
174
- The pre-0.1 API (`easysnowdata.remote_sensing.get_*`,
175
- `automatic_weather_stations.StationCollection`, …) still works and emits a
176
- `DeprecationWarning` naming its replacement. It is removed one minor release
177
- after 0.1.
214
+ Coming from 0.0.x? The old module API (`remote_sensing.get_*`,
215
+ `automatic_weather_stations.StationCollection`, …) was deprecated in 0.2 and
216
+ removed in 0.3; the [migration guide](https://egagli.github.io/easysnowdata/migration.html)
217
+ maps every old name to its replacement.
178
218
 
179
219
  ## Documentation
180
220
 
181
- Full API reference and example notebooks: <https://egagli.github.io/easysnowdata>
221
+ Executed example gallery, data catalog and API reference: <https://egagli.github.io/easysnowdata>
182
222
 
183
223
  ## Contributing
184
224