diff --git a/openeo/metadata.py b/openeo/metadata.py index 8b7701579..4b48b375c 100644 --- a/openeo/metadata.py +++ b/openeo/metadata.py @@ -298,6 +298,20 @@ def band_names(self) -> List[str]: def band_common_names(self) -> List[str]: return self.band_dimension.common_names + def dimension(self,name:str) -> Dimension: + """ + Get a dimension by name + + :param name: The name of the dimension + :return: The dimension with given name + :raises MetadataException: If no dimension with the given name exists + """ + for dim in self._dimensions: + if dim.name == name: + return dim + raise MetadataException(f"No dimension with name {name!r}, available dimensions: {self.dimension_names()}") + + def get_band_index(self, band: Union[int, str]) -> int: # TODO: eliminate this shortcut for smaller API surface return self.band_dimension.band_index(band) @@ -305,6 +319,7 @@ def get_band_index(self, band: Union[int, str]) -> int: def filter_bands(self, band_names: List[Union[int, str]]) -> CubeMetadata: """ Create new `CubeMetadata` with filtered band dimension + :param band_names: list of band names/indices to keep :return: """ @@ -379,6 +394,11 @@ def add_dimension(self, name: str, label: Union[str, float], type: str = None) - dim = Dimension(type=type or "other", name=name) return self._clone_and_update(dimensions=self._dimensions + [dim]) + def add_dimension(self, dimension: Dimension) -> CubeMetadata: + """Create new CubeMetadata object with added dimension""" + return self._clone_and_update(dimensions=self._dimensions + [dimension]) + + def drop_dimension(self, name: str = None) -> CubeMetadata: """Create new CubeMetadata object without dropped dimension with given name""" dimension_names = self.dimension_names() diff --git a/tests/test_metadata.py b/tests/test_metadata.py index a11bc6aaa..f97525a0a 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -139,6 +139,8 @@ def test_band_dimension_set_labels(): assert metadata.band_dimension.band_names == ["some_name"] assert newdim.band_names == ["1", "2", "3"] + assert metadata.dimension("bs").band_names == ["some_name"] + metadata = CubeMetadata(dimensions=[bdim]) newdim = metadata.rename_labels("bs", target=["1", "2", "3"]).band_dimension assert metadata.band_dimension.band_names == ["some_name"] @@ -679,6 +681,13 @@ def test_cubemetadata_add_temporal_dimension_duplicate(): _ = metadata.add_dimension("date", "2020-05-15", "temporal") +def test_cubemetadata_add_spatial_dimension(): + metadata = CubeMetadata(dimensions=[SpatialDimension(name="x", extent=[4,6])]) + updated = metadata.add_dimension(SpatialDimension(name="y", extent=[51,56])) + + assert ["x"] == metadata.dimension_names() + assert ["x", "y"] == updated.dimension_names() + def test_collectionmetadata_drop_dimension(): metadata = CollectionMetadata( {