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.
Files changed (243) hide show
  1. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/CHANGELOG.md +27 -0
  2. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/CITATION.cff +2 -2
  3. easysnowdata-0.3.4/PKG-INFO +353 -0
  4. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/POTENTIAL_DATA_PRODUCTS_SOURCES_AND_EXAMPLES.md +359 -28
  5. easysnowdata-0.3.4/README.md +295 -0
  6. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/REVAMP_PLAN.md +29 -27
  7. easysnowdata-0.3.4/WATCHLIST.toml +589 -0
  8. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/__init__.py +2 -0
  9. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/_version.py +2 -2
  10. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/__init__.py +2 -0
  11. easysnowdata-0.3.4/easysnowdata/auth/aisori.py +49 -0
  12. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/earthdata.py +137 -32
  13. easysnowdata-0.3.4/easysnowdata/boundaries/__init__.py +39 -0
  14. easysnowdata-0.3.4/easysnowdata/boundaries/admin.py +660 -0
  15. easysnowdata-0.3.4/easysnowdata/boundaries/glaciers.py +427 -0
  16. easysnowdata-0.3.4/easysnowdata/boundaries/mountains.py +192 -0
  17. easysnowdata-0.3.4/easysnowdata/boundaries/natural_earth.py +172 -0
  18. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/_models.py +6 -0
  19. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/_registry.py +4 -4
  20. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/health.py +109 -0
  21. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/pages.py +73 -13
  22. easysnowdata-0.3.4/easysnowdata/climate/__init__.py +12 -0
  23. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/climate/era5.py +24 -19
  24. easysnowdata-0.3.4/easysnowdata/climate/indices.py +736 -0
  25. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/climate/koppen_geiger.py +10 -9
  26. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/hydro/__init__.py +1 -1
  27. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/hydro/basins.py +5 -10
  28. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/land/forest_cover.py +3 -2
  29. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/land/landcover.py +13 -11
  30. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/land/nlcd.py +5 -4
  31. easysnowdata-0.3.4/easysnowdata/optical/__init__.py +16 -0
  32. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/optical/hls.py +84 -57
  33. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/optical/planetscope.py +175 -43
  34. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/optical/sentinel2.py +21 -18
  35. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/plotting/__init__.py +94 -46
  36. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/categorical.py +7 -7
  37. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/contract.py +77 -19
  38. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/masks.py +10 -10
  39. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/optical.py +45 -29
  40. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/sar.py +26 -26
  41. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/snow.py +3 -3
  42. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/wateryear.py +7 -4
  43. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/__init__.py +8 -0
  44. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/earthdata.py +56 -1
  45. easysnowdata-0.3.4/easysnowdata/providers/opentopography.py +230 -0
  46. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/stac.py +8 -0
  47. easysnowdata-0.3.4/easysnowdata/providers/table_http.py +33 -0
  48. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/sar/__init__.py +1 -1
  49. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/sar/sentinel1.py +59 -55
  50. easysnowdata-0.3.4/easysnowdata/snow/__init__.py +59 -0
  51. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/modis.py +25 -14
  52. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/mountain_snow_mask.py +6 -5
  53. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/snodas.py +9 -8
  54. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/snow_classification.py +34 -32
  55. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/ucla_sr.py +7 -6
  56. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/snow/viirs.py +19 -18
  57. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/__init__.py +9 -8
  58. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/_adapter.py +15 -15
  59. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/_catalog.py +12 -7
  60. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/_frames.py +52 -42
  61. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/archive.py +38 -35
  62. easysnowdata-0.3.4/easysnowdata/stations/clients/README.md +2844 -0
  63. easysnowdata-0.3.4/easysnowdata/stations/clients/__init__.py +57 -0
  64. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/_common.py +193 -1
  65. easysnowdata-0.3.4/easysnowdata/stations/clients/alberta/__init__.py +3 -0
  66. easysnowdata-0.3.4/easysnowdata/stations/clients/alberta/alberta_client.py +991 -0
  67. easysnowdata-0.3.4/easysnowdata/stations/clients/canswe/__init__.py +3 -0
  68. easysnowdata-0.3.4/easysnowdata/stations/clients/canswe/_format.py +1417 -0
  69. easysnowdata-0.3.4/easysnowdata/stations/clients/canswe/canswe_client.py +187 -0
  70. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/cdec/cdec_client.py +26 -26
  71. easysnowdata-0.3.4/easysnowdata/stations/clients/ceaza/__init__.py +3 -0
  72. easysnowdata-0.3.4/easysnowdata/stations/clients/ceaza/ceaza_client.py +940 -0
  73. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/databc/databc_client.py +10 -10
  74. easysnowdata-0.3.4/easysnowdata/stations/clients/dwd/__init__.py +3 -0
  75. easysnowdata-0.3.4/easysnowdata/stations/clients/dwd/dwd_client.py +967 -0
  76. easysnowdata-0.3.4/easysnowdata/stations/clients/ghcnd/__init__.py +3 -0
  77. easysnowdata-0.3.4/easysnowdata/stations/clients/ghcnd/ghcnd_client.py +875 -0
  78. easysnowdata-0.3.4/easysnowdata/stations/clients/hydroquebec/__init__.py +3 -0
  79. easysnowdata-0.3.4/easysnowdata/stations/clients/hydroquebec/hydroquebec_client.py +1019 -0
  80. easysnowdata-0.3.4/easysnowdata/stations/clients/norswe/__init__.py +3 -0
  81. easysnowdata-0.3.4/easysnowdata/stations/clients/norswe/norswe_client.py +239 -0
  82. easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/__init__.py +3 -0
  83. easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/_aisori.py +501 -0
  84. easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/rihmi_client.py +1693 -0
  85. easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/route_survey_stations.csv +522 -0
  86. easysnowdata-0.3.4/easysnowdata/stations/clients/rihmi/snow_cover_stations.csv +625 -0
  87. easysnowdata-0.3.4/easysnowdata/stations/clients/slf/__init__.py +3 -0
  88. easysnowdata-0.3.4/easysnowdata/stations/clients/slf/slf_client.py +1068 -0
  89. easysnowdata-0.3.4/easysnowdata/stations/clients/snih/__init__.py +3 -0
  90. easysnowdata-0.3.4/easysnowdata/stations/clients/snih/snih_client.py +1054 -0
  91. easysnowdata-0.3.4/easysnowdata/stations/clients/southern_andes/__init__.py +3 -0
  92. easysnowdata-0.3.4/easysnowdata/stations/clients/southern_andes/southern_andes_client.py +732 -0
  93. easysnowdata-0.3.4/easysnowdata/stations/clients/syke/__init__.py +3 -0
  94. easysnowdata-0.3.4/easysnowdata/stations/clients/syke/syke_client.py +748 -0
  95. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/yukon/yukon_client.py +28 -7
  96. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/networks.py +1 -1
  97. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/terrain/__init__.py +7 -3
  98. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/terrain/chili.py +9 -7
  99. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/terrain/dem.py +330 -57
  100. easysnowdata-0.3.4/easysnowdata/terrain/hillshade.py +237 -0
  101. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/pyproject.toml +1 -1
  102. easysnowdata-0.3.4/scripts/gallery_fallback.py +227 -0
  103. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/make_montage.py +8 -1
  104. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/update_readme_status.py +5 -2
  105. easysnowdata-0.3.4/scripts/watch.py +1330 -0
  106. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/conftest.py +6 -0
  107. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/make_fixtures.py +238 -0
  108. easysnowdata-0.3.4/tests/static/test_boundaries.py +552 -0
  109. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_snow_classification.py +12 -4
  110. easysnowdata-0.3.4/tests/static/test_terrain_dem.py +451 -0
  111. easysnowdata-0.3.4/tests/static/test_terrain_hillshade.py +128 -0
  112. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_theme_common.py +12 -3
  113. easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/README.md +16 -0
  114. easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/route_semicolon.zip +0 -0
  115. easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/route_space.zip +0 -0
  116. easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/snow_cover_semicolon.zip +0 -0
  117. easysnowdata-0.3.4/tests/stations/fixtures/rihmi_aisori/snow_cover_space.zip +0 -0
  118. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_adapter.py +3 -1
  119. easysnowdata-0.3.4/tests/stations/test_alberta_client.py +493 -0
  120. easysnowdata-0.3.4/tests/stations/test_canswe_client.py +464 -0
  121. easysnowdata-0.3.4/tests/stations/test_ceaza_client.py +557 -0
  122. easysnowdata-0.3.4/tests/stations/test_clients_offline.py +923 -0
  123. easysnowdata-0.3.4/tests/stations/test_common_download.py +161 -0
  124. easysnowdata-0.3.4/tests/stations/test_dwd_client.py +390 -0
  125. easysnowdata-0.3.4/tests/stations/test_ghcnd_client.py +319 -0
  126. easysnowdata-0.3.4/tests/stations/test_hydroquebec_client.py +388 -0
  127. easysnowdata-0.3.4/tests/stations/test_norswe_client.py +215 -0
  128. easysnowdata-0.3.4/tests/stations/test_rihmi_client.py +679 -0
  129. easysnowdata-0.3.4/tests/stations/test_slf_client.py +503 -0
  130. easysnowdata-0.3.4/tests/stations/test_snih_client.py +599 -0
  131. easysnowdata-0.3.4/tests/stations/test_southern_andes_client.py +335 -0
  132. easysnowdata-0.3.4/tests/stations/test_syke_client.py +390 -0
  133. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_yukon_client.py +1 -1
  134. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_auth.py +122 -31
  135. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_catalog.py +47 -0
  136. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_docs_pages.py +12 -7
  137. easysnowdata-0.3.4/tests/test_gallery_fallback.py +128 -0
  138. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_health_reporting.py +11 -0
  139. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_montage.py +14 -0
  140. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_plotting.py +46 -0
  141. easysnowdata-0.3.4/tests/test_watch.py +860 -0
  142. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/fixtures/make_fixtures.py +1 -1
  143. easysnowdata-0.3.4/tests/timeseries/test_climate_indices.py +320 -0
  144. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_hls.py +17 -4
  145. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_modis.py +17 -0
  146. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_planetscope.py +130 -0
  147. easysnowdata-0.3.2/PKG-INFO +0 -289
  148. easysnowdata-0.3.2/README.md +0 -231
  149. easysnowdata-0.3.2/WATCHLIST.toml +0 -281
  150. easysnowdata-0.3.2/easysnowdata/climate/__init__.py +0 -12
  151. easysnowdata-0.3.2/easysnowdata/optical/__init__.py +0 -14
  152. easysnowdata-0.3.2/easysnowdata/snow/__init__.py +0 -50
  153. easysnowdata-0.3.2/easysnowdata/stations/clients/README.md +0 -1102
  154. easysnowdata-0.3.2/easysnowdata/stations/clients/__init__.py +0 -18
  155. easysnowdata-0.3.2/scripts/watch.py +0 -757
  156. easysnowdata-0.3.2/tests/static/test_terrain_dem.py +0 -219
  157. easysnowdata-0.3.2/tests/stations/test_clients_offline.py +0 -372
  158. easysnowdata-0.3.2/tests/test_watch.py +0 -361
  159. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/.editorconfig +0 -0
  160. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/.gitignore +0 -0
  161. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/.pre-commit-config.yaml +0 -0
  162. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/LICENSE +0 -0
  163. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/_gdal.py +0 -0
  164. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/aoi.py +0 -0
  165. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/_base.py +0 -0
  166. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/earthengine.py +0 -0
  167. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/nve.py +0 -0
  168. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/planet.py +0 -0
  169. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/auth/planetary_computer.py +0 -0
  170. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/__init__.py +0 -0
  171. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/catalog/_access.py +0 -0
  172. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/config.py +0 -0
  173. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/land/__init__.py +0 -0
  174. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/processing/__init__.py +0 -0
  175. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/gee.py +0 -0
  176. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/planet.py +0 -0
  177. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/raster_http.py +0 -0
  178. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/vector_http.py +0 -0
  179. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/providers/zarr_cloud.py +0 -0
  180. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/awdb/__init__.py +0 -0
  181. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/awdb/awdb_client.py +0 -0
  182. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/cdec/__init__.py +0 -0
  183. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/databc/__init__.py +0 -0
  184. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/nve/__init__.py +0 -0
  185. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/nve/nve_client.py +0 -0
  186. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/stations/clients/yukon/__init__.py +0 -0
  187. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/easysnowdata/temporal.py +0 -0
  188. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/check_data_sources.py +0 -0
  189. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/feedstock_requirements.py +0 -0
  190. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/scripts/report_health.py +0 -0
  191. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/__init__.py +0 -0
  192. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_cmr_lpcloud_hls_search_is_open.yaml +0 -0
  193. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_earth_search_sentinel2_search_with_time.yaml +0 -0
  194. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_health_first_byte_probe_replays.yaml +0 -0
  195. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_health_stac_probe_replays.yaml +0 -0
  196. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/cassettes/test_recorded/test_planetary_computer_dem_search.yaml +0 -0
  197. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/fixtures/make_fixtures.py +0 -0
  198. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/__init__.py +0 -0
  199. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/cassettes/test_land_landcover/TestSearchRecorded.test_search_filters_by_version.yaml +0 -0
  200. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/cassettes/test_terrain_dem/TestSearchRecorded.test_search_on_earth_search.yaml +0 -0
  201. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/cassettes/test_terrain_dem/TestSearchRecorded.test_search_returns_tiles.yaml +0 -0
  202. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/conftest.py +0 -0
  203. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_hydro_basins.py +0 -0
  204. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_land_forest_cover.py +0 -0
  205. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_land_landcover.py +0 -0
  206. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_land_nlcd.py +0 -0
  207. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_snow_mountain_snow_mask.py +0 -0
  208. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/static/test_terrain_chili.py +0 -0
  209. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/__init__.py +0 -0
  210. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/conftest.py +0 -0
  211. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/fixtures/make_fixtures.py +0 -0
  212. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_adapter_offline.py +0 -0
  213. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_archive.py +0 -0
  214. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_awdb_client.py +0 -0
  215. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_cdec_client.py +0 -0
  216. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_databc_client.py +0 -0
  217. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/stations/test_nve_client.py +0 -0
  218. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_aoi.py +0 -0
  219. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_config.py +0 -0
  220. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_credentials.py +0 -0
  221. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_easysnowdata.py +0 -0
  222. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_edges.py +0 -0
  223. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_feedstock_requirements.py +0 -0
  224. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_processing.py +0 -0
  225. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_providers.py +0 -0
  226. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_recorded.py +0 -0
  227. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/test_temporal.py +0 -0
  228. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/__init__.py +0 -0
  229. {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
  230. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_hls/test_search_planetary_computer_mirror.yaml +0 -0
  231. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_sentinel1/test_search_opera_rtc_is_open.yaml +0 -0
  232. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_sentinel1/test_search_planetary_computer.yaml +0 -0
  233. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_sentinel2/test_search_earth_search_collection_1.yaml +0 -0
  234. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/cassettes/test_sentinel2/test_search_planetary_computer.yaml +0 -0
  235. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/conftest.py +0 -0
  236. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_contract.py +0 -0
  237. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_era5.py +0 -0
  238. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_koppen_geiger.py +0 -0
  239. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_sentinel1.py +0 -0
  240. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_sentinel2.py +0 -0
  241. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_snodas.py +0 -0
  242. {easysnowdata-0.3.2 → easysnowdata-0.3.4}/tests/timeseries/test_ucla_sr.py +0 -0
  243. {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>
@@ -38,5 +38,5 @@ keywords:
38
38
  - snow classification
39
39
  - easysnowdata
40
40
  license: MIT
41
- version: v0.3.2
42
- date-released: '2026-09-23'
41
+ version: v0.3.3
42
+ date-released: '2026-10-21'
@@ -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
+ [![PyPI](https://img.shields.io/pypi/v/easysnowdata.svg)](https://pypi.python.org/pypi/easysnowdata)
62
+ [![conda-forge](https://img.shields.io/conda/vn/conda-forge/easysnowdata.svg)](https://anaconda.org/conda-forge/easysnowdata)
63
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14741501.svg)](https://doi.org/10.5281/zenodo.14741501)
64
+ [![CI](https://github.com/egagli/easysnowdata/actions/workflows/ci.yml/badge.svg)](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
+ [![easysnowdata example gallery](https://egagli.github.io/easysnowdata/_static/gallery.webp)](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=&#x27;zenodo.org&#x27;, 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
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14741501.svg)](https://doi.org/10.5281/zenodo.14741501)