PyGeoFetch 1.0.9__tar.gz → 1.2.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.0.9 → pygeofetch-1.2.0}/CHANGELOG.md +2 -2
- {pygeofetch-1.0.9/pygeofetch.egg-info → pygeofetch-1.2.0}/PKG-INFO +69 -49
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/README.md +2 -32
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/__init__.py +32 -2
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/auth_commands.py +11 -5
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/config_commands.py +3 -1
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/download_commands.py +171 -56
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/index_commands.py +92 -32
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/main.py +210 -71
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/pipeline_process_commands.py +63 -33
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/postprocess_commands.py +80 -27
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/preprocess_commands.py +116 -33
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/sar_commands.py +43 -11
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/search_commands.py +150 -44
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/config/__init__.py +7 -1
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/config/settings.py +22 -23
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/authenticator.py +81 -47
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/cache_manager.py +19 -13
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/downloader.py +315 -109
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/engine.py +90 -68
- pygeofetch-1.2.0/pygeofetch/core/logging.py +685 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/orbits.py +81 -26
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/scheduler.py +60 -42
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/searcher.py +82 -52
- pygeofetch-1.2.0/pygeofetch/insar/__init__.py +66 -0
- pygeofetch-1.2.0/pygeofetch/insar/atmosphere.py +283 -0
- pygeofetch-1.2.0/pygeofetch/insar/extraction.py +298 -0
- pygeofetch-1.2.0/pygeofetch/insar/interferogram.py +457 -0
- pygeofetch-1.2.0/pygeofetch/insar/timeseries.py +437 -0
- pygeofetch-1.2.0/pygeofetch/insar/unwrap.py +258 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/meta.yaml +1 -1
- pygeofetch-1.2.0/pygeofetch/models/download_task.py +176 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/models/satellite_data.py +158 -93
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/models/search_query.py +76 -53
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/models/user_auth.py +23 -20
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/__init__.py +9 -4
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/base.py +67 -44
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/batch.py +27 -18
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/indices.py +259 -186
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/pipeline.py +156 -106
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/postprocessor.py +146 -76
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/preprocessor.py +228 -113
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/sar.py +126 -93
- pygeofetch-1.2.0/pygeofetch/processor/__init__.py +30 -0
- pygeofetch-1.2.0/pygeofetch/processor/indices.py +296 -0
- pygeofetch-1.2.0/pygeofetch/processor/landsat.py +384 -0
- pygeofetch-1.2.0/pygeofetch/processor/loader.py +196 -0
- pygeofetch-1.2.0/pygeofetch/processor/stacker.py +265 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/__init__.py +74 -58
- pygeofetch-1.2.0/pygeofetch/providers/airbus_oneatlas.py +241 -0
- pygeofetch-1.2.0/pygeofetch/providers/alaska_satellite_facility.py +243 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/aws_earth.py +31 -20
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/base.py +38 -29
- pygeofetch-1.2.0/pygeofetch/providers/copernicus.py +920 -0
- pygeofetch-1.2.0/pygeofetch/providers/digitalglobe.py +241 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/earth_explorer_additional.py +133 -46
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/element84.py +60 -25
- pygeofetch-1.2.0/pygeofetch/providers/eodag_provider.py +288 -0
- pygeofetch-1.2.0/pygeofetch/providers/esa_scihub.py +243 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/geoserver_generic.py +132 -43
- pygeofetch-1.2.0/pygeofetch/providers/google_earth_engine.py +241 -0
- pygeofetch-1.2.0/pygeofetch/providers/inpe_cbers.py +241 -0
- pygeofetch-1.2.0/pygeofetch/providers/isro_bhuvan.py +241 -0
- pygeofetch-1.2.0/pygeofetch/providers/jaxa_earth.py +243 -0
- pygeofetch-1.2.0/pygeofetch/providers/maxar_gbdx.py +253 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/nasa_earthdata.py +128 -33
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/nasa_earthdata_cloud.py +126 -48
- pygeofetch-1.2.0/pygeofetch/providers/noaa_big_data.py +243 -0
- pygeofetch-1.2.0/pygeofetch/providers/opentopography.py +194 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/planet.py +151 -73
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/planetary_computer.py +86 -33
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/sentinel_hub.py +133 -44
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/terrabotics.py +102 -44
- pygeofetch-1.2.0/pygeofetch/providers/usgs.py +764 -0
- pygeofetch-1.2.0/pygeofetch/sar/__init__.py +18 -0
- pygeofetch-1.2.0/pygeofetch/sar/_native.py +45 -0
- pygeofetch-1.2.0/pygeofetch/sar/_ost.py +100 -0
- pygeofetch-1.2.0/pygeofetch/sar/_sarxarray.py +86 -0
- pygeofetch-1.2.0/pygeofetch/sar/processor.py +145 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/__init__.py +5 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/file_utils.py +26 -13
- pygeofetch-1.2.0/pygeofetch/utils/gcp_recovery.py +341 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/geo_utils.py +35 -23
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/logging_setup.py +6 -6
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/retry_handler.py +14 -12
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/validators.py +32 -21
- pygeofetch-1.2.0/pygeofetch/viz/__init__.py +21 -0
- pygeofetch-1.2.0/pygeofetch/viz/map.py +142 -0
- pygeofetch-1.2.0/pygeofetch/viz/plot.py +239 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0/pygeofetch.egg-info}/PKG-INFO +69 -49
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/SOURCES.txt +23 -0
- pygeofetch-1.2.0/pygeofetch.egg-info/requires.txt +102 -0
- pygeofetch-1.2.0/pyproject.toml +180 -0
- pygeofetch-1.2.0/tests/test_extraction.py +210 -0
- pygeofetch-1.2.0/tests/test_insar.py +465 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/tests/test_pgv_integration_contract.py +282 -71
- pygeofetch-1.0.9/pygeofetch/core/logging.py +0 -495
- pygeofetch-1.0.9/pygeofetch/models/download_task.py +0 -283
- pygeofetch-1.0.9/pygeofetch/providers/airbus_oneatlas.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/alaska_satellite_facility.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/copernicus.py +0 -758
- pygeofetch-1.0.9/pygeofetch/providers/digitalglobe.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/esa_scihub.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/google_earth_engine.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/inpe_cbers.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/isro_bhuvan.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/jaxa_earth.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/maxar_gbdx.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/noaa_big_data.py +0 -154
- pygeofetch-1.0.9/pygeofetch/providers/opentopography.py +0 -112
- pygeofetch-1.0.9/pygeofetch/providers/usgs.py +0 -481
- pygeofetch-1.0.9/pygeofetch.egg-info/requires.txt +0 -44
- pygeofetch-1.0.9/pyproject.toml +0 -101
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/LICENSE +0 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/MANIFEST.in +0 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/__init__.py +0 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/config/defaults.yaml +0 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/__init__.py +2 -2
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/models/__init__.py +0 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/dependency_links.txt +0 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/entry_points.txt +0 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/not-zip-safe +0 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/top_level.txt +0 -0
- {pygeofetch-1.0.9 → pygeofetch-1.2.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.0.
|
|
4
|
+
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
5
5
|
|
|
6
|
-
## [1.0.
|
|
6
|
+
## [1.0.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.0
|
|
4
|
-
Summary: Universal satellite data pipeline
|
|
5
|
-
Author:
|
|
3
|
+
Version: 1.2.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
|
|
|
@@ -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 |
|
|
@@ -612,4 +632,4 @@ pytest tests/unit/ -v
|
|
|
612
632
|
|
|
613
633
|
pygeofetch is free and open source software, licensed under the [MIT License](LICENSE).
|
|
614
634
|
|
|
615
|
-
©
|
|
635
|
+
© 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
|
|
|
@@ -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 |
|
|
@@ -527,4 +497,4 @@ pytest tests/unit/ -v
|
|
|
527
497
|
|
|
528
498
|
pygeofetch is free and open source software, licensed under the [MIT License](LICENSE).
|
|
529
499
|
|
|
530
|
-
©
|
|
500
|
+
© 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.0.
|
|
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.0.
|
|
33
|
+
__version__ = "1.0.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
|