pygeofetch 2.6.0__tar.gz → 2.6.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 (175) hide show
  1. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/CHANGELOG.md +5 -5
  2. pygeofetch-2.6.2/PKG-INFO +407 -0
  3. pygeofetch-2.6.2/README.md +272 -0
  4. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/__init__.py +1 -1
  5. pygeofetch-2.6.2/pygeofetch/cli/monitor_commands.py +106 -0
  6. pygeofetch-2.6.2/pygeofetch/core/monitor.py +153 -0
  7. pygeofetch-2.6.2/pygeofetch/core/state.py +232 -0
  8. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/__init__.py +105 -3
  9. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/geolocation.py +99 -0
  10. pygeofetch-2.6.2/pygeofetch/insar/offset_geometry.py +199 -0
  11. pygeofetch-2.6.2/pygeofetch/insar/offset_tracking.py +415 -0
  12. pygeofetch-2.6.2/pygeofetch/insar/ps_selection.py +347 -0
  13. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/timeseries.py +538 -259
  14. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/validate.py +114 -0
  15. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/meta.yaml +1 -1
  16. pygeofetch-2.6.2/pygeofetch.egg-info/PKG-INFO +407 -0
  17. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch.egg-info/SOURCES.txt +13 -2
  18. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch.egg-info/requires.txt +4 -4
  19. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pyproject.toml +2 -2
  20. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_build_sbas_network.py +2 -2
  21. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_burst_sync_large_gap.py +3 -3
  22. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_burst_sync_prescreening.py +1 -1
  23. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_burst_synchronization.py +3 -3
  24. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_copernicus_nodes.py +3 -3
  25. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_coregister_upgrades.py +1 -1
  26. pygeofetch-2.6.2/tests/test_monitor.py +113 -0
  27. pygeofetch-2.6.2/tests/test_offset_tracking.py +231 -0
  28. pygeofetch-2.6.2/tests/test_ps_selection.py +231 -0
  29. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_reference_pixel_and_despike.py +2 -2
  30. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_risk_mapping.py +1 -1
  31. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_screen_stack_orchestration.py +4 -4
  32. pygeofetch-2.6.2/tests/test_sign_convention.py +175 -0
  33. pygeofetch-2.6.2/tests/test_state.py +123 -0
  34. pygeofetch-2.6.2/tests/test_wls_inversion.py +167 -0
  35. pygeofetch-2.6.0/PKG-INFO +0 -916
  36. pygeofetch-2.6.0/README.md +0 -781
  37. pygeofetch-2.6.0/pygeofetch.egg-info/PKG-INFO +0 -916
  38. pygeofetch-2.6.0/tests/test_atmospheric_circular_regression.py +0 -104
  39. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/LICENSE +0 -0
  40. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/MANIFEST.in +0 -0
  41. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/__init__.py +0 -0
  42. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/auth_commands.py +0 -0
  43. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/config_commands.py +0 -0
  44. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/download_commands.py +0 -0
  45. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/index_commands.py +0 -0
  46. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/main.py +0 -0
  47. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/pipeline_process_commands.py +0 -0
  48. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/postprocess_commands.py +0 -0
  49. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/preprocess_commands.py +0 -0
  50. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/sar_commands.py +0 -0
  51. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/cli/search_commands.py +0 -0
  52. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/config/__init__.py +0 -0
  53. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/config/defaults.yaml +0 -0
  54. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/config/settings.py +0 -0
  55. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/core/__init__.py +0 -0
  56. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/core/authenticator.py +0 -0
  57. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/core/cache_manager.py +0 -0
  58. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/core/downloader.py +0 -0
  59. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/core/engine.py +0 -0
  60. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/core/logging.py +0 -0
  61. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/core/orbits.py +0 -0
  62. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/core/scheduler.py +0 -0
  63. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/core/searcher.py +0 -0
  64. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/analysis.py +0 -0
  65. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/annotation.py +0 -0
  66. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/atmosphere.py +0 -0
  67. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/coregister.py +0 -0
  68. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/deburst.py +0 -0
  69. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/esd.py +0 -0
  70. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/extraction.py +0 -0
  71. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/flatearth.py +0 -0
  72. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/gpu.py +0 -0
  73. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/interferogram.py +0 -0
  74. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/ionosphere.py +0 -0
  75. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/preflight.py +0 -0
  76. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/provenance.py +0 -0
  77. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/splitspectrum_diagnostic.py +0 -0
  78. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/stack_selection.py +0 -0
  79. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/synthetic.py +0 -0
  80. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/unwrap.py +0 -0
  81. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/visualize.py +0 -0
  82. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/insar/workflow.py +0 -0
  83. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/models/__init__.py +0 -0
  84. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/models/download_task.py +0 -0
  85. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/models/satellite_data.py +0 -0
  86. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/models/search_query.py +0 -0
  87. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/models/user_auth.py +0 -0
  88. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processing/__init__.py +0 -0
  89. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processing/base.py +0 -0
  90. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processing/batch.py +0 -0
  91. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processing/indices.py +0 -0
  92. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processing/pipeline.py +0 -0
  93. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processing/postprocessor.py +0 -0
  94. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processing/preprocessor.py +0 -0
  95. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processing/sar.py +0 -0
  96. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processor/__init__.py +0 -0
  97. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processor/indices.py +0 -0
  98. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processor/landsat.py +0 -0
  99. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processor/loader.py +0 -0
  100. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processor/stacker.py +0 -0
  101. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/processor/timeseries.py +0 -0
  102. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/__init__.py +0 -0
  103. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/airbus_oneatlas.py +0 -0
  104. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/alaska_satellite_facility.py +0 -0
  105. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/aws_earth.py +0 -0
  106. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/base.py +0 -0
  107. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/copernicus.py +0 -0
  108. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/copernicus_nodes.py +0 -0
  109. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/digitalglobe.py +0 -0
  110. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/earth_explorer_additional.py +0 -0
  111. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/element84.py +0 -0
  112. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/eodag_provider.py +0 -0
  113. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/esa_scihub.py +0 -0
  114. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/geoserver_generic.py +0 -0
  115. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/google_earth_engine.py +0 -0
  116. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/inpe_cbers.py +0 -0
  117. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/isro_bhuvan.py +0 -0
  118. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/jaxa_earth.py +0 -0
  119. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/maxar_gbdx.py +0 -0
  120. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/nasa_earthdata.py +0 -0
  121. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/nasa_earthdata_cloud.py +0 -0
  122. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/noaa_big_data.py +0 -0
  123. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/opentopography.py +0 -0
  124. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/planet.py +0 -0
  125. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/planetary_computer.py +0 -0
  126. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/sentinel_hub.py +0 -0
  127. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/terrabotics.py +0 -0
  128. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/providers/usgs.py +0 -0
  129. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/sar/__init__.py +0 -0
  130. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/sar/_native.py +0 -0
  131. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/sar/_ost.py +0 -0
  132. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/sar/_sarxarray.py +0 -0
  133. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/sar/extraction.py +0 -0
  134. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/sar/processor.py +0 -0
  135. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/utils/__init__.py +0 -0
  136. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/utils/file_utils.py +0 -0
  137. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/utils/gcp_recovery.py +0 -0
  138. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/utils/geo_utils.py +0 -0
  139. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/utils/logging_setup.py +0 -0
  140. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/utils/retry_handler.py +0 -0
  141. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/utils/validators.py +0 -0
  142. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/viz/__init__.py +0 -0
  143. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/viz/map.py +0 -0
  144. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch/viz/plot.py +0 -0
  145. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch.egg-info/dependency_links.txt +0 -0
  146. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch.egg-info/entry_points.txt +0 -0
  147. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch.egg-info/not-zip-safe +0 -0
  148. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/pygeofetch.egg-info/top_level.txt +0 -0
  149. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/setup.cfg +0 -0
  150. /pygeofetch-2.6.0/tests/test_atmospheric_circular_regression (1).py → /pygeofetch-2.6.2/tests/test_atmospheric_circular_regression.py +0 -0
  151. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_burst_metadata.py +0 -0
  152. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_burst_processing_integration.py +0 -0
  153. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_coregister_integration.py +0 -0
  154. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_era5_atmospheric_correction.py +0 -0
  155. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_extraction.py +0 -0
  156. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_flat_earth_phase.py +0 -0
  157. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_gcp_reprojection.py +0 -0
  158. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_insar.py +0 -0
  159. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_ionosphere.py +0 -0
  160. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_map_preview_consolidation.py +0 -0
  161. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_models.py +0 -0
  162. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_pgv_integration_contract.py +0 -0
  163. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_preflight_gate (1).py +0 -0
  164. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_preflight_gate.py +0 -0
  165. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_provider_geometry_audit (1).py +0 -0
  166. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_provider_geometry_audit.py +0 -0
  167. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_provider_scene_disambiguation.py +0 -0
  168. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_providers.py +0 -0
  169. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_raster_collocation_integration.py +0 -0
  170. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_search_download.py +0 -0
  171. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_splitspectrum_diagnostic.py +0 -0
  172. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_stack_selection_consolidation.py +0 -0
  173. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_topo_r2_bug.py +0 -0
  174. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_utils.py +0 -0
  175. {pygeofetch-2.6.0 → pygeofetch-2.6.2}/tests/test_viz_plot.py +0 -0
