PyGeoFetch 2.0.4__tar.gz → 2.0.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.
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/CHANGELOG.md +6 -6
- {pygeofetch-2.0.4/pygeofetch.egg-info → pygeofetch-2.0.6}/PKG-INFO +1 -1
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/__init__.py +2 -2
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/main.py +2 -2
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/interferogram.py +13 -2
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/unwrap.py +11 -20
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/meta.yaml +1 -1
- {pygeofetch-2.0.4 → pygeofetch-2.0.6/pygeofetch.egg-info}/PKG-INFO +1 -1
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pyproject.toml +1 -1
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/LICENSE +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/MANIFEST.in +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/README.md +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/auth_commands.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/config_commands.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/download_commands.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/index_commands.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/pipeline_process_commands.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/postprocess_commands.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/preprocess_commands.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/sar_commands.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/cli/search_commands.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/config/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/config/defaults.yaml +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/config/settings.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/core/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/core/authenticator.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/core/cache_manager.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/core/downloader.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/core/engine.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/core/logging.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/core/orbits.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/core/scheduler.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/core/searcher.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/annotation.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/atmosphere.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/coregister.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/deburst.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/esd.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/extraction.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/flatearth.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/geolocation.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/gpu.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/ionosphere.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/splitspectrum_diagnostic.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/stack_selection.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/synthetic.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/timeseries.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/validate.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/visualize.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/insar/workflow.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/models/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/models/download_task.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/models/satellite_data.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/models/search_query.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/models/user_auth.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processing/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processing/base.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processing/batch.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processing/indices.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processing/pipeline.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processing/postprocessor.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processing/preprocessor.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processing/sar.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processor/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processor/indices.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processor/landsat.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processor/loader.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processor/stacker.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/processor/timeseries.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/airbus_oneatlas.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/alaska_satellite_facility.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/aws_earth.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/base.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/copernicus.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/digitalglobe.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/earth_explorer_additional.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/element84.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/eodag_provider.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/esa_scihub.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/geoserver_generic.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/google_earth_engine.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/inpe_cbers.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/isro_bhuvan.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/jaxa_earth.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/maxar_gbdx.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/nasa_earthdata.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/nasa_earthdata_cloud.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/noaa_big_data.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/opentopography.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/planet.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/planetary_computer.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/sentinel_hub.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/terrabotics.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/providers/usgs.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/sar/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/sar/_native.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/sar/_ost.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/sar/_sarxarray.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/sar/extraction.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/sar/processor.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/utils/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/utils/file_utils.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/utils/gcp_recovery.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/utils/geo_utils.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/utils/logging_setup.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/utils/retry_handler.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/utils/validators.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/viz/__init__.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/viz/map.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch/viz/plot.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch.egg-info/SOURCES.txt +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch.egg-info/dependency_links.txt +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch.egg-info/entry_points.txt +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch.egg-info/not-zip-safe +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch.egg-info/requires.txt +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/pygeofetch.egg-info/top_level.txt +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/setup.cfg +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_atmospheric_circular_regression (1).py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_atmospheric_circular_regression.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_build_sbas_network.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_burst_metadata.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_burst_processing_integration.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_coregister_integration.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_coregister_upgrades.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_era5_atmospheric_correction.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_extraction.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_flat_earth_phase.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_gcp_reprojection.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_insar.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_ionosphere.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_models.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_pgv_integration_contract.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_provider_geometry_audit (1).py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_provider_geometry_audit.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_provider_scene_disambiguation.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_providers.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_raster_collocation_integration.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_search_download.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_splitspectrum_diagnostic.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_utils.py +0 -0
- {pygeofetch-2.0.4 → pygeofetch-2.0.6}/tests/test_viz_plot.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
3
|
All notable changes to PyGeoFetch are documented here.
|
|
4
|
-
Format follows [Keep a Changelog](https://keepachangelog.com/en/2.0.
|
|
4
|
+
Format follows [Keep a Changelog](https://keepachangelog.com/en/2.0.6/).
|
|
5
5
|
|
|
6
|
-
## [2.0.
|
|
6
|
+
## [2.0.6] — 2026-07-29
|
|
7
7
|
|
|
8
8
|
### Added
|
|
9
9
|
- Major SNAPHU unwrapping improvements for urban InSAR applications
|
|
@@ -51,7 +51,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/2.0.4/).
|
|
|
51
51
|
|
|
52
52
|
### Migration Guide
|
|
53
53
|
```python
|
|
54
|
-
# Before (v2.0.
|
|
54
|
+
# Before (v2.0.6)
|
|
55
55
|
unwrapper = PhaseUnwrapper(cost_mode="defo", init_method="mcf")
|
|
56
56
|
unwrapped = unwrapper.unwrap(phase, coherence, nlooks=2.0)
|
|
57
57
|
|
|
@@ -72,7 +72,7 @@ unwrapped = unwrapper.unwrap(
|
|
|
72
72
|
|
|
73
73
|
---
|
|
74
74
|
|
|
75
|
-
## [2.0.
|
|
75
|
+
## [2.0.6] — 2026-07-12
|
|
76
76
|
|
|
77
77
|
### Added
|
|
78
78
|
- Federated search across 22+ satellite data providers
|
|
@@ -188,8 +188,8 @@ unwrapped = unwrapper.unwrap(
|
|
|
188
188
|
|
|
189
189
|
| Version | Date | Key Changes |
|
|
190
190
|
|---------|------------|-------------|
|
|
191
|
-
| **2.0.
|
|
192
|
-
| **2.0.
|
|
191
|
+
| **2.0.6** | 2026-07-29 | SNAPHU unwrapping fixes, 87.1% reliable pixels |
|
|
192
|
+
| **2.0.6** | 2026-07-12 | 22 providers, 17 indices, Sentinel-1C/D |
|
|
193
193
|
| **1.9.2** | 2026-06-15 | Batch processing, parallel downloads |
|
|
194
194
|
| **1.9.1** | 2026-05-20 | 3D terrain, SNAPHU integration, time series |
|
|
195
195
|
| **1.9.0** | 2026-04-25 | Initial public release |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
PyGeoFetch v2.0.
|
|
2
|
+
PyGeoFetch v2.0.6 — 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,7 +30,7 @@ CLI::
|
|
|
30
30
|
pygeofetch doctor
|
|
31
31
|
"""
|
|
32
32
|
|
|
33
|
-
__version__ = "2.0.
|
|
33
|
+
__version__ = "2.0.6"
|
|
34
34
|
__author__ = "PyGeoFetch Contributors"
|
|
35
35
|
__license__ = "MIT"
|
|
36
36
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
PyGeoFetch CLI v2.0.
|
|
2
|
+
PyGeoFetch CLI v2.0.6 main entry point.
|
|
3
3
|
|
|
4
4
|
Full command reference:
|
|
5
5
|
pygeofetch auth — credential management
|
|
@@ -71,7 +71,7 @@ def cli(
|
|
|
71
71
|
) -> None:
|
|
72
72
|
"""
|
|
73
73
|
\b
|
|
74
|
-
PyGeoFetch v2.0.
|
|
74
|
+
PyGeoFetch v2.0.6 — Universal Satellite Data Pipeline
|
|
75
75
|
===========================================================
|
|
76
76
|
Unified access to 22+ satellite data providers.
|
|
77
77
|
|
|
@@ -1003,9 +1003,20 @@ class InterferogramGenerator:
|
|
|
1003
1003
|
)
|
|
1004
1004
|
|
|
1005
1005
|
sec_deburst_row_offset = int(round(ref_row_off + representative_row_offset))
|
|
1006
|
+
# sec_debursted, _ = deburst_array(
|
|
1007
|
+
# sec_complex, sec_burst_info, azimuth_time_interval_s,
|
|
1008
|
+
# row_offset=sec_deburst_row_offset,
|
|
1009
|
+
# )
|
|
1010
|
+
|
|
1011
|
+
# FIX: Use ref_burst_info for the secondary as well.
|
|
1012
|
+
# Because sec_complex has already been resampled onto the reference's
|
|
1013
|
+
# grid by the swath-level coregistration, its burst boundaries in
|
|
1014
|
+
# pixel coordinates now perfectly match the reference's. Using
|
|
1015
|
+
# sec_burst_info applies the secondary's original, un-warped timing,
|
|
1016
|
+
# which cuts out the wrong rows and destroys coherence at burst edges.
|
|
1006
1017
|
sec_debursted, _ = deburst_array(
|
|
1007
|
-
sec_complex,
|
|
1008
|
-
row_offset=
|
|
1018
|
+
sec_complex, ref_burst_info, azimuth_time_interval_s,
|
|
1019
|
+
row_offset=int(ref_row_off),
|
|
1009
1020
|
)
|
|
1010
1021
|
|
|
1011
1022
|
# Real correctness fix, not optional: deburst can remove
|
|
@@ -214,7 +214,10 @@ def _ensure_snaphu_cli() -> str:
|
|
|
214
214
|
# 3. Download if on Windows
|
|
215
215
|
if platform.system() == "Windows":
|
|
216
216
|
logger.info("SNAPHU executable not found. Downloading pre-compiled binary for Windows...")
|
|
217
|
-
|
|
217
|
+
|
|
218
|
+
# The official isce-framework/snaphu-py does not provide Windows wheels/binaries.
|
|
219
|
+
# We use marsfan/SNAPHU-win which reliably hosts pre-compiled Windows binaries.
|
|
220
|
+
api_url = "https://api.github.com/repos/marsfan/SNAPHU-win/releases/latest"
|
|
218
221
|
asset_url = None
|
|
219
222
|
|
|
220
223
|
try:
|
|
@@ -224,29 +227,15 @@ def _ensure_snaphu_cli() -> str:
|
|
|
224
227
|
|
|
225
228
|
for asset in data.get("assets", []):
|
|
226
229
|
name = asset["name"].lower()
|
|
227
|
-
if
|
|
230
|
+
if name.endswith(".zip") and "snaphu" in name:
|
|
228
231
|
asset_url = asset["browser_download_url"]
|
|
229
232
|
break
|
|
230
|
-
|
|
231
|
-
if not asset_url:
|
|
232
|
-
# Fallback to scottstanie's repo which often hosts the windows binaries
|
|
233
|
-
api_url2 = "https://api.github.com/repos/scottstanie/snaphu-py/releases/latest"
|
|
234
|
-
req2 = urllib.request.Request(api_url2, headers={'User-Agent': 'PyGeoFetch'})
|
|
235
|
-
with urllib.request.urlopen(req2, timeout=15) as response2:
|
|
236
|
-
data2 = json.loads(response2.read().decode())
|
|
237
|
-
for asset in data2.get("assets", []):
|
|
238
|
-
if "win" in asset["name"].lower() and asset["name"].endswith(".zip"):
|
|
239
|
-
asset_url = asset["browser_download_url"]
|
|
240
|
-
break
|
|
241
233
|
except Exception as e:
|
|
242
234
|
logger.warning(f"Could not query GitHub API for SNAPHU binary: {e}")
|
|
243
235
|
|
|
244
236
|
if not asset_url:
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
"Please install it manually and add it to your PATH, or install via pip:\n"
|
|
248
|
-
" pip install snaphu"
|
|
249
|
-
)
|
|
237
|
+
# Hardcoded fallback to the known working 2.0.7 release
|
|
238
|
+
asset_url = "https://github.com/marsfan/SNAPHU-win/releases/download/2.0.7/snaphu-v2.0.7.zip"
|
|
250
239
|
|
|
251
240
|
logger.info(f"Downloading SNAPHU from {asset_url}...")
|
|
252
241
|
try:
|
|
@@ -255,7 +244,10 @@ def _ensure_snaphu_cli() -> str:
|
|
|
255
244
|
urllib.request.urlretrieve(asset_url, str(zip_path))
|
|
256
245
|
|
|
257
246
|
with zipfile.ZipFile(zip_path, 'r') as zf:
|
|
258
|
-
|
|
247
|
+
# Look for snaphu.exe inside the zip (might be in a subfolder)
|
|
248
|
+
exe_files = [f for f in zf.namelist() if f.lower().endswith(".exe") and "snaphu" in f.lower()]
|
|
249
|
+
if not exe_files:
|
|
250
|
+
exe_files = [f for f in zf.namelist() if f.lower().endswith(".exe")]
|
|
259
251
|
if not exe_files:
|
|
260
252
|
raise RuntimeError("Downloaded zip did not contain an .exe file.")
|
|
261
253
|
|
|
@@ -276,7 +268,6 @@ def _ensure_snaphu_cli() -> str:
|
|
|
276
268
|
"Or install the Python bindings: pip install snaphu"
|
|
277
269
|
)
|
|
278
270
|
|
|
279
|
-
|
|
280
271
|
def goldstein_filter(
|
|
281
272
|
interferogram,
|
|
282
273
|
alpha: float = 0.5,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|