From d1959167f866d79a64d5bad28d257b6494e06239 Mon Sep 17 00:00:00 2001 From: Jan Van den bosch Date: Mon, 16 Sep 2024 09:34:22 +0200 Subject: [PATCH] merge_cubes: merge temporal extents https://github.com/Open-EO/openeo-geopyspark-driver/issues/852 https://github.com/Open-EO/openeo-geopyspark-driver/issues/861 --- openeogeotrellis/geopysparkcubemetadata.py | 16 ++++++++++++++-- openeogeotrellis/geopysparkdatacube.py | 10 +++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/openeogeotrellis/geopysparkcubemetadata.py b/openeogeotrellis/geopysparkcubemetadata.py index 0accba54..d77cab30 100644 --- a/openeogeotrellis/geopysparkcubemetadata.py +++ b/openeogeotrellis/geopysparkcubemetadata.py @@ -2,7 +2,7 @@ from typing import List, Union import dateutil.parser -from openeo.metadata import CollectionMetadata, Dimension +from openeo.metadata import CollectionMetadata, Dimension, TemporalDimension from openeogeotrellis.utils import reproject_cellsize _log = logging.getLogger(__name__) @@ -73,7 +73,8 @@ def filter_temporal(self, start, end) -> 'GeopysparkCubeMetadata': this_start, this_end = self._temporal_extent - if this_start > end or this_end < start: # no overlap + if this_start > end or this_end < start: # compared lexicographically + # no overlap raise ValueError(start, end) return self._clone_and_update(temporal_extent=(max(this_start, start), min(this_end, end))) @@ -82,6 +83,17 @@ def filter_temporal(self, start, end) -> 'GeopysparkCubeMetadata': def temporal_extent(self) -> tuple: return self._temporal_extent + def with_temporal_extent(self, temporal_extent: tuple): + assert self.has_temporal_dimension() + + return self._clone_and_update( + dimensions=[ + TemporalDimension(d.name, temporal_extent) if isinstance(d, TemporalDimension) else d + for d in self._dimensions + ], + temporal_extent=temporal_extent, + ) + @property def opensearch_link_titles(self) -> List[str]: """Get opensearch_link_titles from band dimension""" diff --git a/openeogeotrellis/geopysparkdatacube.py b/openeogeotrellis/geopysparkdatacube.py index fd9762ca..17d17c34 100644 --- a/openeogeotrellis/geopysparkdatacube.py +++ b/openeogeotrellis/geopysparkdatacube.py @@ -945,7 +945,7 @@ def merge_cubes(self, other: 'GeopysparkDataCube', overlaps_resolver:str=None): + f" Left names: {leftBandNames}, right names: {rightBandNames}.", ) - # TODO properly combine bbox and temporal extents in metadata? Yes! Then pass to _apply_to_levels_geotrellis_rdd + # TODO properly combine bbox in metadata? pr = pysc._jvm.org.openeo.geotrellis.OpenEOProcesses() if self._is_spatial() and other._is_spatial(): def merge(rdd,other,level): @@ -1003,6 +1003,14 @@ def merge(rdd,other,level): if iband.name not in merged_data.metadata.band_names: merged_data.metadata = merged_data.metadata.append_band(iband) + if self.metadata.has_temporal_dimension() and other.metadata.has_temporal_dimension(): + self_lower, self_upper = self.metadata.temporal_dimension.extent + other_lower, other_upper = other.metadata.temporal_dimension.extent + + merged_data.metadata = merged_data.metadata.with_temporal_extent( + (min([self_lower, other_lower]), max([self_upper, other_upper])) # compared lexicographically + ) + return merged_data # TODO legacy alias to be removed