@@ -1,9 +1,9 @@
1
1
  # Changelog
2
2
 
3
3
  All notable changes to PyGeoFetch are documented here.
4
- Format follows [Keep a Changelog](https://keepachangelog.com/en/2.6.0/).
4
+ Format follows [Keep a Changelog](https://keepachangelog.com/en/2.6.2/).
5
5
 
6
- ## [2.6.0] — 2026-07-29
6
+ ## [2.6.2] — 2026-07-29
7
7
 
8
8
  ### Added
9
9
  - Major SNAPHU unwrapping improvements for urban InSAR applications
@@ -72,7 +72,7 @@ unwrapped = unwrapper.unwrap(
72
72
 
73
73
  ---
74
74
 
75
- ## [2.6.0] — 2026-07-12
75
+ ## [2.6.2] — 2026-07-12
76
76
 
77
77
  ### Added
78
78
  - Federated search across 22+ satellite data providers
@@ -188,8 +188,8 @@ unwrapped = unwrapper.unwrap(
188
188
 
189
189
  | Version | Date | Key Changes |
190
190
  |---------|------------|-------------|
191
- | **2.6.0** | 2026-07-29 | SNAPHU unwrapping fixes, 87.1% reliable pixels |
192
- | **2.6.0** | 2026-07-12 | 22 providers, 17 indices, Sentinel-1C/D |
191
+ | **2.6.2** | 2026-07-29 | SNAPHU unwrapping fixes, 87.1% reliable pixels |
192
+ | **2.6.2** | 2026-07-12 | 22 providers, 17 indices, Sentinel-1C/D |
193
193
  | **1.9.2** | 2026-06-15 | Batch processing, parallel downloads |
194
194
  | **1.9.1** | 2026-05-20 | 3D terrain, SNAPHU integration, time series |
195
195
  | **1.9.0** | 2026-04-25 | Initial public release |
@@ -0,0 +1,407 @@
1
+ Metadata-Version: 2.4
2
+ Name: pygeofetch
3
+ Version: 2.6.2
4
+ Summary: Universal satellite data pipeline + geospatial processing platform
5
+ Author-email: Samuel Appiah Kubi <appiahkubis14@gmail.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Samuel Appiah Kubi
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://www.eocoreint.com/
29
+ Project-URL: Documentation, https://appiahkubis14.github.io/pygeofetch-docs/
30
+ Project-URL: Repository, https://github.com/EOCoreINT/pygeofetch
31
+ Project-URL: Bug Tracker, https://github.com/EOCoreINT/pygeofetch/issues
32
+ Keywords: satellite,remote-sensing,GIS,earth-observation,geospatial,SAR,Sentinel,Landsat
33
+ Classifier: Development Status :: 5 - Production/Stable
34
+ Classifier: Intended Audience :: Science/Research
35
+ Classifier: License :: OSI Approved :: MIT License
36
+ Classifier: Programming Language :: Python :: 3
37
+ Classifier: Programming Language :: Python :: 3.9
38
+ Classifier: Programming Language :: Python :: 3.10
39
+ Classifier: Programming Language :: Python :: 3.11
40
+ Classifier: Programming Language :: Python :: 3.12
41
+ Classifier: Topic :: Scientific/Engineering :: GIS
42
+ Requires-Python: >=3.9
43
+ Description-Content-Type: text/markdown
44
+ License-File: LICENSE
45
+ Requires-Dist: httpx>=0.27
46
+ Requires-Dist: click>=8.1
47
+ Requires-Dist: pydantic>=2.5
48
+ Requires-Dist: pydantic-settings>=2.1
49
+ Requires-Dist: PyYAML>=6.0
50
+ Requires-Dist: cryptography>=42.0
51
+ Requires-Dist: keyring>=24.3
52
+ Requires-Dist: tenacity>=8.2
53
+ Requires-Dist: python-dateutil>=2.9
54
+ Requires-Dist: requests>=2.31
55
+ Requires-Dist: anyio>=4.2
56
+ Requires-Dist: numpy>=1.26
57
+ Requires-Dist: tqdm>=4.66
58
+ Provides-Extra: geo
59
+ Requires-Dist: rasterio>=1.3; extra == "geo"
60
+ Requires-Dist: geopandas>=0.14; extra == "geo"
61
+ Requires-Dist: pyarrow>=15.0; extra == "geo"
62
+ Requires-Dist: shapely>=2.0; extra == "geo"
63
+ Requires-Dist: pyproj>=3.6; extra == "geo"
64
+ Provides-Extra: processor
65
+ Requires-Dist: rasterio>=1.3; extra == "processor"
66
+ Requires-Dist: rioxarray>=0.15; extra == "processor"
67
+ Requires-Dist: xarray>=2024.1; extra == "processor"
68
+ Requires-Dist: eoreader>=0.24; extra == "processor"
69
+ Requires-Dist: spyndex>=0.5; extra == "processor"
70
+ Requires-Dist: scipy>=1.12; extra == "processor"
71
+ Requires-Dist: scikit-image>=0.23; extra == "processor"
72
+ Requires-Dist: geopandas>=0.14; extra == "processor"
73
+ Provides-Extra: providers
74
+ Requires-Dist: eodag>=3.0; extra == "providers"
75
+ Provides-Extra: insar
76
+ Requires-Dist: sarxarray>=0.1; extra == "insar"
77
+ Requires-Dist: scipy>=1.12; extra == "insar"
78
+ Provides-Extra: ost
79
+ Requires-Dist: opensartoolkit>=3.0; extra == "ost"
80
+ Provides-Extra: viz
81
+ Requires-Dist: leafmap>=0.30; extra == "viz"
82
+ Requires-Dist: folium>=0.16; extra == "viz"
83
+ Requires-Dist: matplotlib>=3.7; extra == "viz"
84
+ Requires-Dist: localtileserver>=1.0.0; extra == "viz"
85
+ Requires-Dist: ipysheet>=0.6.0; extra == "viz"
86
+ Requires-Dist: ipyleaflet>=0.17.0; extra == "viz"
87
+ Requires-Dist: ipywidgets>=8.0.0; extra == "viz"
88
+ Requires-Dist: ipyevents>=2.0.2; extra == "viz"
89
+ Requires-Dist: ipyfilechooser>=0.6.0; extra == "viz"
90
+ Requires-Dist: sidecar>=0.6.0; extra == "viz"
91
+ Requires-Dist: bokeh>=3.0.0; extra == "viz"
92
+ Requires-Dist: seaborn>=0.12.0; extra == "viz"
93
+ Requires-Dist: plotly>=5.14.0; extra == "viz"
94
+ Requires-Dist: whitebox>=2.4.0; extra == "viz"
95
+ Requires-Dist: whiteboxgui>=2.4.0; extra == "viz"
96
+ Requires-Dist: geemap>=0.28.0; extra == "viz"
97
+ Requires-Dist: osmnx>=1.9.4; extra == "viz"
98
+ Requires-Dist: contextily>=1.9.4; extra == "viz"
99
+ Requires-Dist: xyzservices>=2023.10.0; extra == "viz"
100
+ Requires-Dist: mapclassify>=2.6.0; extra == "viz"
101
+ Requires-Dist: geoplot>=0.5.0; extra == "viz"
102
+ Requires-Dist: mplleaflet>=0.0.5; extra == "viz"
103
+ Requires-Dist: branca>=0.6.0; extra == "viz"
104
+ Requires-Dist: plotly-geo>=1.0.0; extra == "viz"
105
+ Requires-Dist: streamlit>=1.28.0; extra == "viz"
106
+ Requires-Dist: pyvista; extra == "viz"
107
+ Provides-Extra: viz-3d
108
+ Requires-Dist: keplergl>=0.3.0; extra == "viz-3d"
109
+ Provides-Extra: cloud
110
+ Requires-Dist: boto3>=1.34; extra == "cloud"
111
+ Requires-Dist: pystac>=1.9; extra == "cloud"
112
+ Requires-Dist: planetary-computer>=1.0; extra == "cloud"
113
+ Provides-Extra: notebook
114
+ Requires-Dist: ipython>=8.0; extra == "notebook"
115
+ Requires-Dist: ipywidgets>=8.0; extra == "notebook"
116
+ Requires-Dist: jupyter>=1.0; extra == "notebook"
117
+ Provides-Extra: schedule
118
+ Requires-Dist: croniter>=2.0; extra == "schedule"
119
+ Provides-Extra: dev
120
+ Requires-Dist: pytest>=8.0; extra == "dev"
121
+ Requires-Dist: pytest-cov>=4.1; extra == "dev"
122
+ Requires-Dist: pytest-mock>=3.12; extra == "dev"
123
+ Requires-Dist: ruff>=0.3; extra == "dev"
124
+ Requires-Dist: mypy>=1.8; extra == "dev"
125
+ Requires-Dist: build>=1.0; extra == "dev"
126
+ Requires-Dist: twine>=5.0; extra == "dev"
127
+ Provides-Extra: insar-full
128
+ Requires-Dist: snaphu>=0.1; extra == "insar-full"
129
+ Requires-Dist: scipy>=1.12; extra == "insar-full"
130
+ Provides-Extra: full
131
+ Requires-Dist: pygeofetch[cloud,geo,notebook,processor,providers,sar,schedule,viz]; extra == "full"
132
+ Provides-Extra: all
133
+ Requires-Dist: pygeofetch[full]; extra == "all"
134
+ Dynamic: license-file
135
+
136
+ <div align="center">
137
+
138
+ <img src="https://raw.githubusercontent.com/EOCoreINT/pygeofetch/main/icon/pygeofetch_logo.png" alt="PyGeoFetch Logo" width="350">
139
+
140
+ [![PyPI version](https://badge.fury.io/py/pygeofetch.svg)](https://pypi.org/project/pygeofetch/)
141
+ [![Python Versions](https://img.shields.io/pypi/pyversions/pygeofetch.svg)](https://pypi.org/project/pygeofetch/)
142
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
143
+ [![Tests](https://github.com/appiahkubis14/pygeofetch/actions/workflows/tests.yml/badge.svg)](https://github.com/appiahkubis14/pygeofetch/actions)
144
+ [![Coverage](https://codecov.io/gh/appiahkubis14/pygeofetch/branch/main/graph/badge.svg)](https://codecov.io/gh/appiahkubis14/pygeofetch)
145
+
146
+ **A unified satellite data and geospatial processing platform — one CLI, one Python API, 24 providers, and a fully verified InSAR chain.**
147
+
148
+ [Quick Start](#-quick-start) · [Mexico City Case Study](#-case-study-mapping-mexico-city-land-subsidence-with-insar) · [Case Study Repo ↗](https://github.com/EOCoreINT/mexico-subsidence-project) · [Documentation](https://appiahkubis14.github.io/pygeofetch-docs/) · [Notebooks](#-notebooks)
149
+
150
+ </div>
151
+
152
+ ---
153
+
154
+ ## Overview
155
+
156
+ pygeofetch is a production-ready framework for acquiring and processing Earth observation data. It provides authenticated, unified access to **24 satellite repositories** — Sentinel, Landsat, Planet, Maxar, Airbus, Copernicus, USGS, NASA, JAXA, and more — through a single CLI and Python API, and layers a complete geospatial processing engine on top.
157
+
158
+ Where pygeofetch goes further than most data-access libraries is in its **InSAR chain**: burst-aware coregistration, real flat-earth and topographic phase removal, ERA5 tropospheric and ionospheric correction, phase unwrapping, and SBAS time-series inversion — each stage independently verified against synthetic ground truth or real, published deformation studies, not assumed correct from theory alone. The [Mexico City case study](#-case-study-mapping-mexico-city-land-subsidence-with-insar) below walks through that chain end to end on real Sentinel-1 data.
159
+
160
+ **Core capabilities:**
161
+
162
+ | | |
163
+ |---|---|
164
+ | 🔐 **Authenticated access** | 24 providers, credentials stored via system keyring (Keychain / Credential Manager / Secret Service) |
165
+ | 🔍 **Federated search** | One query across all providers → STAC 1.0 GeoJSON / GeoParquet / CSV, with real footprint geometry where the provider supplies it |
166
+ | 📥 **Resilient downloads** | Parallel, resumable, checksum-verified, band-selective, atomic writes |
167
+ | ⚙️ **Preprocessing** | Atmospheric correction, cloud masking, reprojection, resampling, pan-sharpening, mosaicking |
168
+ | 📊 **17 spectral indices** | NDVI, EVI, SAVI, NDWI, MNDWI, NDBI, LST, Albedo, dNBR, GLCM texture, and more |
169
+ | 🌐 **Verified InSAR chain** | Coregistration → phase removal → atmospheric/ionospheric correction → unwrapping → SBAS inversion |
170
+ | 📋 **YAML pipelines** | Chainable, schedulable, repeatable workflows with full run history |
171
+
172
+ ---
173
+
174
+ <p align="center">
175
+ <img src="https://raw.githubusercontent.com/EOCoreINT/pygeofetch/main/docs/images/trend_map.png" width="48%" />
176
+ <img src="https://raw.githubusercontent.com/EOCoreINT/pygeofetch/main/docs/images/trend_classification.png" width="48%" />
177
+ </p>
178
+ <p align="center"><em>NDVI trend (2018–2024) and severity classification for the Obuasi Municipal District, Ghana — computed end-to-end with pygeofetch from boundary-clipped USGS Landsat data.</em></p>
179
+
180
+ Across 2018–2024, 32.0% of the district shows measurable vegetation decline (9.2% strong, 22.8% moderate), against 57.5% stable and 10.5% increasing. The decline is spatially concentrated west of −1.70° longitude, consistent with the district's documented small-scale mining activity — though an NDVI trend alone can't isolate cause from correlated signals like logging or agricultural clearing without ground verification. The eastern two-thirds of the district is overwhelmingly stable, which is itself informative: it suggests a localized driver rather than a district-wide seasonal artifact.
181
+
182
+ ---
183
+
184
+ ## Why pygeofetch
185
+
186
+ Satellite data access is fragmented — every provider has its own auth scheme, query API, and file format, and most tools that unify search stop well short of processing. pygeofetch is the only package that combines broad provider coverage with a full processing engine and a genuinely verified InSAR chain in one place.
187
+
188
+ | Feature | pygeofetch | EODAG | pystac-client | satpy | sentinelsat |
189
+ |---|---|---|---|---|---|
190
+ | Providers | **24** | 10+ | STAC only | Limited | Sentinel only |
191
+ | Processing engine | ✅ Full | ❌ | ❌ | Partial | ❌ |
192
+ | Spectral indices | ✅ 17+ | ❌ | ❌ | ❌ | ❌ |
193
+ | Full InSAR chain | ✅ Verified | ❌ | ❌ | ❌ | ❌ |
194
+ | Real footprint geometry | ✅ | ❌ | ✅ (STAC only) | ❌ | ❌ |
195
+ | YAML pipelines + scheduling | ✅ | ❌ | ❌ | ❌ | ❌ |
196
+ | Commercial providers | ✅ Planet/Maxar | ❌ | ❌ | ❌ | ❌ |
197
+
198
+ ---
199
+
200
+ ## Providers
201
+
202
+ **11 open-access providers**, no login required — including `planetary_computer`, `aws_earth`, `element84`, `noaa_big_data`, `esa_scihub`, `jaxa_earth`, and `geoserver_generic` for any OGC WMS/WFS/WCS endpoint.
203
+
204
+ **13 authenticated providers** — USGS, Copernicus CDSE, NASA Earthdata (+ Cloud), Alaska SAR Facility, OpenTopography, Planet Labs, Sentinel Hub, Maxar GBDX, Airbus OneAtlas, Google Earth Engine, TerraBotics, and Earth Explorer.
205
+
206
+ Every provider has been directly verified to return at minimum a correct bounding box; several are further confirmed to return real, precise footprint geometry against a live API response (marked in `pygeofetch providers info PROVIDER`). Run `pygeofetch providers list` for the full, current table.
207
+
208
+ ---
209
+
210
+ ## Installation
211
+
212
+ ```bash
213
+ pip install pygeofetch # core — free providers work immediately
214
+ pip install "pygeofetch[geo]" # + rasterio, geopandas, shapely
215
+ pip install "pygeofetch[insar]" # + native SBAS inversion, phase unwrapping
216
+ pip install "pygeofetch[insar-full]" # + MintPy passthrough for advanced corrections
217
+ pip install "pygeofetch[all]" # everything
218
+ ```
219
+
220
+ Requires Python 3.9+. Run `pygeofetch doctor` to verify your install and provider connectivity.
221
+
222
+ ---
223
+
224
+ ## ⚡ Quick Start
225
+
226
+ ```python
227
+ from pygeofetch import PyGeoFetch
228
+ from pygeofetch.models.search_query import SearchQuery, BoundingBox
229
+ from pygeofetch.models.download_task import DownloadOptions
230
+
231
+ client = PyGeoFetch()
232
+ client.add_credentials("copernicus", username="you@example.com", password="...")
233
+
234
+ results = client.search(
235
+ SearchQuery(bbox=BoundingBox.from_string("-74.1,40.6,-73.7,40.9"),
236
+ start_date="2024-01-01", cloud_cover_max=20),
237
+ providers=["copernicus", "planetary_computer", "aws_earth"],
238
+ )
239
+
240
+ downloads = client.download(results[:5], destination="./data/",
241
+ options=DownloadOptions(parallel=4, bands=["B02", "B03", "B04"]))
242
+
243
+ ndvi = client.indices.ndvi(red="B04.tif", nir="B08.tif")
244
+ ```
245
+
246
+ The equivalent is available as a CLI (`pygeofetch search run ...` / `pygeofetch download run ...`) and as chainable, schedulable YAML pipelines — see the [full CLI reference](#cli-reference) and [notebooks](#-notebooks).
247
+
248
+ ---
249
+
250
+ ## 🌐 Case Study: Mapping Mexico City Land Subsidence with InSAR
251
+
252
+ **Full project, notebook, and data:** [github.com/EOCoreINT/mexico-subsidence-project](https://github.com/EOCoreINT/mexico-subsidence-project)
253
+
254
+ Mexico City sits on a drained lakebed and is subsiding at some of the fastest rates on Earth as its aquifer is depleted. It's a demanding, real-world test for an InSAR chain: a huge, largely incoherent urban scene, a fragmented acquisition history, and a deformation signal large enough to make phase unwrapping genuinely hard. What follows is a condensed walkthrough of the [full project above](https://github.com/EOCoreINT/mexico-subsidence-project) — the pygeofetch InSAR chain run end to end against real Sentinel-1 data over Iztapalapa, no synthetic shortcuts. For the complete methodology, every intermediate number, and an unusually candid validation discussion, read the project README itself.
255
+
256
+ **1. Authenticated federated search.** `client.search()` against Copernicus Data Space for SLC scenes over the city (bbox `-99.183, 19.278, -99.003, 19.438`, July 2016 – September 2017) returns a stack of Sentinel-1A/1B candidates in seconds, filterable straight down to a single consistent track.
257
+
258
+ <p align="center"><img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/data-search.png" width="85%" /></p>
259
+
260
+ Results carry real footprint geometry and drop straight onto a map via `MapViewer`, with hover info for scene ID, date, satellite, and provider — useful for spotting swath overlap before committing to a download.
261
+
262
+ <p align="center">
263
+ <img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/search_1.png" width="48%" />
264
+ <img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/search.png" width="48%" />
265
+ </p>
266
+
267
+ **2. DEM acquisition.** A matching search against OpenTopography returns seven DEM products for the AOI; pygeofetch downloads and clips the selected one (SRTM 30 m) automatically for topographic phase removal.
268
+
269
+ <p align="center"><img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/dem_acquisition.png" width="85%" /></p>
270
+
271
+ **3. Preflight validation.** Before anything downloads, the `PreflightGate` checks search truncation, AOI coverage, temporal network connectivity, and burst-timing family compatibility from lightweight annotation XMLs — catching acquisitions that would waste compute before they cost bandwidth. This run avoided roughly 360 GB of downloads by excluding 48 of 115 candidate scenes at this stage alone.
272
+
273
+ <p align="center"><img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/preflight-log.png" width="85%" /></p>
274
+
275
+ Real orbit state vectors then pre-filter the candidate pair list against Sentinel-1's own mission thresholds, rejecting pairs for excess burst-sync error, temporal baseline, or spatial baseline before any interferogram is attempted.
276
+
277
+ <p align="center"><img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/pre-filter-for-interferogram.png" width="85%" /></p>
278
+
279
+ **4. Interferogram formation.** Of 2,211 theoretically possible pairs across 67 downloaded scenes, real orbit-based coregistration, per-burst Enhanced Spectral Diversity, deburst, and flat-earth/topographic phase removal reduce that to 78 valid pairs — the dense urban fringe pattern below is raw wrapped phase, before any correction.
280
+
281
+ <p align="center"><img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/wrapped_phase.png" width="85%" /></p>
282
+
283
+ **5. Coherence.** Amplitude and coherence are estimated together for every pair; the urban core holds noticeably higher coherence (0.614) than the scene-wide average (0.508) — exactly the contrast expected between stable built structures and vegetated or agricultural surrounds.
284
+
285
+ <p align="center"><img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/comparism.png" width="85%" /></p>
286
+
287
+ **6. Phase unwrapping.** SNAPHU (Chen & Zebker, 2001) resolves each wrapped interferogram into continuous phase, both as a raw array and reprojected onto the real city footprint. Reliable coverage is intentionally sparse (~0.1–0.2%) — dense vegetation cover means most of the scene decorrelates between 18–24 day passes, so the pipeline marks those pixels NaN rather than interpolating across them.
288
+
289
+ <p align="center">
290
+ <img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/unwrapped_phase.png" width="48%" />
291
+ <img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/unwrap.png" width="48%" />
292
+ </p>
293
+
294
+ **7. SBAS time-series inversion.** The full 58-date descending stack, once low-coherence and unreliable-reference-pixel pairs are excluded, fractures into 17 disconnected network "islands" — a genuine finding about this AOI's data quality, not a bug. The largest connected island (10 dates, 11 pairs) carries the final inversion, referenced near Cerro de la Estrella.
295
+
296
+ <p align="center"><img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/1.png" width="85%" /></p>
297
+
298
+ The resulting velocity field, uncertainty map, reliability mask, and displacement time series recover a 2nd–98th-percentile vertical velocity of **−35.5 to −2.9 cm/year** where reliable pixels exist.
299
+
300
+ <p align="center"><img src="https://raw.githubusercontent.com/EOCoreINT/mexico-subsidence-project/main/analysis/island1_sbas_full_analysis.png" width="90%" /></p>
301
+
302
+ That result is **directionally consistent** — same sign, same order of magnitude — with the peer-reviewed peak of −39.1 cm/year reported for Iztapalapa by Cigna & Tapete (2021, *Remote Sensing of Environment*), a study built from 300+ scenes across six years. It is explicitly *not* a validated replication of that study: this run used a fraction of the data volume, and the project's own README is deliberately careful not to overclaim the comparison — worth reading in full if you want the honest version of what this number does and doesn't prove.
303
+
304
+ The full, runnable notebook — real search and download throughout, no synthetic substitutions — is [`mexico_city_full_confirmed (2).ipynb`](<https://github.com/EOCoreINT/mexico-subsidence-project/blob/main/mexico_city_full_confirmed%20(2).ipynb>) in the [mexico-subsidence-project](https://github.com/EOCoreINT/mexico-subsidence-project) repo; see also `piton_fournaise_full.ipynb` and `amatrice_full.ipynb` in [`notebooks/`](notebooks/) for the same chain applied to the 2021 Piton de la Fournaise eruption and the 2016 Amatrice earthquake.
305
+
306
+ ---
307
+
308
+ ## Processing Engine
309
+
310
+ **Preprocessing** (`client.preprocess`): `atmos` (DOS1/DOS2, Sen2Cor, FLAASH, 6S, iCOR) · `cloud_mask` · `cloud_fill` · `topo_correct` · `clip` · `reproject` · `resample` · `pansharpen` · `tile` · `mosaic` · `composite`
311
+
312
+ **Spectral indices** (`client.indices`): `ndvi` · `evi` · `savi` · `ndwi` · `mndwi` · `ndbi` · `ndsi` · `ndmi` · `nbr` / `dnbr` · `tct` · `pca` · `texture` (GLCM) · `lst` · `albedo` · `band_math`
313
+
314
+ **Post-processing** (`client.post`): `vectorize` → `smooth` → `regularize` → `zonal_stats` → `buffer` → `centroids` → `compress` → `cog`
315
+
316
+ **SAR** (`client.sar`): `despeckle` (Lee, Enhanced Lee, Frost, Gamma MAP) · `calibrate` (σ0/γ0/β0) · `flood_map` · `coherence`
317
+
318
+ **InSAR** (`pygeofetch.insar`): `SLCExtractor` · `InterferogramGenerator` · `AtmosphericCorrector` (elevation-correlated or real ERA5) · `IonosphericCorrector` (real IONEX/CDDIS) · `PhaseUnwrapper` (SNAPHU) · `SBASTimeSeries` · `DataValidator` · `InSARProject` (high-level, search-to-interferogram wrapper)
319
+
320
+ Full method signatures and options are in the [documentation](https://appiahkubis14.github.io/pygeofetch-docs/) and [`pygeofetch/insar/README.md`](pygeofetch/insar/README.md).
321
+
322
+ ---
323
+
324
+ ## YAML Pipelines
325
+
326
+ ```yaml
327
+ name: weekly-sentinel2-ndvi
328
+ schedule: "0 6 * * 1"
329
+ steps:
330
+ - search: {providers: [copernicus, aws_earth], date_range: last_7_days, cloud_cover: "0-10"}
331
+ - filter: {expression: "data.cloud_cover < 5"}
332
+ - download: {parallel: 4, output: ./raw/, bands: [B04, B08]}
333
+ - ndvi: {red: B04.tif, nir: B08.tif}
334
+ - vectorize: {threshold: 0.3, format: geojson}
335
+ - cog: {compress: deflate}
336
+ ```
337
+
338
+ ```bash
339
+ pygeofetch proc-pipeline run weekly-sentinel2.yaml --input scene.tif
340
+ pygeofetch pipeline schedule weekly-sentinel2.yaml --name ndvi-weekly
341
+ ```
342
+
343
+ Six built-in templates ship out of the box: `ndvi` · `change_detection` · `flood_map` · `urban_mapping` · `sar_analysis` · `land_cover`.
344
+
345
+ ---
346
+
347
+ ## CLI Reference
348
+
349
+ Every capability above is also exposed as a CLI command, grouped by area:
350
+
351
+ | Group | Example | Purpose |
352
+ |---|---|---|
353
+ | `auth` | `pygeofetch auth add copernicus --username U --password P` | Manage per-provider credentials |
354
+ | `providers` | `pygeofetch providers list --capabilities sar` | Discover and inspect providers |
355
+ | `search` | `pygeofetch search run --bbox "..." --providers aws_earth,copernicus` | Federated search, 7 output formats |
356
+ | `download` | `pygeofetch download run --from-search results.geojson --parallel 4` | Parallel, resumable downloads |
357
+ | `preprocess` | `pygeofetch preprocess clip scene.tif --bbox "..."` | Atmospheric correction, clipping, reprojection, etc. |
358
+ | `index` | `pygeofetch index ndvi --red B04.tif --nir B08.tif` | Spectral index computation |
359
+ | `post` | `pygeofetch post cog scene.tif --compress deflate` | Vectorization, zonal stats, COG conversion |
360
+ | `sar` | `pygeofetch sar coherence slc1.tif slc2.tif` | Despeckling, calibration, coherence, flood mapping |
361
+ | `proc-pipeline` / `pipeline` | `pygeofetch pipeline schedule weekly.yaml` | YAML pipeline execution and scheduling |
362
+ | `cache` / `config` | `pygeofetch cache prune --max-size 1GB` | Cache and configuration management |
363
+
364
+ Run `pygeofetch --help` or any subcommand with `--help` for the complete, current option list, or see the [CLI reference docs](https://appiahkubis14.github.io/pygeofetch-docs/).
365
+
366
+ ---
367
+
368
+ <!-- ## 📚 Notebooks
369
+
370
+ | Notebook | Topics |
371
+ |---|---|
372
+ | `01_getting_started.ipynb` | Install, doctor, first search, first download |
373
+ | `02_authentication_and_providers.ipynb` | All 24 providers, credentials, capability filters |
374
+ | `03_advanced_search.ipynb` | Federated search, CQL2 filters, output formats, caching |
375
+ | `04_download_and_postprocessing.ipynb` | Band selection, parallel downloads, post-processing |
376
+ | `05_pipelines_and_scheduling.ipynb` | YAML pipelines, scheduling, Python builder API |
377
+ | `06_real_world_workflows.ipynb` | NDVI time series, change detection, multi-sensor fusion |
378
+ | `07_copernicus_and_authenticated_providers.ipynb` | Copernicus, USGS, NASA, Planet, ASF, OpenTopography |
379
+ | `08_cli_complete_reference.ipynb` | Every CLI command with runnable examples |
380
+ | `09_processing_complete.ipynb` | Full processing engine: preprocessing, indices, SAR, pipelines |
381
+ | [`mexico_city_full_confirmed (2).ipynb`](<https://github.com/EOCoreINT/mexico-subsidence-project/blob/main/mexico_city_full_confirmed%20(2).ipynb>) ↗ | The [Mexico City case study](#-case-study-mapping-mexico-city-land-subsidence-with-insar) above, in a separate companion repo — real search/download, full InSAR chain, SBAS inversion |
382
+ | `piton_fournaise_full.ipynb` | Verified InSAR pipeline against the real April 2021 Piton de la Fournaise eruption |
383
+ | `amatrice_full.ipynb` | Verified InSAR pipeline against the real 2016 Amatrice, Italy earthquake |
384
+ | `provider_search_footprint_test.ipynb` | Search and footprint-map validation across all 24 providers |
385
+
386
+ ```bash
387
+ cd notebooks/ && jupyter lab
388
+ ``` -->
389
+
390
+ ---
391
+
392
+ ## Documentation
393
+
394
+ Full documentation: **https://appiahkubis14.github.io/pygeofetch-docs/** — CLI reference, provider auth guides, pipeline configuration, post-processing catalogue, and InSAR verification methodology.
395
+
396
+ ## Contributing
397
+
398
+ Contributions are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md). Good first issues include extending real footprint geometry to remaining bbox-only providers, wiring stub providers to full API integrations, and adding new post-processing actions.
399
+
400
+ ```bash
401
+ git clone git@github.com:EOCoreINT/pygeofetch.git && cd pygeofetch
402
+ pip install -e ".[dev,all]" && pytest tests/unit/ -v
403
+ ```
404
+
405
+ ## License
406
+
407
+ MIT — see [LICENSE](LICENSE). © 2026 Samuel Appiah Kubi. Part of the **PyGeoVision** platform, alongside [pygeofetch](https://github.com/appiahkubis14/pygeofetch) itself.