PyGeoFetch 0.1.4__tar.gz → 0.1.6__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 (66) hide show
  1. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/LICENSE +21 -21
  2. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/PKG-INFO +302 -302
  3. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/README.md +218 -218
  4. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/__init__.py +39 -39
  5. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/cli/__init__.py +1 -1
  6. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/cli/auth_commands.py +257 -257
  7. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/cli/config_commands.py +143 -143
  8. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/cli/download_commands.py +271 -271
  9. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/cli/main.py +770 -770
  10. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/cli/search_commands.py +249 -249
  11. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/config/__init__.py +11 -11
  12. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/config/defaults.yaml +86 -86
  13. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/config/settings.py +235 -235
  14. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/core/__init__.py +18 -18
  15. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/core/authenticator.py +430 -431
  16. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/core/cache_manager.py +288 -288
  17. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/core/downloader.py +353 -353
  18. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/core/engine.py +312 -312
  19. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/core/scheduler.py +473 -473
  20. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/core/searcher.py +340 -340
  21. pygeofetch-0.1.6/pygeofetch/models/__init__.py +39 -0
  22. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/models/download_task.py +281 -281
  23. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/models/satellite_data.py +394 -394
  24. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/models/search_query.py +328 -328
  25. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/models/user_auth.py +123 -123
  26. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/__init__.py +192 -192
  27. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/airbus_oneatlas.py +150 -150
  28. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/alaska_satellite_facility.py +150 -150
  29. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/aws_earth.py +267 -267
  30. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/base.py +306 -306
  31. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/copernicus.py +487 -487
  32. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/digitalglobe.py +150 -150
  33. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/earth_explorer_additional.py +150 -150
  34. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/element84.py +229 -229
  35. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/esa_scihub.py +150 -150
  36. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/geoserver_generic.py +150 -150
  37. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/google_earth_engine.py +150 -150
  38. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/inpe_cbers.py +150 -150
  39. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/isro_bhuvan.py +150 -150
  40. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/jaxa_earth.py +150 -150
  41. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/maxar_gbdx.py +150 -150
  42. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/nasa_earthdata.py +190 -190
  43. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/nasa_earthdata_cloud.py +345 -345
  44. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/noaa_big_data.py +150 -150
  45. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/opentopography.py +108 -108
  46. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/planet.py +369 -369
  47. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/planetary_computer.py +272 -272
  48. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/sentinel_hub.py +173 -173
  49. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/terrabotics.py +278 -278
  50. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/providers/usgs.py +469 -469
  51. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/utils/__init__.py +50 -50
  52. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/utils/file_utils.py +275 -275
  53. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/utils/geo_utils.py +240 -240
  54. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/utils/logging_setup.py +107 -107
  55. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/utils/retry_handler.py +225 -225
  56. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch/utils/validators.py +155 -155
  57. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch.egg-info/PKG-INFO +302 -302
  58. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch.egg-info/not-zip-safe +1 -1
  59. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pyproject.toml +105 -105
  60. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/setup.cfg +18 -18
  61. pygeofetch-0.1.4/pygeofetch/models/__init__.py +0 -44
  62. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch.egg-info/SOURCES.txt +0 -0
  63. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch.egg-info/dependency_links.txt +0 -0
  64. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch.egg-info/entry_points.txt +0 -0
  65. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch.egg-info/requires.txt +0 -0
  66. {pygeofetch-0.1.4 → pygeofetch-0.1.6}/pygeofetch.egg-info/top_level.txt +0 -0
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 pygeofetch Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2024 pygeofetch Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,302 +1,302 @@
1
- Metadata-Version: 2.4
2
- Name: pygeofetch
3
- Version: 0.1.4
4
- Summary: Universal satellite data download pipeline with unified access to 20+ repositories
5
- Author: pygeofetch Contributors
6
- License: MIT License
7
-
8
- Copyright (c) 2024 pygeofetch Contributors
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://github.com/pygeofetch/pygeofetch
29
- Project-URL: Documentation, https://pygeofetch.readthedocs.io
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
33
- Classifier: Development Status :: 4 - Beta
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: httpx[http2]>=0.27
47
- Requires-Dist: click>=8.1
48
- Requires-Dist: pydantic>=2.5
49
- Requires-Dist: pydantic-settings>=2.1
50
- Requires-Dist: rich>=13.7
51
- Requires-Dist: shapely>=2.0
52
- Requires-Dist: pyproj>=3.6
53
- Requires-Dist: pystac>=1.9
54
- Requires-Dist: cryptography>=42.0
55
- Requires-Dist: keyring>=24.3
56
- Requires-Dist: aiofiles>=23.2
57
- Requires-Dist: tenacity>=8.2
58
- Requires-Dist: PyYAML>=6.0
59
- Requires-Dist: python-dateutil>=2.9
60
- Requires-Dist: tqdm>=4.66
61
- Requires-Dist: anyio>=4.2
62
- Requires-Dist: boto3>=1.34
63
- Requires-Dist: requests>=2.31
64
- Requires-Dist: click-completion>=0.5
65
- Provides-Extra: geo
66
- Requires-Dist: rasterio>=1.3; extra == "geo"
67
- Requires-Dist: geopandas>=0.14; extra == "geo"
68
- Requires-Dist: pyarrow>=15.0; extra == "geo"
69
- Provides-Extra: dev
70
- Requires-Dist: pytest>=8.0; extra == "dev"
71
- Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
72
- Requires-Dist: pytest-cov>=4.1; extra == "dev"
73
- Requires-Dist: pytest-mock>=3.12; extra == "dev"
74
- Requires-Dist: vcrpy>=6.0; extra == "dev"
75
- Requires-Dist: httpx[mock]>=0.27; extra == "dev"
76
- Requires-Dist: black>=24.0; extra == "dev"
77
- Requires-Dist: ruff>=0.3; extra == "dev"
78
- Requires-Dist: mypy>=1.8; extra == "dev"
79
- Requires-Dist: bump2version>=1.0; extra == "dev"
80
- Provides-Extra: all
81
- Requires-Dist: pygeofetch[dev,geo]; extra == "all"
82
- Dynamic: license-file
83
-
84
- <div align="center">
85
-
86
- <img src="https://appiahkubis14.github.io/portfolio/logo/samuel_logo_dark.svg" alt="PyGeoFetch Logo" width="200"/>
87
-
88
- # PyGeoFetch
89
-
90
- [![PyPI version](https://badge.fury.io/py/pygeofetch.svg)](https://pypi.org/project/pygeofetch/)
91
- [![Python Versions](https://img.shields.io/pypi/pyversions/pygeofetch.svg)](https://pypi.org/project/pygeofetch/)
92
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
93
- [![Tests](https://github.com/appiahkubis14/pygeofetch/actions/workflows/tests.yml/badge.svg)](https://github.com/appiahkubis14/pygeofetch/actions)
94
- [![Coverage](https://codecov.io/gh/appiahkubis14/pygeofetch/branch/main/graph/badge.svg)](https://codecov.io/gh/appiahkubis14/pygeofetch)
95
-
96
- **Universal satellite data pipeline — unified access to 22+ satellite repositories with one CLI or Python API.**
97
-
98
- </div>
99
-
100
- ---
101
-
102
- ## 📖 Introduction
103
-
104
- PyGeoFetch is a **production-ready satellite data acquisition framework** that provides unified, authenticated access to 22+ Earth observation repositories — including Sentinel, Landsat, Planet, Maxar, Airbus, Copernicus, USGS, NASA, JAXA, and more — through a single consistent CLI and Python API.
105
-
106
- The package abstracts away the authentication complexity, API fragmentation, and format inconsistencies of individual satellite providers, giving researchers and engineers a single command or function call to search, filter, download, and post-process satellite imagery at scale.
107
-
108
- PyGeoFetch provides five core capabilities:
109
-
110
- 1. Authenticated access to 22+ providers, with secure credential storage via system keyring (macOS Keychain, Windows Credential Manager, Linux Secret Service).
111
- 2. Unified search across all providers, returning standardized GeoJSON, STAC, GeoParquet, or CSV results sortable by cloud cover, date, score, or satellite.
112
- 3. Resilient parallel downloads with checksum verification, resume support, exponential backoff, and atomic writes.
113
- 4. A chainable post-processing system for reprojection, compression, NDVI/NDWI computation, resampling, and Cloud Optimized GeoTIFF conversion.
114
- 5. YAML pipeline orchestration with cron scheduling, webhook notifications, and full pipeline history — enabling repeatable, automated geospatial data workflows.
115
-
116
- ---
117
-
118
- ## 📝 Statement of Need
119
-
120
- Accessing satellite data at scale is surprisingly fragmented. Each provider — USGS, Copernicus, Planet, Maxar, NASA — exposes a different authentication scheme, a different query API, a different download protocol, and a different file format. Researchers and engineers working across multiple providers must maintain a patchwork of custom scripts, scattered credentials, and ad hoc download logic, making workflows difficult to reproduce and brittle to maintain.
121
-
122
- Existing tools address parts of this problem: EODAG supports several providers but lacks pipeline orchestration and commercial coverage; `pystac-client` handles STAC-compliant endpoints only; `sentinelsat` is Sentinel-specific. No single tool covers the full breadth of providers needed for operational geospatial workflows.
123
-
124
- PyGeoFetch addresses this gap by providing:
125
-
126
- - A **single CLI** that works identically across all 22 providers.
127
- - A **unified Python API** with standardized result and download models, removing provider-specific boilerplate.
128
- - A **pipeline layer** for scheduling recurring data acquisitions without external orchestration tools.
129
- - **Production-grade resilience** — circuit breakers, retries, resume, checksum verification, and atomic writes — that make satellite downloads reliable enough for automated pipelines.
130
-
131
- ---
132
-
133
- ## 🚀 Key Features
134
-
135
- ### 🛰️ 22+ Satellite Providers
136
- - Open-access providers with no login required: Microsoft Planetary Computer, AWS Earth, Element 84, NOAA Big Data, ESA SciHub mirrors, JAXA, ISRO Bhuvan, INPE CBERS, DigitalGlobe Open Data
137
- - Credentialled providers: USGS, Copernicus CDSE, NASA Earthdata, Planet Labs, Sentinel Hub, Maxar GBDX, Airbus OneAtlas, Alaska Satellite Facility, Google Earth Engine, OpenTopography, TerraBotics
138
- - Supports SAR, sub-metre, STAC, optical, DEM, and LiDAR collections across providers
139
-
140
- ### 🔍 Unified Search
141
- - Single query across multiple providers simultaneously with merged, deduplicated results
142
- - Filter by bounding box, geometry file, date range, cloud cover, resolution, processing level, and CQL2 expressions
143
- - Output to table, JSON, GeoJSON, STAC ItemCollection, GeoParquet, CSV, or scene IDs
144
-
145
- ### 📥 Resilient Downloads
146
- - Adaptive parallel downloads with configurable concurrency
147
- - SHA256 checksum verification, resume support, and exponential-backoff retries
148
- - Atomic writes — no partial files ever written to disk
149
- - Bandwidth throttling and webhook notifications on completion or failure
150
-
151
- ### ⚙️ Post-Processing Chains
152
- Chain operations applied immediately after download:
153
-
154
- `unzip` → `reproject:EPSG:4326` → `compress:lzw` → `ndvi` → `resample:10` → `cog`
155
-
156
- Full list: unzip, reproject, compress, NDVI, NDWI, composite, atmospheric correction, clip, resample, Cloud Optimized GeoTIFF, merge, pan-sharpen.
157
-
158
- ### 📋 YAML Pipeline Orchestration
159
- - Define search → filter → download → export workflows in YAML
160
- - Schedule with cron expressions, list history, retry failed runs
161
- - Docker-ready for containerized pipeline deployments
162
-
163
- ### 🔐 Security by Default
164
- - Credentials stored in system keyring — never logged or written to disk in plaintext
165
- - TLS 1.2+ enforced, SSL verification always on, no telemetry, no analytics
166
-
167
- ---
168
-
169
- ## 📦 Installation
170
-
171
- ```bash
172
- # Core
173
- pip install pygeofetch
174
-
175
- # + Raster/vector processing (rasterio, geopandas, rioxarray)
176
- pip install "pygeofetch[geo]"
177
-
178
- # + Everything
179
- pip install "pygeofetch[all]"
180
- ```
181
-
182
- **Requirements:** Python 3.9+
183
-
184
- ---
185
-
186
- ## ⚡ Quick Start
187
-
188
- ### CLI
189
-
190
- ```bash
191
- # Add credentials
192
- pygeofetch auth add usgs --username USER --password PASS
193
- pygeofetch auth add planet --api-key YOUR_KEY
194
-
195
- # Search
196
- pygeofetch search run \
197
- --bbox "-74.1,40.6,-73.7,40.9" \
198
- --start-date 2024-01-01 \
199
- --cloud-cover 0-15 \
200
- --providers planetary_computer \
201
- --output results.geojson
202
-
203
- # Download with post-processing
204
- pygeofetch download run \
205
- --from-search results.geojson \
206
- --output ./data/ \
207
- --parallel 4 \
208
- --verify-checksum \
209
- --post-process "unzip,reproject:EPSG:4326,compress:lzw,cog"
210
- ```
211
-
212
- ### Python API
213
-
214
- ```python
215
- from pathlib import Path
216
- from pygeofetch import pygeofetch
217
- from pygeofetch.models import SearchQuery, DownloadOptions
218
-
219
- sb = pygeofetch()
220
- sb.add_credentials("usgs", username="user", password="pass")
221
- sb.add_credentials("planet", api_key="PL_KEY")
222
-
223
- results = sb.search(
224
- SearchQuery(
225
- bbox=(-74.1, 40.6, -73.7, 40.9),
226
- start_date="2024-01-01",
227
- end_date="2024-06-01",
228
- cloud_cover_max=20,
229
- ),
230
- providers=["usgs", "copernicus", "planetary_computer", "aws_earth"],
231
- )
232
-
233
- downloads = sb.download(
234
- results[:5],
235
- destination=Path("./data/"),
236
- options=DownloadOptions(parallel=4, verify_checksum=True, resume=True),
237
- )
238
-
239
- for dr in downloads:
240
- print(f"✓ {dr.data_id} ({dr.bytes_downloaded // 1024 // 1024:.1f} MB)" if dr.success else f"✗ {dr.data_id}: {dr.error}")
241
- ```
242
-
243
- ### YAML Pipeline
244
-
245
- ```yaml
246
- name: weekly-sentinel2-ndvi
247
- schedule: "0 6 * * 1"
248
- steps:
249
- - search:
250
- providers: [copernicus, aws_earth, planetary_computer]
251
- date_range: last_7_days
252
- cloud_cover: 0-10
253
- bbox: "-74.1,40.6,-73.7,40.9"
254
- - filter:
255
- expression: "data.cloud_cover < 5"
256
- - download:
257
- parallel: 4
258
- output: ./raw/
259
- verify_checksum: true
260
- post_process: "unzip,reproject:EPSG:4326,cog"
261
- - export:
262
- format: cloud_optimized_geotiff
263
- destination: s3://my-bucket/ndvi/
264
- ```
265
-
266
- ```bash
267
- pygeofetch pipeline run weekly-sentinel2.yaml
268
- pygeofetch pipeline schedule weekly-sentinel2.yaml
269
- ```
270
-
271
- ---
272
-
273
- ## 📋 Documentation
274
-
275
- Comprehensive documentation is available at **https://appiahkubis14.github.io/pygeofetch-docs/**, including:
276
-
277
- - Full CLI reference
278
- - Provider authentication guides
279
- - Pipeline configuration reference
280
- - Post-processing action catalogue
281
- - Contributing guide
282
-
283
- ---
284
-
285
- ## 🤝 Contributing
286
-
287
- Contributions of all kinds are welcome. See [CONTRIBUTING.md](https://github.com/appiahkubis14/pygeofetch?tab=contributing-ov-file) for full guidelines.
288
-
289
- Good first issues include implementing stub providers to full API integrations, improving test coverage, and adding new post-processing actions.
290
-
291
- <!-- ```bash
292
- git clone https://github.com/appiahkubis14/pygeofetch
293
- cd pygeofetch
294
- pip install -e ".[dev,all]"
295
- pytest tests/ -v
296
- ``` -->
297
-
298
- ---
299
-
300
- ## 📄 License
301
-
302
- PyGeoFetch is free and open source software, licensed under the [MIT License](LICENSE).
1
+ Metadata-Version: 2.4
2
+ Name: pygeofetch
3
+ Version: 0.1.6
4
+ Summary: Universal satellite data download pipeline with unified access to 20+ repositories
5
+ Author: pygeofetch Contributors
6
+ License: MIT License
7
+
8
+ Copyright (c) 2024 pygeofetch Contributors
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://github.com/pygeofetch/pygeofetch
29
+ Project-URL: Documentation, https://pygeofetch.readthedocs.io
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
33
+ Classifier: Development Status :: 4 - Beta
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: httpx[http2]>=0.27
47
+ Requires-Dist: click>=8.1
48
+ Requires-Dist: pydantic>=2.5
49
+ Requires-Dist: pydantic-settings>=2.1
50
+ Requires-Dist: rich>=13.7
51
+ Requires-Dist: shapely>=2.0
52
+ Requires-Dist: pyproj>=3.6
53
+ Requires-Dist: pystac>=1.9
54
+ Requires-Dist: cryptography>=42.0
55
+ Requires-Dist: keyring>=24.3
56
+ Requires-Dist: aiofiles>=23.2
57
+ Requires-Dist: tenacity>=8.2
58
+ Requires-Dist: PyYAML>=6.0
59
+ Requires-Dist: python-dateutil>=2.9
60
+ Requires-Dist: tqdm>=4.66
61
+ Requires-Dist: anyio>=4.2
62
+ Requires-Dist: boto3>=1.34
63
+ Requires-Dist: requests>=2.31
64
+ Requires-Dist: click-completion>=0.5
65
+ Provides-Extra: geo
66
+ Requires-Dist: rasterio>=1.3; extra == "geo"
67
+ Requires-Dist: geopandas>=0.14; extra == "geo"
68
+ Requires-Dist: pyarrow>=15.0; extra == "geo"
69
+ Provides-Extra: dev
70
+ Requires-Dist: pytest>=8.0; extra == "dev"
71
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
72
+ Requires-Dist: pytest-cov>=4.1; extra == "dev"
73
+ Requires-Dist: pytest-mock>=3.12; extra == "dev"
74
+ Requires-Dist: vcrpy>=6.0; extra == "dev"
75
+ Requires-Dist: httpx[mock]>=0.27; extra == "dev"
76
+ Requires-Dist: black>=24.0; extra == "dev"
77
+ Requires-Dist: ruff>=0.3; extra == "dev"
78
+ Requires-Dist: mypy>=1.8; extra == "dev"
79
+ Requires-Dist: bump2version>=1.0; extra == "dev"
80
+ Provides-Extra: all
81
+ Requires-Dist: pygeofetch[dev,geo]; extra == "all"
82
+ Dynamic: license-file
83
+
84
+ <div align="center">
85
+
86
+ <img src="https://appiahkubis14.github.io/portfolio/logo/samuel_logo_dark.svg" alt="PyGeoFetch Logo" width="200"/>
87
+
88
+ # PyGeoFetch
89
+
90
+ [![PyPI version](https://badge.fury.io/py/pygeofetch.svg)](https://pypi.org/project/pygeofetch/)
91
+ [![Python Versions](https://img.shields.io/pypi/pyversions/pygeofetch.svg)](https://pypi.org/project/pygeofetch/)
92
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
93
+ [![Tests](https://github.com/appiahkubis14/pygeofetch/actions/workflows/tests.yml/badge.svg)](https://github.com/appiahkubis14/pygeofetch/actions)
94
+ [![Coverage](https://codecov.io/gh/appiahkubis14/pygeofetch/branch/main/graph/badge.svg)](https://codecov.io/gh/appiahkubis14/pygeofetch)
95
+
96
+ **Universal satellite data pipeline — unified access to 22+ satellite repositories with one CLI or Python API.**
97
+
98
+ </div>
99
+
100
+ ---
101
+
102
+ ## 📖 Introduction
103
+
104
+ PyGeoFetch is a **production-ready satellite data acquisition framework** that provides unified, authenticated access to 22+ Earth observation repositories — including Sentinel, Landsat, Planet, Maxar, Airbus, Copernicus, USGS, NASA, JAXA, and more — through a single consistent CLI and Python API.
105
+
106
+ The package abstracts away the authentication complexity, API fragmentation, and format inconsistencies of individual satellite providers, giving researchers and engineers a single command or function call to search, filter, download, and post-process satellite imagery at scale.
107
+
108
+ PyGeoFetch provides five core capabilities:
109
+
110
+ 1. Authenticated access to 22+ providers, with secure credential storage via system keyring (macOS Keychain, Windows Credential Manager, Linux Secret Service).
111
+ 2. Unified search across all providers, returning standardized GeoJSON, STAC, GeoParquet, or CSV results sortable by cloud cover, date, score, or satellite.
112
+ 3. Resilient parallel downloads with checksum verification, resume support, exponential backoff, and atomic writes.
113
+ 4. A chainable post-processing system for reprojection, compression, NDVI/NDWI computation, resampling, and Cloud Optimized GeoTIFF conversion.
114
+ 5. YAML pipeline orchestration with cron scheduling, webhook notifications, and full pipeline history — enabling repeatable, automated geospatial data workflows.
115
+
116
+ ---
117
+
118
+ ## 📝 Statement of Need
119
+
120
+ Accessing satellite data at scale is surprisingly fragmented. Each provider — USGS, Copernicus, Planet, Maxar, NASA — exposes a different authentication scheme, a different query API, a different download protocol, and a different file format. Researchers and engineers working across multiple providers must maintain a patchwork of custom scripts, scattered credentials, and ad hoc download logic, making workflows difficult to reproduce and brittle to maintain.
121
+
122
+ Existing tools address parts of this problem: EODAG supports several providers but lacks pipeline orchestration and commercial coverage; `pystac-client` handles STAC-compliant endpoints only; `sentinelsat` is Sentinel-specific. No single tool covers the full breadth of providers needed for operational geospatial workflows.
123
+
124
+ PyGeoFetch addresses this gap by providing:
125
+
126
+ - A **single CLI** that works identically across all 22 providers.
127
+ - A **unified Python API** with standardized result and download models, removing provider-specific boilerplate.
128
+ - A **pipeline layer** for scheduling recurring data acquisitions without external orchestration tools.
129
+ - **Production-grade resilience** — circuit breakers, retries, resume, checksum verification, and atomic writes — that make satellite downloads reliable enough for automated pipelines.
130
+
131
+ ---
132
+
133
+ ## 🚀 Key Features
134
+
135
+ ### 🛰️ 22+ Satellite Providers
136
+ - Open-access providers with no login required: Microsoft Planetary Computer, AWS Earth, Element 84, NOAA Big Data, ESA SciHub mirrors, JAXA, ISRO Bhuvan, INPE CBERS, DigitalGlobe Open Data
137
+ - Credentialled providers: USGS, Copernicus CDSE, NASA Earthdata, Planet Labs, Sentinel Hub, Maxar GBDX, Airbus OneAtlas, Alaska Satellite Facility, Google Earth Engine, OpenTopography, TerraBotics
138
+ - Supports SAR, sub-metre, STAC, optical, DEM, and LiDAR collections across providers
139
+
140
+ ### 🔍 Unified Search
141
+ - Single query across multiple providers simultaneously with merged, deduplicated results
142
+ - Filter by bounding box, geometry file, date range, cloud cover, resolution, processing level, and CQL2 expressions
143
+ - Output to table, JSON, GeoJSON, STAC ItemCollection, GeoParquet, CSV, or scene IDs
144
+
145
+ ### 📥 Resilient Downloads
146
+ - Adaptive parallel downloads with configurable concurrency
147
+ - SHA256 checksum verification, resume support, and exponential-backoff retries
148
+ - Atomic writes — no partial files ever written to disk
149
+ - Bandwidth throttling and webhook notifications on completion or failure
150
+
151
+ ### ⚙️ Post-Processing Chains
152
+ Chain operations applied immediately after download:
153
+
154
+ `unzip` → `reproject:EPSG:4326` → `compress:lzw` → `ndvi` → `resample:10` → `cog`
155
+
156
+ Full list: unzip, reproject, compress, NDVI, NDWI, composite, atmospheric correction, clip, resample, Cloud Optimized GeoTIFF, merge, pan-sharpen.
157
+
158
+ ### 📋 YAML Pipeline Orchestration
159
+ - Define search → filter → download → export workflows in YAML
160
+ - Schedule with cron expressions, list history, retry failed runs
161
+ - Docker-ready for containerized pipeline deployments
162
+
163
+ ### 🔐 Security by Default
164
+ - Credentials stored in system keyring — never logged or written to disk in plaintext
165
+ - TLS 1.2+ enforced, SSL verification always on, no telemetry, no analytics
166
+
167
+ ---
168
+
169
+ ## 📦 Installation
170
+
171
+ ```bash
172
+ # Core
173
+ pip install pygeofetch
174
+
175
+ # + Raster/vector processing (rasterio, geopandas, rioxarray)
176
+ pip install "pygeofetch[geo]"
177
+
178
+ # + Everything
179
+ pip install "pygeofetch[all]"
180
+ ```
181
+
182
+ **Requirements:** Python 3.9+
183
+
184
+ ---
185
+
186
+ ## ⚡ Quick Start
187
+
188
+ ### CLI
189
+
190
+ ```bash
191
+ # Add credentials
192
+ pygeofetch auth add usgs --username USER --password PASS
193
+ pygeofetch auth add planet --api-key YOUR_KEY
194
+
195
+ # Search
196
+ pygeofetch search run \
197
+ --bbox "-74.1,40.6,-73.7,40.9" \
198
+ --start-date 2024-01-01 \
199
+ --cloud-cover 0-15 \
200
+ --providers planetary_computer \
201
+ --output results.geojson
202
+
203
+ # Download with post-processing
204
+ pygeofetch download run \
205
+ --from-search results.geojson \
206
+ --output ./data/ \
207
+ --parallel 4 \
208
+ --verify-checksum \
209
+ --post-process "unzip,reproject:EPSG:4326,compress:lzw,cog"
210
+ ```
211
+
212
+ ### Python API
213
+
214
+ ```python
215
+ from pathlib import Path
216
+ from pygeofetch import pygeofetch
217
+ from pygeofetch.models import SearchQuery, DownloadOptions
218
+
219
+ sb = pygeofetch()
220
+ sb.add_credentials("usgs", username="user", password="pass")
221
+ sb.add_credentials("planet", api_key="PL_KEY")
222
+
223
+ results = sb.search(
224
+ SearchQuery(
225
+ bbox=(-74.1, 40.6, -73.7, 40.9),
226
+ start_date="2024-01-01",
227
+ end_date="2024-06-01",
228
+ cloud_cover_max=20,
229
+ ),
230
+ providers=["usgs", "copernicus", "planetary_computer", "aws_earth"],
231
+ )
232
+
233
+ downloads = sb.download(
234
+ results[:5],
235
+ destination=Path("./data/"),
236
+ options=DownloadOptions(parallel=4, verify_checksum=True, resume=True),
237
+ )
238
+
239
+ for dr in downloads:
240
+ print(f"✓ {dr.data_id} ({dr.bytes_downloaded // 1024 // 1024:.1f} MB)" if dr.success else f"✗ {dr.data_id}: {dr.error}")
241
+ ```
242
+
243
+ ### YAML Pipeline
244
+
245
+ ```yaml
246
+ name: weekly-sentinel2-ndvi
247
+ schedule: "0 6 * * 1"
248
+ steps:
249
+ - search:
250
+ providers: [copernicus, aws_earth, planetary_computer]
251
+ date_range: last_7_days
252
+ cloud_cover: 0-10
253
+ bbox: "-74.1,40.6,-73.7,40.9"
254
+ - filter:
255
+ expression: "data.cloud_cover < 5"
256
+ - download:
257
+ parallel: 4
258
+ output: ./raw/
259
+ verify_checksum: true
260
+ post_process: "unzip,reproject:EPSG:4326,cog"
261
+ - export:
262
+ format: cloud_optimized_geotiff
263
+ destination: s3://my-bucket/ndvi/
264
+ ```
265
+
266
+ ```bash
267
+ pygeofetch pipeline run weekly-sentinel2.yaml
268
+ pygeofetch pipeline schedule weekly-sentinel2.yaml
269
+ ```
270
+
271
+ ---
272
+
273
+ ## 📋 Documentation
274
+
275
+ Comprehensive documentation is available at **https://appiahkubis14.github.io/pygeofetch-docs/**, including:
276
+
277
+ - Full CLI reference
278
+ - Provider authentication guides
279
+ - Pipeline configuration reference
280
+ - Post-processing action catalogue
281
+ - Contributing guide
282
+
283
+ ---
284
+
285
+ ## 🤝 Contributing
286
+
287
+ Contributions of all kinds are welcome. See [CONTRIBUTING.md](https://github.com/appiahkubis14/pygeofetch?tab=contributing-ov-file) for full guidelines.
288
+
289
+ Good first issues include implementing stub providers to full API integrations, improving test coverage, and adding new post-processing actions.
290
+
291
+ <!-- ```bash
292
+ git clone https://github.com/appiahkubis14/pygeofetch
293
+ cd pygeofetch
294
+ pip install -e ".[dev,all]"
295
+ pytest tests/ -v
296
+ ``` -->
297
+
298
+ ---
299
+
300
+ ## 📄 License
301
+
302
+ PyGeoFetch is free and open source software, licensed under the [MIT License](LICENSE).