Skip to content

Commit 298ee07

Browse files
committed
DataCube.sar_backscatter add bands when enabling "mask", "contributing_area", ...
fixes #804
1 parent af9cd1a commit 298ee07

File tree

6 files changed

+71
-3
lines changed

6 files changed

+71
-3
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717

1818
### Fixed
1919

20+
- `DataCube.sar_backscatter()`: add corresponding band names to metadata when enabling "mask", "contributing_area", "local_incidence_angle" or "ellipsoid_incidence_angle" ([#804](https://github.com/Open-EO/openeo-python-client/issues/804))
21+
2022

2123
## [0.45.0] - 2025-09-17
2224

openeo/metadata.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,10 @@ def filter_bands(self, bands: List[Union[int, str]]) -> BandDimension:
193193
bands=[self.bands[self.band_index(b)] for b in bands]
194194
)
195195

196-
def append_band(self, band: Band) -> BandDimension:
196+
def append_band(self, band: Union[Band, str]) -> BandDimension:
197197
"""Create new BandDimension with appended band."""
198+
if isinstance(band, str):
199+
band = Band(name=band)
198200
if band.name in self.band_names:
199201
raise ValueError("Duplicate band {b!r}".format(b=band))
200202

@@ -377,7 +379,7 @@ def filter_bands(self, band_names: List[Union[int, str]]) -> CubeMetadata:
377379
dimensions=[d.filter_bands(band_names) if isinstance(d, BandDimension) else d for d in self._dimensions]
378380
)
379381

380-
def append_band(self, band: Band) -> CubeMetadata:
382+
def append_band(self, band: Union[Band, str]) -> CubeMetadata:
381383
"""
382384
Create new `CubeMetadata` with given band added to band dimension.
383385
"""

openeo/rest/datacube.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2943,7 +2943,16 @@ def sar_backscatter(
29432943
}
29442944
if options:
29452945
arguments["options"] = options
2946-
return self.process(process_id="sar_backscatter", arguments=arguments)
2946+
metadata = self.metadata
2947+
if mask:
2948+
metadata = metadata.append_band(band="mask")
2949+
if contributing_area:
2950+
metadata = metadata.append_band(band="contributing_area")
2951+
if local_incidence_angle:
2952+
metadata = metadata.append_band(band="local_incidence_angle")
2953+
if ellipsoid_incidence_angle:
2954+
metadata = metadata.append_band(band="ellipsoid_incidence_angle")
2955+
return self.process(process_id="sar_backscatter", arguments=arguments, metadata=metadata)
29472956

29482957
@openeo_process
29492958
def fit_curve(self, parameters: list, function: Union[str, PGNode, typing.Callable], dimension: str):

tests/rest/datacube/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def _setup_connection(api_version, requests_mock, build_capabilities_kwargs: Opt
3939
# Some other collections
4040
setup_collection_metadata(requests_mock=requests_mock, cid="MASK", bands=["CLOUDS", "WATER"])
4141
setup_collection_metadata(requests_mock=requests_mock, cid="SENTINEL2_SCF", bands=["SCENECLASSIFICATION", "MSK"])
42+
setup_collection_metadata(requests_mock=requests_mock, cid="S1", bands=["VV", "VH"])
4243

4344
requests_mock.get(API_URL + "/file_formats", json={
4445
"output": {

tests/rest/datacube/test_datacube100.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2875,6 +2875,29 @@ def test_sar_backscatter_check_coefficient_backend(con100, requests_mock):
28752875
}
28762876

28772877

2878+
def test_sar_backscatter_metadat(con100):
2879+
s1 = con100.load_collection("S1")
2880+
assert s1.sar_backscatter().metadata.band_names == ["VV", "VH"]
2881+
assert s1.sar_backscatter(mask=True).metadata.band_names == ["VV", "VH", "mask"]
2882+
assert s1.sar_backscatter(contributing_area=True).metadata.band_names == ["VV", "VH", "contributing_area"]
2883+
assert s1.sar_backscatter(local_incidence_angle=True).metadata.band_names == ["VV", "VH", "local_incidence_angle"]
2884+
assert s1.sar_backscatter(ellipsoid_incidence_angle=True).metadata.band_names == [
2885+
"VV",
2886+
"VH",
2887+
"ellipsoid_incidence_angle",
2888+
]
2889+
assert s1.sar_backscatter(
2890+
mask=True, contributing_area=True, local_incidence_angle=True, ellipsoid_incidence_angle=True
2891+
).metadata.band_names == [
2892+
"VV",
2893+
"VH",
2894+
"mask",
2895+
"contributing_area",
2896+
"local_incidence_angle",
2897+
"ellipsoid_incidence_angle",
2898+
]
2899+
2900+
28782901
def test_datacube_from_process(con100):
28792902
cube = con100.datacube_from_process("colorize", color="red", size=4)
28802903
assert cube.flat_graph() == {

tests/test_metadata.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,24 @@ def test_band_dimension_rename_labels_with_source_mismatch():
228228
_ = metadata.rename_labels("bs", target=["2", "3"], source=["B03"])
229229

230230

231+
def test_band_dimension_append_band():
232+
bdim1 = BandDimension(
233+
name="spectral",
234+
bands=[
235+
Band("B02", "blue", 0.490),
236+
Band("B04", "red", 0.665),
237+
],
238+
)
239+
bdim2 = bdim1.append_band(Band("B08", "nir", 0.842))
240+
bdim3 = bdim1.append_band("B03")
241+
assert bdim1.band_names == ["B02", "B04"]
242+
assert bdim1.common_names == ["blue", "red"]
243+
assert bdim2.band_names == ["B02", "B04", "B08"]
244+
assert bdim2.common_names == ["blue", "red", "nir"]
245+
assert bdim3.band_names == ["B02", "B04", "B03"]
246+
assert bdim3.common_names == ["blue", "red", None]
247+
248+
231249
def assert_same_dimensions(dims1: List[Dimension], dims2: List[Dimension]):
232250
assert sorted(dims1, key=lambda d: d.name) == sorted(dims2, key=lambda d: d.name)
233251

@@ -740,6 +758,19 @@ def test_cubemetadata_add_band_dimension_duplicate():
740758
_ = metadata.add_dimension("layer", "red", "bands")
741759

742760

761+
def test_cubemetadata_append_band():
762+
metadata1 = CubeMetadata(
763+
dimensions=[
764+
BandDimension(name="b", bands=[Band("red"), Band("green")]),
765+
]
766+
)
767+
metadata2 = metadata1.append_band(Band("blue"))
768+
metadata3 = metadata1.append_band("pink")
769+
assert metadata1.band_names == ["red", "green"]
770+
assert metadata2.band_names == ["red", "green", "blue"]
771+
assert metadata3.band_names == ["red", "green", "pink"]
772+
773+
743774
def test_collectionmetadata_add_temporal_dimension():
744775
metadata = CollectionMetadata({"cube:dimensions": {"x": {"type": "spatial"}}})
745776
new = metadata.add_dimension("date", "2020-05-15", "temporal")

0 commit comments

Comments
 (0)