From f861d492ce8fe840539d547643ffa14b7f0efbce Mon Sep 17 00:00:00 2001 From: clausmichele <31700619+clausmichele@users.noreply.github.com> Date: Fri, 11 Aug 2023 09:28:56 +0000 Subject: [PATCH] fix: handle incompatible coords in merge_cubes (#148) * Fix case caused by load_stac * user compat="override" * add comment --------- Co-authored-by: Lukas Weidenholzer --- .../process_implementations/cubes/merge.py | 4 ++- tests/test_merge.py | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/openeo_processes_dask/process_implementations/cubes/merge.py b/openeo_processes_dask/process_implementations/cubes/merge.py index caecc9a8..d26a696c 100644 --- a/openeo_processes_dask/process_implementations/cubes/merge.py +++ b/openeo_processes_dask/process_implementations/cubes/merge.py @@ -113,8 +113,10 @@ def merge_cubes( cube1 = cube1.to_dataset(cube1.openeo.band_dims[0]) cube2 = cube2.to_dataset(cube2.openeo.band_dims[0]) + # compat="override" to deal with potentially conflicting coords + # see https://github.com/Open-EO/openeo-processes-dask/pull/148 for context merged_cube = xr.combine_by_coords( - [cube1, cube2], combine_attrs="drop_conflicts" + [cube1, cube2], combine_attrs="drop_conflicts", compat="override" ) if isinstance(merged_cube, xr.Dataset): merged_cube = merged_cube.to_array(dim="bands") diff --git a/tests/test_merge.py b/tests/test_merge.py index a32505b7..670f9831 100644 --- a/tests/test_merge.py +++ b/tests/test_merge.py @@ -145,3 +145,32 @@ def test_merge_cubes_type_4( assert isinstance(merged_cube_2.data, dask.array.Array) xr.testing.assert_equal(merged_cube_2, cube_1 + 1) + + +@pytest.mark.parametrize("size", [(6, 5, 4, 1)]) +@pytest.mark.parametrize("dtype", [np.float64]) +def test_conflicting_coords( + temporal_interval, bounding_box, random_raster_data, process_registry +): + # See https://github.com/Open-EO/openeo-processes-dask/pull/148 for why is is necessary + # This is basically broadcasting the smaller datacube and then applying the overlap resolver. + cube_1 = create_fake_rastercube( + data=random_raster_data, + spatial_extent=bounding_box, + temporal_extent=temporal_interval, + bands=["B01"], + backend="dask", + ) + cube_1["s2:processing_baseline"] = "05.8" + cube_2 = create_fake_rastercube( + data=random_raster_data, + spatial_extent=bounding_box, + temporal_extent=temporal_interval, + bands=["B02"], + backend="dask", + ) + cube_2["s2:processing_baseline"] = "05.9" + + merged_cube_1 = merge_cubes(cube_1, cube_2) + + assert isinstance(merged_cube_1.data, dask.array.Array)