Skip to content

Commit 4aba08a

Browse files
committed
Preserve non-spatial dims in CubeMetadata.resample_cube_spatial()
ref Open-EO/openeo-python-driver#397
1 parent 737c90d commit 4aba08a

File tree

5 files changed

+73
-2
lines changed

5 files changed

+73
-2
lines changed

CHANGELOG.md

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

2020
### Fixed
2121

22+
- Preserve original non-spatial dimensions in `CubeMetadata.resample_cube_spatial()` ([Open-EO/openeo-python-driver#397](https://github.com/Open-EO/openeo-python-driver/issues/397))
23+
2224

2325
## [0.40.0] - 2025-04-14
2426

openeo/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.41.0a1"
1+
__version__ = "0.41.0a2"

openeo/metadata.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,10 @@ def resample_spatial(
486486
return self._clone_and_update(dimensions=dimensions)
487487

488488
def resample_cube_spatial(self, target: CubeMetadata) -> CubeMetadata:
489-
return self._clone_and_update(dimensions=list(target._dimensions))
489+
# Replace spatial dimensions with ones from target, but keep other dimensions
490+
dimensions = [d for d in (self._dimensions or []) if not isinstance(d, SpatialDimension)]
491+
dimensions.extend(target.spatial_dimensions)
492+
return self._clone_and_update(dimensions=dimensions)
490493

491494

492495
class CollectionMetadata(CubeMetadata):

tests/rest/datacube/test_datacube.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,28 @@ def test_resample_cube_spatial_no_source_metadata(s2cube, s2cube_without_metadat
898898
]
899899

900900

901+
def test_resample_cube_spatial_preserve_non_spatial(s2cube):
902+
cube_xytb = s2cube.resample_spatial(resolution=11, projection=32631)
903+
cube_xyt = s2cube.reduce_dimension(dimension="bands", reducer="mean").resample_spatial(
904+
resolution=22, projection=32631
905+
)
906+
cube_xyb = s2cube.reduce_dimension(dimension="t", reducer="mean").resample_spatial(resolution=33, projection=32631)
907+
908+
result = cube_xyt.resample_cube_spatial(target=cube_xytb)
909+
assert result.metadata.dimension_names() == ["t", "x", "y"]
910+
assert result.metadata.spatial_dimensions == [
911+
SpatialDimension(name="x", extent=None, crs=32631, step=11),
912+
SpatialDimension(name="y", extent=None, crs=32631, step=11),
913+
]
914+
915+
result = cube_xyb.resample_cube_spatial(target=cube_xyt)
916+
assert result.metadata.dimension_names() == ["bands", "x", "y"]
917+
assert result.metadata.spatial_dimensions == [
918+
SpatialDimension(name="x", extent=None, crs=32631, step=22),
919+
SpatialDimension(name="y", extent=None, crs=32631, step=22),
920+
]
921+
922+
901923
def test_resample_cube_spatial_no_target_metadata(s2cube, s2cube_without_metadata):
902924
cube = s2cube.resample_spatial(resolution=10, projection=32631)
903925
target = s2cube_without_metadata

tests/test_metadata.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,3 +1110,47 @@ def test_metadata_resample_cube_spatial(cube_metadata):
11101110
SpatialDimension(name="x", extent=[2, 7], crs=32631, step=11),
11111111
SpatialDimension(name="y", extent=[49, 52], crs=32631, step=22),
11121112
]
1113+
1114+
1115+
def test_metadata_resample_cube_spatial_preserve_non_spatial():
1116+
xy1 = [
1117+
SpatialDimension(name="x", extent=[12, 17], crs=4326, step=0.1),
1118+
SpatialDimension(name="y", extent=[41, 51], crs=4326, step=0.1),
1119+
]
1120+
t1 = TemporalDimension(name="t", extent=["2024-01-01", "2024-10-01"])
1121+
b1 = BandDimension(name="bands", bands=[Band("B1"), Band("B11")])
1122+
metadata1 = CubeMetadata(dimensions=xy1 + [t1, b1])
1123+
1124+
xy2 = [
1125+
SpatialDimension(name="x", extent=[22, 27], crs=4326, step=0.1),
1126+
SpatialDimension(name="y", extent=[42, 52], crs=4326, step=0.1),
1127+
]
1128+
t2 = TemporalDimension(name="t", extent=["2024-02-02", "2024-12-02"])
1129+
metadata2 = CubeMetadata(dimensions=xy2 + [t2])
1130+
1131+
xy3 = [
1132+
SpatialDimension(name="x", extent=[32, 37], crs=4326, step=0.1),
1133+
SpatialDimension(name="y", extent=[43, 53], crs=4326, step=0.1),
1134+
]
1135+
b3 = BandDimension(name="bands", bands=[Band("B3"), Band("B33")])
1136+
metadata3 = CubeMetadata(dimensions=xy3 + [b3])
1137+
1138+
result12 = metadata1.resample_cube_spatial(target=metadata2)
1139+
assert result12.spatial_dimensions == xy2
1140+
assert result12.band_dimension == b1
1141+
assert result12.temporal_dimension == t1
1142+
1143+
result21 = metadata2.resample_cube_spatial(target=metadata1)
1144+
assert result21.spatial_dimensions == xy1
1145+
assert not result21.has_band_dimension()
1146+
assert result21.temporal_dimension == t2
1147+
1148+
result23 = metadata2.resample_cube_spatial(target=metadata3)
1149+
assert result23.spatial_dimensions == xy3
1150+
assert not result23.has_band_dimension()
1151+
assert result23.temporal_dimension == t2
1152+
1153+
result31 = metadata3.resample_cube_spatial(target=metadata1)
1154+
assert result31.spatial_dimensions == xy1
1155+
assert result31.band_dimension == b3
1156+
assert not result31.has_temporal_dimension()

0 commit comments

Comments
 (0)