PyGeoFetch 1.1.0__tar.gz → 1.3.0__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.
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/CHANGELOG.md +2 -2
- {pygeofetch-1.1.0/pygeofetch.egg-info → pygeofetch-1.3.0}/PKG-INFO +90 -51
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/README.md +23 -34
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/__init__.py +32 -2
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/auth_commands.py +11 -5
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/config_commands.py +3 -1
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/download_commands.py +171 -56
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/index_commands.py +92 -32
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/main.py +210 -71
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/pipeline_process_commands.py +63 -33
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/postprocess_commands.py +80 -27
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/preprocess_commands.py +116 -33
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/sar_commands.py +43 -11
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/search_commands.py +180 -45
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/config/__init__.py +7 -1
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/config/settings.py +22 -23
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/core/authenticator.py +80 -46
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/core/cache_manager.py +19 -13
- pygeofetch-1.3.0/pygeofetch/core/downloader.py +1282 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/core/engine.py +90 -68
- pygeofetch-1.3.0/pygeofetch/core/logging.py +685 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/core/orbits.py +81 -26
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/core/scheduler.py +60 -42
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/core/searcher.py +82 -52
- pygeofetch-1.3.0/pygeofetch/insar/__init__.py +66 -0
- pygeofetch-1.3.0/pygeofetch/insar/atmosphere.py +283 -0
- pygeofetch-1.3.0/pygeofetch/insar/extraction.py +298 -0
- pygeofetch-1.3.0/pygeofetch/insar/interferogram.py +457 -0
- pygeofetch-1.3.0/pygeofetch/insar/timeseries.py +437 -0
- pygeofetch-1.3.0/pygeofetch/insar/unwrap.py +258 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/meta.yaml +1 -1
- pygeofetch-1.3.0/pygeofetch/models/download_task.py +176 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/models/satellite_data.py +160 -95
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/models/search_query.py +76 -53
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/models/user_auth.py +23 -20
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/processing/__init__.py +9 -4
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/processing/base.py +67 -44
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/processing/batch.py +27 -18
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/processing/indices.py +259 -186
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/processing/pipeline.py +156 -106
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/processing/postprocessor.py +146 -76
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/processing/preprocessor.py +263 -114
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/processing/sar.py +126 -93
- pygeofetch-1.3.0/pygeofetch/processor/__init__.py +33 -0
- pygeofetch-1.3.0/pygeofetch/processor/indices.py +296 -0
- pygeofetch-1.3.0/pygeofetch/processor/landsat.py +443 -0
- pygeofetch-1.3.0/pygeofetch/processor/loader.py +196 -0
- pygeofetch-1.3.0/pygeofetch/processor/stacker.py +265 -0
- pygeofetch-1.3.0/pygeofetch/processor/timeseries.py +400 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/__init__.py +74 -58
- pygeofetch-1.3.0/pygeofetch/providers/airbus_oneatlas.py +257 -0
- pygeofetch-1.3.0/pygeofetch/providers/alaska_satellite_facility.py +243 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/aws_earth.py +58 -19
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/base.py +38 -29
- pygeofetch-1.3.0/pygeofetch/providers/copernicus.py +920 -0
- pygeofetch-1.3.0/pygeofetch/providers/digitalglobe.py +241 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/earth_explorer_additional.py +133 -46
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/element84.py +60 -25
- pygeofetch-1.3.0/pygeofetch/providers/eodag_provider.py +288 -0
- pygeofetch-1.3.0/pygeofetch/providers/esa_scihub.py +259 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/geoserver_generic.py +132 -43
- pygeofetch-1.3.0/pygeofetch/providers/google_earth_engine.py +257 -0
- pygeofetch-1.3.0/pygeofetch/providers/inpe_cbers.py +241 -0
- pygeofetch-1.3.0/pygeofetch/providers/isro_bhuvan.py +241 -0
- pygeofetch-1.3.0/pygeofetch/providers/jaxa_earth.py +243 -0
- pygeofetch-1.3.0/pygeofetch/providers/maxar_gbdx.py +253 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/nasa_earthdata.py +128 -33
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/nasa_earthdata_cloud.py +126 -48
- pygeofetch-1.3.0/pygeofetch/providers/noaa_big_data.py +243 -0
- pygeofetch-1.3.0/pygeofetch/providers/opentopography.py +194 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/planet.py +151 -73
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/planetary_computer.py +86 -33
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/sentinel_hub.py +133 -44
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/providers/terrabotics.py +102 -44
- pygeofetch-1.3.0/pygeofetch/providers/usgs.py +910 -0
- pygeofetch-1.3.0/pygeofetch/sar/__init__.py +18 -0
- pygeofetch-1.3.0/pygeofetch/sar/_native.py +45 -0
- pygeofetch-1.3.0/pygeofetch/sar/_ost.py +100 -0
- pygeofetch-1.3.0/pygeofetch/sar/_sarxarray.py +86 -0
- pygeofetch-1.3.0/pygeofetch/sar/processor.py +145 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/utils/__init__.py +5 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/utils/file_utils.py +26 -13
- pygeofetch-1.3.0/pygeofetch/utils/gcp_recovery.py +341 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/utils/geo_utils.py +35 -23
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/utils/logging_setup.py +6 -6
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/utils/retry_handler.py +14 -12
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/utils/validators.py +32 -21
- pygeofetch-1.3.0/pygeofetch/viz/__init__.py +21 -0
- pygeofetch-1.3.0/pygeofetch/viz/map.py +142 -0
- pygeofetch-1.3.0/pygeofetch/viz/plot.py +657 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0/pygeofetch.egg-info}/PKG-INFO +90 -51
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch.egg-info/SOURCES.txt +26 -1
- pygeofetch-1.3.0/pygeofetch.egg-info/requires.txt +102 -0
- pygeofetch-1.3.0/pyproject.toml +180 -0
- pygeofetch-1.3.0/tests/test_extraction.py +210 -0
- pygeofetch-1.3.0/tests/test_insar.py +465 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/tests/test_pgv_integration_contract.py +281 -70
- pygeofetch-1.3.0/tests/test_viz_plot.py +321 -0
- pygeofetch-1.1.0/pygeofetch/core/downloader.py +0 -732
- pygeofetch-1.1.0/pygeofetch/core/logging.py +0 -495
- pygeofetch-1.1.0/pygeofetch/models/download_task.py +0 -283
- pygeofetch-1.1.0/pygeofetch/providers/airbus_oneatlas.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/alaska_satellite_facility.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/copernicus.py +0 -758
- pygeofetch-1.1.0/pygeofetch/providers/digitalglobe.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/esa_scihub.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/google_earth_engine.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/inpe_cbers.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/isro_bhuvan.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/jaxa_earth.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/maxar_gbdx.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/noaa_big_data.py +0 -154
- pygeofetch-1.1.0/pygeofetch/providers/opentopography.py +0 -112
- pygeofetch-1.1.0/pygeofetch/providers/usgs.py +0 -481
- pygeofetch-1.1.0/pygeofetch.egg-info/requires.txt +0 -44
- pygeofetch-1.1.0/pyproject.toml +0 -101
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/LICENSE +0 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/MANIFEST.in +0 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/cli/__init__.py +0 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/config/defaults.yaml +0 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/core/__init__.py +2 -2
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch/models/__init__.py +0 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch.egg-info/dependency_links.txt +0 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch.egg-info/entry_points.txt +0 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch.egg-info/not-zip-safe +0 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/pygeofetch.egg-info/top_level.txt +0 -0
- {pygeofetch-1.1.0 → pygeofetch-1.3.0}/setup.cfg +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/1.
|
|
4
|
+
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.3.0/).
|
|
5
5
|
|
|
6
|
-
## [1.
|
|
6
|
+
## [1.3.0] — 2026-07-12
|
|
7
7
|
|
|
8
8
|
### Added
|
|
9
9
|
- Federated search across 22+ satellite data providers
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pygeofetch
|
|
3
|
-
Version: 1.
|
|
4
|
-
Summary: Universal satellite data pipeline
|
|
5
|
-
Author:
|
|
3
|
+
Version: 1.3.0
|
|
4
|
+
Summary: Universal satellite data pipeline + geospatial processing platform
|
|
5
|
+
Author-email: pygeofetch Contributors <pygeofetch@example.com>
|
|
6
6
|
License: MIT License
|
|
7
7
|
|
|
8
8
|
Copyright (c) 2024 SatelliteBridge Contributors
|
|
@@ -25,11 +25,11 @@ License: MIT License
|
|
|
25
25
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
26
|
SOFTWARE.
|
|
27
27
|
|
|
28
|
-
Project-URL: Homepage, https://github.com/
|
|
28
|
+
Project-URL: Homepage, https://github.com/pygeofetch/pygeofetch
|
|
29
29
|
Project-URL: Documentation, https://pygeofetch.readthedocs.io
|
|
30
|
-
Project-URL: Repository, https://github.com/
|
|
31
|
-
Project-URL: Bug Tracker, https://github.com/
|
|
32
|
-
Keywords: satellite,remote-sensing,GIS,earth-observation,geospatial
|
|
30
|
+
Project-URL: Repository, https://github.com/pygeofetch/pygeofetch
|
|
31
|
+
Project-URL: Bug Tracker, https://github.com/pygeofetch/pygeofetch/issues
|
|
32
|
+
Keywords: satellite,remote-sensing,GIS,earth-observation,geospatial,SAR,Sentinel,Landsat
|
|
33
33
|
Classifier: Development Status :: 5 - Production/Stable
|
|
34
34
|
Classifier: Intended Audience :: Science/Research
|
|
35
35
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -46,41 +46,91 @@ Requires-Dist: httpx>=0.27
|
|
|
46
46
|
Requires-Dist: click>=8.1
|
|
47
47
|
Requires-Dist: pydantic>=2.5
|
|
48
48
|
Requires-Dist: pydantic-settings>=2.1
|
|
49
|
-
Requires-Dist: rich>=13.7
|
|
50
49
|
Requires-Dist: PyYAML>=6.0
|
|
51
50
|
Requires-Dist: cryptography>=42.0
|
|
52
51
|
Requires-Dist: keyring>=24.3
|
|
53
|
-
Requires-Dist: aiofiles>=23.2
|
|
54
52
|
Requires-Dist: tenacity>=8.2
|
|
55
53
|
Requires-Dist: python-dateutil>=2.9
|
|
56
|
-
Requires-Dist: tqdm>=4.66
|
|
57
54
|
Requires-Dist: requests>=2.31
|
|
58
55
|
Requires-Dist: anyio>=4.2
|
|
59
|
-
Requires-Dist:
|
|
60
|
-
Requires-Dist:
|
|
56
|
+
Requires-Dist: numpy>=1.26
|
|
57
|
+
Requires-Dist: tqdm>=4.66
|
|
61
58
|
Provides-Extra: geo
|
|
62
59
|
Requires-Dist: rasterio>=1.3; extra == "geo"
|
|
63
60
|
Requires-Dist: geopandas>=0.14; extra == "geo"
|
|
64
61
|
Requires-Dist: pyarrow>=15.0; extra == "geo"
|
|
65
62
|
Requires-Dist: shapely>=2.0; extra == "geo"
|
|
66
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: sar
|
|
76
|
+
Requires-Dist: sarxarray>=0.1; extra == "sar"
|
|
77
|
+
Requires-Dist: scipy>=1.12; extra == "sar"
|
|
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.0; 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.3.0; extra == "viz"
|
|
95
|
+
Requires-Dist: whiteboxgui>=2.3.0; extra == "viz"
|
|
96
|
+
Requires-Dist: geemap>=0.28.0; extra == "viz"
|
|
97
|
+
Requires-Dist: osmnx>=1.7.0; extra == "viz"
|
|
98
|
+
Requires-Dist: contextily>=1.5.0; extra == "viz"
|
|
99
|
+
Requires-Dist: xyzservices>=2023.10.0; extra == "viz"
|
|
100
|
+
Requires-Dist: mapclassify>=2.5.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: keplergl>=0.3.0; extra == "viz"
|
|
106
|
+
Requires-Dist: streamlit>=1.28.0; extra == "viz"
|
|
67
107
|
Provides-Extra: cloud
|
|
68
108
|
Requires-Dist: boto3>=1.34; extra == "cloud"
|
|
69
109
|
Requires-Dist: pystac>=1.9; extra == "cloud"
|
|
110
|
+
Requires-Dist: planetary-computer>=1.0; extra == "cloud"
|
|
111
|
+
Provides-Extra: notebook
|
|
112
|
+
Requires-Dist: ipython>=8.0; extra == "notebook"
|
|
113
|
+
Requires-Dist: ipywidgets>=8.0; extra == "notebook"
|
|
114
|
+
Requires-Dist: jupyter>=1.0; extra == "notebook"
|
|
70
115
|
Provides-Extra: schedule
|
|
71
116
|
Requires-Dist: croniter>=2.0; extra == "schedule"
|
|
72
117
|
Provides-Extra: dev
|
|
73
118
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
74
119
|
Requires-Dist: pytest-cov>=4.1; extra == "dev"
|
|
75
120
|
Requires-Dist: pytest-mock>=3.12; extra == "dev"
|
|
76
|
-
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
77
|
-
Requires-Dist: vcrpy>=6.0; extra == "dev"
|
|
78
|
-
Requires-Dist: black>=24.0; extra == "dev"
|
|
79
121
|
Requires-Dist: ruff>=0.3; extra == "dev"
|
|
80
122
|
Requires-Dist: mypy>=1.8; extra == "dev"
|
|
81
|
-
Requires-Dist:
|
|
123
|
+
Requires-Dist: build>=1.0; extra == "dev"
|
|
124
|
+
Requires-Dist: twine>=5.0; extra == "dev"
|
|
125
|
+
Provides-Extra: insar-full
|
|
126
|
+
Requires-Dist: snaphu>=0.1; extra == "insar-full"
|
|
127
|
+
Requires-Dist: scipy>=1.12; extra == "insar-full"
|
|
128
|
+
Requires-Dist: mintpy>=1.5; extra == "insar-full"
|
|
129
|
+
Requires-Dist: pyaps3>=0.3; extra == "insar-full"
|
|
130
|
+
Provides-Extra: full
|
|
131
|
+
Requires-Dist: pygeofetch[cloud,geo,notebook,processor,providers,sar,schedule,viz]; extra == "full"
|
|
82
132
|
Provides-Extra: all
|
|
83
|
-
Requires-Dist: pygeofetch[
|
|
133
|
+
Requires-Dist: pygeofetch[full]; extra == "all"
|
|
84
134
|
Dynamic: license-file
|
|
85
135
|
|
|
86
136
|
<div align="center">
|
|
@@ -136,7 +186,7 @@ Existing tools address parts of this problem: EODAG supports several providers b
|
|
|
136
186
|
|
|
137
187
|
---
|
|
138
188
|
|
|
139
|
-
|
|
189
|
+
## 🚀 Key Features
|
|
140
190
|
|
|
141
191
|
### 🛰️ 22+ Satellite Providers
|
|
142
192
|
|
|
@@ -301,11 +351,11 @@ pygeofetch download run \
|
|
|
301
351
|
|
|
302
352
|
```python
|
|
303
353
|
from pathlib import Path
|
|
304
|
-
from pygeofetch import
|
|
354
|
+
from pygeofetch import pygeofetch
|
|
305
355
|
from pygeofetch.models.search_query import SearchQuery, BoundingBox
|
|
306
356
|
from pygeofetch.models.download_task import DownloadOptions
|
|
307
357
|
|
|
308
|
-
client =
|
|
358
|
+
client = pygeofetch()
|
|
309
359
|
|
|
310
360
|
# Credentials
|
|
311
361
|
client.add_credentials("usgs", username="user", password="pass")
|
|
@@ -534,36 +584,6 @@ COMPLETION
|
|
|
534
584
|
pygeofetch --install-completion bash|zsh|fish
|
|
535
585
|
```
|
|
536
586
|
|
|
537
|
-
---
|
|
538
|
-
|
|
539
|
-
## 🗂️ Project Structure
|
|
540
|
-
|
|
541
|
-
```
|
|
542
|
-
pygeofetch/
|
|
543
|
-
├── pygeofetch/
|
|
544
|
-
│ ├── core/ engine, authenticator, searcher, downloader, scheduler, cache
|
|
545
|
-
│ ├── cli/ 11 CLI command modules
|
|
546
|
-
│ ├── processing/ ← geospatial processing engine
|
|
547
|
-
│ │ ├── preprocessor.py atmospheric, cloud, geometric, resampling, compositing
|
|
548
|
-
│ │ ├── indices.py 17 spectral indices + transformations
|
|
549
|
-
│ │ ├── postprocessor.py vectorize, smooth, zonal stats, COG, compress
|
|
550
|
-
│ │ ├── sar.py despeckle, calibrate, flood map, coherence
|
|
551
|
-
│ │ ├── pipeline.py chainable builder + YAML loader + 6 templates
|
|
552
|
-
│ │ └── batch.py parallel batch processing
|
|
553
|
-
│ ├── models/ Pydantic models (search, download, auth, satellite)
|
|
554
|
-
│ ├── providers/ 22 provider implementations
|
|
555
|
-
│ ├── utils/ logging, retry, geo, file, validators
|
|
556
|
-
│ └── config/ settings, defaults.yaml
|
|
557
|
-
├── notebooks/ 9 Jupyter notebooks (01–09)
|
|
558
|
-
├── tests/ 60 unit + integration tests
|
|
559
|
-
├── docs/assets/
|
|
560
|
-
├── pyproject.toml
|
|
561
|
-
├── Dockerfile · Makefile · .gitignore
|
|
562
|
-
└── .github/workflows/tests.yml
|
|
563
|
-
```
|
|
564
|
-
|
|
565
|
-
---
|
|
566
|
-
|
|
567
587
|
## 📚 Notebooks
|
|
568
588
|
|
|
569
589
|
| Notebook | Topics |
|
|
@@ -585,6 +605,25 @@ jupyter lab
|
|
|
585
605
|
|
|
586
606
|
---
|
|
587
607
|
|
|
608
|
+
<p align="center">
|
|
609
|
+
<img src="https://raw.githubusercontent.com/EOCoreINT/pygeofetch/refs/heads/main/docs/images/trend_map.png?token=GHSAT0AAAAAAD4555HVK7XABUW65FV6B3N22S7TNMA" width="48%" />
|
|
610
|
+
<img src="https://raw.githubusercontent.com/EOCoreINT/pygeofetch/refs/heads/main/docs/images/trend_classification.png?token=GHSAT0AAAAAAD4555HVX7RLHLSCQSBSGCIY2S7TMFQ" width="48%" />
|
|
611
|
+
</p>
|
|
612
|
+
<p align="center"><em>NDVI trend (2018–2024) and severity classification for the Obuasi Municipal District, computed end-to-end with PyGeoFetch — real USGS Landsat data, boundary-clipped before processing.</em></p>
|
|
613
|
+
|
|
614
|
+
32.0% of the Obuasi Municipal District shows measurable vegetation decline over 2018–2024 (9.2% strong decline + 22.8% moderate decline), against 57.5% stable and 10.5% showing an increasing trend.
|
|
615
|
+
|
|
616
|
+
That headline number matters less than where it's concentrated. The decline isn't scattered randomly across the district — it forms a clear, spatially coherent cluster in the western portion of the AOI (roughly west of -1.70° longitude), visible as a dense, contiguous red-and-orange zone in both the trend map and the classification map. Real land degradation signals tend to look like this — clustered along mining concessions, roads, or river corridors — whereas sensor noise or processing artifacts tend to scatter more randomly across the whole scene. The fact that this pattern holds together spatially is a reasonable indicator that it reflects something real on the ground, not just pixel-level noise.
|
|
617
|
+
|
|
618
|
+
That said, an NDVI trend map on its own can't distinguish why vegetation declined — illegal small-scale mining (galamsey), selective logging, agricultural land clearing, and urban expansion can all produce a similar signature. Given Obuasi's well-documented galamsey activity specifically concentrated in this district, the spatial pattern here is consistent with mining-driven clearance — but confirming that specific cause would need either higher-resolution imagery, ground verification, or cross-referencing against known concession boundaries, not this analysis alone.
|
|
619
|
+
|
|
620
|
+
Two things worth flagging honestly rather than glossing over:
|
|
621
|
+
|
|
622
|
+
The scattered dark-blue linear and blob features running through the map (most visibly the river-like feature crossing the upper-central area) are very likely water bodies, not vegetation gain. NDVI trend over open water isn't a meaningful signal — surface reflectance there is driven by turbidity and water level, not plant health — so those features should be excluded from the "increasing" interpretation, not read as reforestation.
|
|
623
|
+
The small white gaps scattered through the trend map (several distinct circular patches) are nodata — pixels that didn't have enough valid, cloud-free observations across all six dates to fit a reliable trend. Worth being upfront that the 32%/57.5%/10.5% breakdown is computed over the valid pixels only, not the full district area including these gaps.
|
|
624
|
+
|
|
625
|
+
The eastern two-thirds of the district, by contrast, is overwhelmingly stable (dominant green in the classification map), which is itself a useful negative result — it suggests the decline is genuinely localized to a specific area rather than reflecting a district-wide drought or seasonal artifact that would show up everywhere.
|
|
626
|
+
|
|
588
627
|
## 📋 Documentation
|
|
589
628
|
|
|
590
629
|
Full documentation: **https://appiahkubis14.github.io/pygeofetch-docs/**
|
|
@@ -612,4 +651,4 @@ pytest tests/unit/ -v
|
|
|
612
651
|
|
|
613
652
|
pygeofetch is free and open source software, licensed under the [MIT License](LICENSE).
|
|
614
653
|
|
|
615
|
-
©
|
|
654
|
+
© 2026 pygeofetch Contributors. Part of the **PyGeoVision** platform — [pygeofetch](https://github.com/appiahkubis14/pygeofetch) (data + processing) + [GeoAI](https://opengeoai.org) (AI) = complete Earth observation pipeline.
|
|
@@ -51,7 +51,7 @@ Existing tools address parts of this problem: EODAG supports several providers b
|
|
|
51
51
|
|
|
52
52
|
---
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
## 🚀 Key Features
|
|
55
55
|
|
|
56
56
|
### 🛰️ 22+ Satellite Providers
|
|
57
57
|
|
|
@@ -216,11 +216,11 @@ pygeofetch download run \
|
|
|
216
216
|
|
|
217
217
|
```python
|
|
218
218
|
from pathlib import Path
|
|
219
|
-
from pygeofetch import
|
|
219
|
+
from pygeofetch import pygeofetch
|
|
220
220
|
from pygeofetch.models.search_query import SearchQuery, BoundingBox
|
|
221
221
|
from pygeofetch.models.download_task import DownloadOptions
|
|
222
222
|
|
|
223
|
-
client =
|
|
223
|
+
client = pygeofetch()
|
|
224
224
|
|
|
225
225
|
# Credentials
|
|
226
226
|
client.add_credentials("usgs", username="user", password="pass")
|
|
@@ -449,36 +449,6 @@ COMPLETION
|
|
|
449
449
|
pygeofetch --install-completion bash|zsh|fish
|
|
450
450
|
```
|
|
451
451
|
|
|
452
|
-
---
|
|
453
|
-
|
|
454
|
-
## 🗂️ Project Structure
|
|
455
|
-
|
|
456
|
-
```
|
|
457
|
-
pygeofetch/
|
|
458
|
-
├── pygeofetch/
|
|
459
|
-
│ ├── core/ engine, authenticator, searcher, downloader, scheduler, cache
|
|
460
|
-
│ ├── cli/ 11 CLI command modules
|
|
461
|
-
│ ├── processing/ ← geospatial processing engine
|
|
462
|
-
│ │ ├── preprocessor.py atmospheric, cloud, geometric, resampling, compositing
|
|
463
|
-
│ │ ├── indices.py 17 spectral indices + transformations
|
|
464
|
-
│ │ ├── postprocessor.py vectorize, smooth, zonal stats, COG, compress
|
|
465
|
-
│ │ ├── sar.py despeckle, calibrate, flood map, coherence
|
|
466
|
-
│ │ ├── pipeline.py chainable builder + YAML loader + 6 templates
|
|
467
|
-
│ │ └── batch.py parallel batch processing
|
|
468
|
-
│ ├── models/ Pydantic models (search, download, auth, satellite)
|
|
469
|
-
│ ├── providers/ 22 provider implementations
|
|
470
|
-
│ ├── utils/ logging, retry, geo, file, validators
|
|
471
|
-
│ └── config/ settings, defaults.yaml
|
|
472
|
-
├── notebooks/ 9 Jupyter notebooks (01–09)
|
|
473
|
-
├── tests/ 60 unit + integration tests
|
|
474
|
-
├── docs/assets/
|
|
475
|
-
├── pyproject.toml
|
|
476
|
-
├── Dockerfile · Makefile · .gitignore
|
|
477
|
-
└── .github/workflows/tests.yml
|
|
478
|
-
```
|
|
479
|
-
|
|
480
|
-
---
|
|
481
|
-
|
|
482
452
|
## 📚 Notebooks
|
|
483
453
|
|
|
484
454
|
| Notebook | Topics |
|
|
@@ -500,6 +470,25 @@ jupyter lab
|
|
|
500
470
|
|
|
501
471
|
---
|
|
502
472
|
|
|
473
|
+
<p align="center">
|
|
474
|
+
<img src="https://raw.githubusercontent.com/EOCoreINT/pygeofetch/refs/heads/main/docs/images/trend_map.png?token=GHSAT0AAAAAAD4555HVK7XABUW65FV6B3N22S7TNMA" width="48%" />
|
|
475
|
+
<img src="https://raw.githubusercontent.com/EOCoreINT/pygeofetch/refs/heads/main/docs/images/trend_classification.png?token=GHSAT0AAAAAAD4555HVX7RLHLSCQSBSGCIY2S7TMFQ" width="48%" />
|
|
476
|
+
</p>
|
|
477
|
+
<p align="center"><em>NDVI trend (2018–2024) and severity classification for the Obuasi Municipal District, computed end-to-end with PyGeoFetch — real USGS Landsat data, boundary-clipped before processing.</em></p>
|
|
478
|
+
|
|
479
|
+
32.0% of the Obuasi Municipal District shows measurable vegetation decline over 2018–2024 (9.2% strong decline + 22.8% moderate decline), against 57.5% stable and 10.5% showing an increasing trend.
|
|
480
|
+
|
|
481
|
+
That headline number matters less than where it's concentrated. The decline isn't scattered randomly across the district — it forms a clear, spatially coherent cluster in the western portion of the AOI (roughly west of -1.70° longitude), visible as a dense, contiguous red-and-orange zone in both the trend map and the classification map. Real land degradation signals tend to look like this — clustered along mining concessions, roads, or river corridors — whereas sensor noise or processing artifacts tend to scatter more randomly across the whole scene. The fact that this pattern holds together spatially is a reasonable indicator that it reflects something real on the ground, not just pixel-level noise.
|
|
482
|
+
|
|
483
|
+
That said, an NDVI trend map on its own can't distinguish why vegetation declined — illegal small-scale mining (galamsey), selective logging, agricultural land clearing, and urban expansion can all produce a similar signature. Given Obuasi's well-documented galamsey activity specifically concentrated in this district, the spatial pattern here is consistent with mining-driven clearance — but confirming that specific cause would need either higher-resolution imagery, ground verification, or cross-referencing against known concession boundaries, not this analysis alone.
|
|
484
|
+
|
|
485
|
+
Two things worth flagging honestly rather than glossing over:
|
|
486
|
+
|
|
487
|
+
The scattered dark-blue linear and blob features running through the map (most visibly the river-like feature crossing the upper-central area) are very likely water bodies, not vegetation gain. NDVI trend over open water isn't a meaningful signal — surface reflectance there is driven by turbidity and water level, not plant health — so those features should be excluded from the "increasing" interpretation, not read as reforestation.
|
|
488
|
+
The small white gaps scattered through the trend map (several distinct circular patches) are nodata — pixels that didn't have enough valid, cloud-free observations across all six dates to fit a reliable trend. Worth being upfront that the 32%/57.5%/10.5% breakdown is computed over the valid pixels only, not the full district area including these gaps.
|
|
489
|
+
|
|
490
|
+
The eastern two-thirds of the district, by contrast, is overwhelmingly stable (dominant green in the classification map), which is itself a useful negative result — it suggests the decline is genuinely localized to a specific area rather than reflecting a district-wide drought or seasonal artifact that would show up everywhere.
|
|
491
|
+
|
|
503
492
|
## 📋 Documentation
|
|
504
493
|
|
|
505
494
|
Full documentation: **https://appiahkubis14.github.io/pygeofetch-docs/**
|
|
@@ -527,4 +516,4 @@ pytest tests/unit/ -v
|
|
|
527
516
|
|
|
528
517
|
pygeofetch is free and open source software, licensed under the [MIT License](LICENSE).
|
|
529
518
|
|
|
530
|
-
©
|
|
519
|
+
© 2026 pygeofetch Contributors. Part of the **PyGeoVision** platform — [pygeofetch](https://github.com/appiahkubis14/pygeofetch) (data + processing) + [GeoAI](https://opengeoai.org) (AI) = complete Earth observation pipeline.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
PyGeoFetch v1.
|
|
2
|
+
PyGeoFetch v1.0.0 — Universal Satellite Data Pipeline.
|
|
3
3
|
|
|
4
4
|
Unified access to 22+ satellite data providers with a consistent
|
|
5
5
|
Python API and CLI. Supports authentication management, federated search,
|
|
@@ -30,10 +30,40 @@ CLI::
|
|
|
30
30
|
pygeofetch doctor
|
|
31
31
|
"""
|
|
32
32
|
|
|
33
|
-
__version__ = "1.
|
|
33
|
+
__version__ = "1.3.0"
|
|
34
34
|
__author__ = "PyGeoFetch Contributors"
|
|
35
35
|
__license__ = "MIT"
|
|
36
36
|
|
|
37
37
|
from pygeofetch.core.engine import PyGeoFetch # noqa: F401
|
|
38
38
|
|
|
39
39
|
__all__ = ["PyGeoFetch", "__version__"]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# Optional modules — lazy imported to avoid hard dependency errors
|
|
43
|
+
def _lazy(module_path: str, name: str):
|
|
44
|
+
"""Return a lazy accessor that imports on first use."""
|
|
45
|
+
|
|
46
|
+
def _get():
|
|
47
|
+
import importlib
|
|
48
|
+
|
|
49
|
+
mod = importlib.import_module(module_path)
|
|
50
|
+
return getattr(mod, name)
|
|
51
|
+
|
|
52
|
+
return _get
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# Convenience accessors (fail gracefully if optional deps not installed)
|
|
56
|
+
try:
|
|
57
|
+
from pygeofetch.processor import BandStacker, DataLoader, SpectralIndex
|
|
58
|
+
except ImportError:
|
|
59
|
+
DataLoader = SpectralIndex = BandStacker = None # type: ignore[assignment,misc]
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
from pygeofetch.sar import SARProcessor as AdvancedSARProcessor
|
|
63
|
+
except ImportError:
|
|
64
|
+
AdvancedSARProcessor = None # type: ignore[assignment,misc]
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
from pygeofetch.viz import MapViewer, Plotter
|
|
68
|
+
except ImportError:
|
|
69
|
+
MapViewer = Plotter = None # type: ignore[assignment,misc]
|
|
@@ -36,7 +36,9 @@ def auth() -> None:
|
|
|
36
36
|
@click.argument("provider")
|
|
37
37
|
@click.option("--username", "-u", default=None, help="Username or email.")
|
|
38
38
|
@click.option("--password", "-p", default=None, help="Password (prompted if omitted).")
|
|
39
|
-
@click.option(
|
|
39
|
+
@click.option(
|
|
40
|
+
"--api-key", "-k", default=None, help="API key (alternative to username/password)."
|
|
41
|
+
)
|
|
40
42
|
@click.option("--client-id", default=None, help="OAuth2 client ID.")
|
|
41
43
|
@click.option("--client-secret", default=None, help="OAuth2 client secret.")
|
|
42
44
|
@click.option("--token", default=None, help="Bearer token.")
|
|
@@ -121,9 +123,9 @@ def auth_login(provider: str) -> None:
|
|
|
121
123
|
# Determine what to prompt based on auth type
|
|
122
124
|
auth_type = caps.auth_type if hasattr(caps, "auth_type") else "username_password"
|
|
123
125
|
|
|
124
|
-
if auth_type
|
|
126
|
+
if auth_type == "api_key":
|
|
125
127
|
creds["api_key"] = click.prompt("API Key", hide_input=True)
|
|
126
|
-
elif auth_type
|
|
128
|
+
elif auth_type == "oauth2_client":
|
|
127
129
|
creds["client_id"] = click.prompt("Client ID")
|
|
128
130
|
creds["client_secret"] = click.prompt("Client Secret", hide_input=True)
|
|
129
131
|
else:
|
|
@@ -139,7 +141,9 @@ def auth_login(provider: str) -> None:
|
|
|
139
141
|
if click.confirm("Verify credentials now?", default=True):
|
|
140
142
|
try:
|
|
141
143
|
session = mgr.authenticate(provider)
|
|
142
|
-
console.print(
|
|
144
|
+
console.print(
|
|
145
|
+
f"[green]Authentication successful![/] Session expires: {session.expires_at}"
|
|
146
|
+
)
|
|
143
147
|
except Exception as exc:
|
|
144
148
|
console.print(f"[red]Authentication failed: {exc}[/]")
|
|
145
149
|
|
|
@@ -222,7 +226,9 @@ def auth_remove(provider: str, yes: bool) -> None:
|
|
|
222
226
|
|
|
223
227
|
|
|
224
228
|
@auth.command(name="export")
|
|
225
|
-
@click.option(
|
|
229
|
+
@click.option(
|
|
230
|
+
"--provider", default=None, help="Export only this provider (default: all)."
|
|
231
|
+
)
|
|
226
232
|
@click.option(
|
|
227
233
|
"--output",
|
|
228
234
|
"-o",
|
|
@@ -30,6 +30,7 @@ def config() -> None:
|
|
|
30
30
|
def config_show(as_json: bool) -> None:
|
|
31
31
|
"""Show the effective configuration (all layers merged)."""
|
|
32
32
|
import json
|
|
33
|
+
|
|
33
34
|
from pygeofetch.config.settings import get_settings
|
|
34
35
|
|
|
35
36
|
settings = get_settings()
|
|
@@ -40,6 +41,7 @@ def config_show(as_json: bool) -> None:
|
|
|
40
41
|
return
|
|
41
42
|
|
|
42
43
|
import yaml
|
|
44
|
+
|
|
43
45
|
rendered = yaml.dump(data, default_flow_style=False, sort_keys=True)
|
|
44
46
|
console.print(Syntax(rendered, "yaml", theme="monokai"))
|
|
45
47
|
|
|
@@ -85,7 +87,7 @@ def config_set(key: str, value: str) -> None:
|
|
|
85
87
|
pygeofetch config set download.parallel 4
|
|
86
88
|
pygeofetch config set cache.ttl_seconds 7200
|
|
87
89
|
"""
|
|
88
|
-
from pygeofetch.config.settings import
|
|
90
|
+
from pygeofetch.config.settings import save_user_config
|
|
89
91
|
|
|
90
92
|
# Try to coerce to typed value
|
|
91
93
|
typed_value: object = value
|