[Git][debian-gis-team/asf-search][master] 5 commits: New upstream version 10.3.0
Antonio Valentino (@antonio.valentino)
gitlab at salsa.debian.org
Sat Dec 6 15:41:42 GMT 2025
Antonio Valentino pushed to branch master at Debian GIS Project / asf-search
Commits:
95702bb2 by Antonio Valentino at 2025-12-06T15:24:41+00:00
New upstream version 10.3.0
- - - - -
73c362cc by Antonio Valentino at 2025-12-06T15:24:45+00:00
Update upstream source from tag 'upstream/10.3.0'
Update to upstream version '10.3.0'
with Debian dir 945d58572c3b85df1e268f78e19a5d71c8040728
- - - - -
ecc7df61 by Antonio Valentino at 2025-12-06T15:26:59+00:00
New upstream release
- - - - -
9ff92146 by Antonio Valentino at 2025-12-06T15:38:48+00:00
Update dependencies
- - - - -
f140c707 by Antonio Valentino at 2025-12-06T15:38:54+00:00
Set distribution to unstable
- - - - -
11 changed files:
- .github/workflows/run-pytest-authenticated.yml
- .github/workflows/run-pytest.yml
- CHANGELOG.md
- + asf_search/Pair.py
- asf_search/__init__.py
- asf_search/exceptions.py
- debian/changelog
- debian/control
- + examples/Pair.ipynb
- setup.py
- + tests/Pair/test_Pair.py
Changes:
=====================================
.github/workflows/run-pytest-authenticated.yml
=====================================
@@ -22,7 +22,7 @@ jobs:
- name: Install Dependencies
run: |
python3 -m pip install --upgrade pip
- python3 -m pip install .[extras,test,asf-enumeration]
+ python3 -m pip install .[extras,test,asf-enumeration,coherence]
- name: Run Tests
env:
=====================================
.github/workflows/run-pytest.yml
=====================================
@@ -12,7 +12,7 @@ jobs:
- name: Install Dependencies
run: |
python3 -m pip install --upgrade pip
- python3 -m pip install .[extras,test,asf-enumeration]
+ python3 -m pip install .[extras,test,asf-enumeration,coherence]
- name: Run Tests
run: python3 -m pytest -n auto --cov=asf_search --cov-report=xml --dont-run-file test_known_bugs --ignore=tests/yml_tests/test_authenticated .
=====================================
CHANGELOG.md
=====================================
@@ -25,6 +25,11 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
-->
+------
+## [v10.3.0](https://github.com/asfadmin/Discovery-asf_search/compare/v10.2.1...v10.3.0)
+### Added
+- Add a Pair class that groups ASFProducts as reference and secondary scenes, and provides temporal and perpendicular baselines as member variables. Pair will be used for creating InSAR SBAS stacks, though its utility extends beyond that use case. A new dependency group `coherence` is included in the `setup.py`.
+
------
## [v10.2.1](https://github.com/asfadmin/Discovery-asf_search/compare/v10.2.0...v10.2.1)
### Added
=====================================
asf_search/Pair.py
=====================================
@@ -0,0 +1,112 @@
+import importlib.util
+import math
+
+from .ASFProduct import ASFProduct
+from .baseline import calculate_perpendicular_baselines
+from .exceptions import CoherenceEstimationError
+import pytz
+
+_COHERENCE_OPT_DEPS = ['zarr', 's3fs', 'rioxarray', 'xarray']
+try:
+ for spec in _COHERENCE_OPT_DEPS:
+ if importlib.util.find_spec(spec) is None:
+ raise ImportError
+
+ import fsspec
+ import xarray as xr
+
+except ImportError:
+ fsspec = None
+ xr = None
+
+try:
+ from ciso8601 import parse_datetime
+except ImportError:
+ from dateutil.parser import parse as parse_datetime
+
+
+class Pair:
+ """
+ A Pair is comprised of a reference scene and a secondary scene. These scenes typically intersect geographically,
+ but that is not a requirement. When a pair is created, its perpendicular and temporal baselines are calculated
+ and stored in the self.perpendicular_baseline and self.temporal_baseline member variables.
+
+ Two pairs are equivalent if they have matching reference and secondary dates
+ """
+ def __init__(self, ref: ASFProduct, sec: ASFProduct):
+ self.ref = ref
+ self.sec = sec
+ self.id = (ref.properties['sceneName'], sec.properties['sceneName'])
+
+ self.perpendicular_baseline = calculate_perpendicular_baselines(
+ ref.properties['sceneName'],
+ [sec, ref])[0].properties['perpendicularBaseline']
+
+ self.ref_time = parse_datetime(ref.properties["startTime"])
+ if self.ref_time.tzinfo is None:
+ self.ref_time = pytz.utc.localize(self.ref_time)
+ self.sec_time = parse_datetime(sec.properties["startTime"])
+ if self.sec_time.tzinfo is None:
+ self.sec_time = pytz.utc.localize(self.sec_time)
+
+ self.temporal_baseline = self.sec_time.date() - self.ref_time.date()
+
+ def __repr__(self) -> str:
+ return f"Pair({self.id[0]}, {self.id[1]})"
+
+ def __eq__(self, other):
+ if not isinstance(other, Pair):
+ return NotImplemented
+ return self.id == other.id
+
+ def __hash__(self) -> int:
+ return hash(self.id)
+
+ def estimate_s1_mean_coherence(self) -> float:
+ '''
+ Estimates mean coherence for a Pair of Sentinel-1 scenes or bursts using the 11367x4367 overview of the 2019-2020
+ VV COH data from the Global Seasonal Sentinel-1 Interferometric Coherence and Backscatter Dataset:
+ https://asf.alaska.edu/datasets/daac/global-seasonal-sentinel-1-interferometric-coherence-and-backscatter-dataset/
+
+ To support effecient in-place subsetting and access, the VV COH data has been saved to a public Zarr Store in AWS S3:
+ s3://asf-search-coh/global_coh_100ppd_11367x4367
+
+ Returns:
+ '''
+ if xr is None or fsspec is None:
+ raise ImportError(
+ 'The `estimate_s1_mean_coherence()` method requires the optional asf-search '
+ f'dependencies {_COHERENCE_OPT_DEPS}, '
+ 'but they could not be found in the current python environment. '
+ 'Enable this method by including the appropriate pip or conda install. '
+ 'Ex: `python -m pip install asf-search[coherence]`'
+ )
+
+ month = parse_datetime(self.ref.properties["startTime"]).month
+ if month in [12, 1, 2]:
+ season = 'winter'
+ elif month in [3, 4, 5]:
+ season = 'spring'
+ elif month in [6, 7, 8]:
+ season = 'summer'
+ elif month in [9, 10, 11]:
+ season = 'fall'
+
+ temporal = math.ceil(self.temporal_baseline.days / 6) * 6
+ if temporal > 48:
+ msg = (f"""Coherence dataset includes temporal baselines up to 48 days.
+ Temporal baseline: {self.temporal_baseline.days} days""")
+ raise CoherenceEstimationError(msg)
+
+ uri = f"s3://asf-search-coh/global_coh_100ppd_11367x4367_Zarrv2/Global_{season}_vv_COH{temporal}_100ppd.zarr"
+ coords = self.ref.geometry['coordinates'][0]
+ lons, lats = zip(*coords)
+ minx, miny, maxx, maxy = min(lons), min(lats), max(lons), max(lats)
+
+ ds = xr.open_zarr(
+ fsspec.get_mapper(uri, s3={'anon': True}),
+ consolidated=False
+ )
+ ds = ds.rio.write_crs("EPSG:4326", inplace=False)
+ subset = ds.rio.clip_box(minx=minx, miny=miny, maxx=maxx, maxy=maxy)
+ return subset.coherence.mean().compute().item()
=====================================
asf_search/__init__.py
=====================================
@@ -54,6 +54,7 @@ from .CMR import * # noqa: F403 F401 E402
from .baseline import * # noqa: F403 F401 E402
from .WKT import validate_wkt # noqa: F401 E402
from .export import * # noqa: F403 F401 E402
+from .Pair import Pair # noqa: F401, E402
REPORT_ERRORS = True
"""Enables automatic search error reporting to ASF, send any questions to uso at asf.alaska.edu"""
=====================================
asf_search/exceptions.py
=====================================
@@ -30,6 +30,10 @@ class ASFWKTError(ASFError):
"""Raise when wkt related errors occur"""
+class CoherenceEstimationError(ASFError):
+ """Raise if coherence estimation is requested for a Pair with a temporal baseline > 48 days"""
+
+
class CMRError(Exception):
"""Base CMR Exception"""
=====================================
debian/changelog
=====================================
@@ -1,3 +1,12 @@
+asf-search (10.3.0-1) unstable; urgency=medium
+
+ * New upstream release.
+ * debian/control:
+ - Add build depencency on python3-fsspec, python3-pandas,
+ python3-rioxarray, python3-xarray, and python3-zarr
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it> Sat, 06 Dec 2025 15:36:45 +0000
+
asf-search (10.2.1-1) unstable; urgency=medium
* New upstream release.
=====================================
debian/control
=====================================
@@ -10,14 +10,19 @@ Build-Depends: debhelper-compat (= 13),
python3-ciso8601,
python3-dateparser,
python3-dateutil,
+ python3-fsspec,
python3-numpy,
+ python3-pandas,
+ python3-pytz,
python3-remotezip,
python3-requests,
+ python3-rioxarray,
python3-setuptools,
python3-setuptools-scm,
python3-shapely,
python3-tenacity,
- python3-pytz
+ python3-xarray,
+ python3-zarr
Standards-Version: 4.7.2
Testsuite: autopkgtest-pkg-pybuild
Homepage: https://github.com/asfadmin/Discovery-asf_search
@@ -32,5 +37,10 @@ Package: python3-asf-search
Architecture: all
Depends: ${python3:Depends},
${misc:Depends}
+Suggests: python3-fsspec,
+ python3-pandas,
+ python3-rioxarray,
+ python3-xarray,
+ python3-zarr
Description: ${source:Synopsis}
${source:Extended-Description}
=====================================
examples/Pair.ipynb
=====================================
@@ -0,0 +1,298 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "7fa9e873",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%load_ext autoreload\n",
+ "%autoreload 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "52144455-af61-4f36-b35b-57a04683ebb1",
+ "metadata": {
+ "scrolled": true,
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "import asf_search as asf\n",
+ "import logging\n",
+ "\n",
+ "results = asf.product_search('S1A_IW_SLC__1SDV_20220215T225119_20220215T225146_041930_04FE2E_9252-SLC')\n",
+ "# results = asf.product_search('S1_181296_IW1_20220219T125501_VV_10AF-BURST')\n",
+ "reference = results[0]\n",
+ "\n",
+ "args = asf.ASFSearchOptions(\n",
+ " **{\"start\": '2022-02-10', \"end\": '2022-07-01'}\n",
+ ")\n",
+ "s = reference.stack(args)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8a0920dc",
+ "metadata": {},
+ "source": [
+ "### Create a Pair object from 2 products"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "2b27e862",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "pair.ref.properties['sceneName']: S1A_IW_SLC__1SDV_20220215T225119_20220215T225146_041930_04FE2E_9252\n",
+ "pair.ref_time: 2022-02-15 22:51:19+00:00\n",
+ "\n",
+ "pair.sec.properties['sceneName']: S1A_IW_SLC__1SDV_20220311T225119_20220311T225146_042280_050A1F_B99E\n",
+ "pair.sec_time: 2022-03-11 22:51:19+00:00\n",
+ "\n",
+ "pair.temporal_baseline: 24 days, 0:00:00\n",
+ "pair.perpendicular_baseline: -73\n"
+ ]
+ }
+ ],
+ "source": [
+ "pair = asf.Pair(reference, s[2])\n",
+ "\n",
+ "print(f\"pair.ref.properties['sceneName']: {pair.ref.properties['sceneName']}\")\n",
+ "print(f\"pair.ref_time: {pair.ref_time}\\n\")\n",
+ "\n",
+ "print(f\"pair.sec.properties['sceneName']: {pair.sec.properties['sceneName']}\")\n",
+ "print(f\"pair.sec_time: {pair.sec_time}\\n\")\n",
+ "\n",
+ "print(f\"pair.temporal_baseline: {pair.temporal_baseline}\")\n",
+ "print(f\"pair.perpendicular_baseline: {pair.perpendicular_baseline}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d599ee41",
+ "metadata": {},
+ "source": [
+ "### Check the estimated coherence of the pair"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "9b85de54",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "16.952704858593183"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pair.estimate_s1_mean_coherence()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "77bb1b26",
+ "metadata": {},
+ "source": [
+ "### Create a new pair with a long temporal baseline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "1a0c0ca1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "long_pair.temporal: 120 days, 0:00:00\n"
+ ]
+ }
+ ],
+ "source": [
+ "long_pair = pair = asf.Pair(reference, s[10])\n",
+ "print(f\"long_pair.temporal: {long_pair.temporal_baseline}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2c266f26",
+ "metadata": {},
+ "source": [
+ "### Since the temporal baseline is greater than 48, an exception is raised when checking coherence"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "9d66a395",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "CoherenceEstimationError",
+ "evalue": "Coherence dataset includes temporal baselines up to 48 days.\n Temporal baseline: 120 days",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mCoherenceEstimationError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[6], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mlong_pair\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mestimate_s1_mean_coherence\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[0;32m~/Documents/asf_search/Discovery-asf_search/asf_search/Pair.py:99\u001b[0m, in \u001b[0;36mPair.estimate_s1_mean_coherence\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m temporal \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m48\u001b[39m:\n\u001b[1;32m 97\u001b[0m msg \u001b[38;5;241m=\u001b[39m (\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\"\"\u001b[39m\u001b[38;5;124mCoherence dataset includes temporal baselines up to 48 days.\u001b[39m\n\u001b[1;32m 98\u001b[0m \u001b[38;5;124m Temporal baseline: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtemporal_baseline\u001b[38;5;241m.\u001b[39mdays\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m days\u001b[39m\u001b[38;5;124m\"\"\"\u001b[39m)\n\u001b[0;32m---> 99\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CoherenceEstimationError(msg)\n\u001b[1;32m 101\u001b[0m uri \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ms3://asf-search-coh/global_coh_100ppd_11367x4367_Zarrv2/Global_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mseason\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_vv_COH\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtemporal\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_100ppd.zarr\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 102\u001b[0m coords \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mref\u001b[38;5;241m.\u001b[39mgeometry[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcoordinates\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;241m0\u001b[39m]\n",
+ "\u001b[0;31mCoherenceEstimationError\u001b[0m: Coherence dataset includes temporal baselines up to 48 days.\n Temporal baseline: 120 days"
+ ]
+ }
+ ],
+ "source": [
+ "long_pair.estimate_s1_mean_coherence()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "50c465f1",
+ "metadata": {},
+ "source": [
+ "### Demonstrate pair equivalence\n",
+ "\n",
+ "Two pairs are equal if they both share the same reference and secondary scene IDs.\n",
+ "\n",
+ "Using scene IDs for equivalence guarantees that not only are the dates identical, but that the data are too. Data products are sometimes superceded, and until the old data are removed, there may be multiple versions of a product in the archive. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "5df76460",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "a.ref_time: 2022-02-15 22:51:19+00:00, a.sec_time: 2022-06-15 22:51:24+00:00\n",
+ "b.ref_time: 2022-02-15 22:51:19+00:00, b.sec_time: 2022-06-15 22:51:24+00:00\n",
+ "c.ref_time: 2022-02-15 22:51:19+00:00, c.sec_time: 2022-02-27 22:51:19+00:00\n",
+ "a == b: True\n",
+ "a == c: False\n"
+ ]
+ }
+ ],
+ "source": [
+ "from copy import deepcopy\n",
+ "\n",
+ "a = deepcopy(pair)\n",
+ "b = deepcopy(pair)\n",
+ "c = asf.Pair(reference, s[1])\n",
+ "print(f\"a.ref_time: {a.ref_time}, a.sec_time: {a.sec_time}\")\n",
+ "print(f\"b.ref_time: {b.ref_time}, b.sec_time: {b.sec_time}\")\n",
+ "print(f\"c.ref_time: {c.ref_time}, c.sec_time: {c.sec_time}\")\n",
+ "print(f\"a == b: {a == b}\")\n",
+ "print(f\"a == c: {a == c}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fb7317d1",
+ "metadata": {},
+ "source": [
+ "### Show \\_\\_repr\\_\\_"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "4f40622e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ref: S1A_IW_SLC__1SDV_20220215T225119_20220215T225146_041930_04FE2E_9252\n",
+ "sec: S1A_IW_SLC__1SDV_20220215T225119_20220215T225146_041930_04FE2E_9252\n",
+ "Pair: Pair(S1A_IW_SLC__1SDV_20220215T225119_20220215T225146_041930_04FE2E_9252, S1A_IW_SLC__1SDV_20220227T225119_20220227T225146_042105_050431_987E)\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"ref: {a.ref.properties['sceneName']}\")\n",
+ "print(f\"sec: {c.ref.properties['sceneName']}\")\n",
+ "print(f\"Pair: {c}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "834457cd",
+ "metadata": {},
+ "source": [
+ "### \\_\\_hash\\_\\_ method"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "00327a5d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "True\n",
+ "False\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(hash(a) == hash(b))\n",
+ "print(hash(a) == hash(c))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "57c3254b",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "asf_search",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.19"
+ },
+ "toc-autonumbering": false
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
=====================================
setup.py
=====================================
@@ -34,6 +34,13 @@ asf_enumeration = [
'asf-enumeration>=0.4.0'
]
+# Required for optional Sentinel-1 Pair coherence estimation
+coherence = [
+ 'pandas',
+ 'zarr',
+ 's3fs',
+ 'rioxarray',
+]
with open('README.md', 'r') as readme_file:
readme = readme_file.read()
@@ -53,7 +60,7 @@ setup(
include_package_data=True,
python_requires='>=3.10',
install_requires=requirements,
- extras_require={'test': test_requirements, 'extras': extra_requirements, 'asf-enumeration': asf_enumeration},
+ extras_require={'test': test_requirements, 'extras': extra_requirements, 'asf-enumeration': asf_enumeration, 'coherence': coherence},
license='BSD',
license_files=('LICENSE',),
classifiers=[
=====================================
tests/Pair/test_Pair.py
=====================================
@@ -0,0 +1,34 @@
+from datetime import datetime, timedelta, timezone
+from asf_search.ASFSearchOptions import ASFSearchOptions
+from asf_search.search import product_search
+from asf_search import Pair
+import numpy as np
+
+
+def test_make_s1_pairs():
+
+ args = ASFSearchOptions(
+ **{"start": '2022-02-10', "end": '2022-07-01'}
+ )
+
+ granule_product = product_search('S1A_IW_SLC__1SDV_20220215T225119_20220215T225146_041930_04FE2E_9252-SLC')[0]
+ granule_stack = granule_product.stack(args)
+ granule_pair = Pair(granule_product, granule_stack[1])
+ assert granule_pair.ref.properties['sceneName'] == "S1A_IW_SLC__1SDV_20220215T225119_20220215T225146_041930_04FE2E_9252"
+ assert granule_pair.sec.properties['sceneName'] == "S1A_IW_SLC__1SDV_20220227T225119_20220227T225146_042105_050431_987E"
+ assert granule_pair.ref_time == datetime(2022, 2, 15, 22, 51, 19, tzinfo=timezone.utc)
+ assert granule_pair.sec_time == datetime(2022, 2, 27, 22, 51, 19, tzinfo=timezone.utc)
+ assert granule_pair.perpendicular_baseline == -15
+ assert granule_pair.temporal_baseline == timedelta(days=12)
+ assert np.floor(granule_pair.estimate_s1_mean_coherence()) == 18.0
+
+ burst_product = product_search('S1_181296_IW1_20220219T125501_VV_10AF-BURST')[0]
+ burst_stack = burst_product.stack(args)
+ burst_pair = Pair(burst_product, burst_stack[1])
+ assert burst_pair.ref.properties['sceneName'] == "S1_181296_IW1_20220219T125501_VV_10AF-BURST"
+ assert burst_pair.sec.properties['sceneName'] == "S1_181296_IW1_20220303T125501_VV_F03A-BURST"
+ assert burst_pair.ref_time == datetime(2022, 2, 19, 12, 55, 3, tzinfo=timezone.utc)
+ assert burst_pair.sec_time == datetime(2022, 3, 3, 12, 55, 2, tzinfo=timezone.utc)
+ assert burst_pair.perpendicular_baseline == -75
+ assert burst_pair.temporal_baseline == timedelta(days=12)
+ assert np.floor(burst_pair.estimate_s1_mean_coherence()) == 52.0
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/compare/185fd61e7594a168c89853ad6f111b6b67da7b7d...f140c7079012037dbe12fa7e31a066c86570de95
--
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/compare/185fd61e7594a168c89853ad6f111b6b67da7b7d...f140c7079012037dbe12fa7e31a066c86570de95
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20251206/5e282648/attachment-0001.htm>
More information about the Pkg-grass-devel
mailing list