Skip to content

Commit ddd2185

Browse files
committed
Issue #705 initial support for "geometry" dimension in CubeMetadata
refs #424
1 parent 354a79e commit ddd2185

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
- Added `show_error_logs` argument to `cube.execute_batch()`/`job.start_and_wait()`/... to toggle the automatic printing of error logs on failure ([#505](https://github.com/Open-EO/openeo-python-client/issues/505))
1313
- Added `Connection.web_editor()` to build link to the openEO backend in the openEO Web Editor
1414
- Add support for `log_level` in `create_job()` and `execute_job()` ([#704](https://github.com/Open-EO/openeo-python-client/issues/704))
15+
- Add initial support for "geometry" dimension type in `CubeMetadata` ([#705](https://github.com/Open-EO/openeo-python-client/issues/705))
1516

1617
### Changed
1718

openeo/metadata.py

+27-2
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,19 @@ def rename_labels(self, target, source) -> Dimension:
213213
def rename(self, name) -> Dimension:
214214
return BandDimension(name=name, bands=self.bands)
215215

216+
217+
class GeometryDimension(Dimension):
218+
# TODO: how to model/store labels of geometry dimension?
219+
def __init__(self, name: str):
220+
super().__init__(name=name, type="geometry")
221+
222+
def rename(self, name) -> Dimension:
223+
return GeometryDimension(name=name)
224+
225+
def rename_labels(self, target, source) -> Dimension:
226+
return GeometryDimension(name=self.name)
227+
228+
216229
class CubeMetadata:
217230
"""
218231
Interface for metadata of a data cube.
@@ -229,7 +242,7 @@ def __init__(self, dimensions: Optional[List[Dimension]] = None):
229242
if dimensions is not None:
230243
for dim in self._dimensions:
231244
# TODO: here we blindly pick last bands or temporal dimension if multiple. Let user choose?
232-
# TODO: add spacial dimension handling?
245+
# TODO: add spatial dimension handling?
233246
if dim.type == "bands":
234247
if isinstance(dim, BandDimension):
235248
self._band_dimension = dim
@@ -284,6 +297,16 @@ def temporal_dimension(self) -> TemporalDimension:
284297
def spatial_dimensions(self) -> List[SpatialDimension]:
285298
return [d for d in self._dimensions if isinstance(d, SpatialDimension)]
286299

300+
def has_geometry_dimension(self):
301+
return any(isinstance(d, GeometryDimension) for d in self._dimensions)
302+
303+
@property
304+
def geometry_dimension(self) -> GeometryDimension:
305+
for d in self._dimensions:
306+
if isinstance(d, GeometryDimension):
307+
return d
308+
raise MetadataException("No geometry dimension")
309+
287310
@property
288311
def bands(self) -> List[Band]:
289312
"""Get band metadata as list of Band metadata tuples"""
@@ -365,7 +388,7 @@ def reduce_spatial(self) -> CubeMetadata:
365388
dimensions = [d for d in self._dimensions if not isinstance(d, SpatialDimension)]
366389
return self._clone_and_update(dimensions=dimensions)
367390

368-
def add_dimension(self, name: str, label: Union[str, float], type: str = None) -> CubeMetadata:
391+
def add_dimension(self, name: str, label: Union[str, float], type: Optional[str] = None) -> CubeMetadata:
369392
"""Create new CubeMetadata object with added dimension"""
370393
if any(d.name == name for d in self._dimensions):
371394
raise DimensionAlreadyExistsException(f"Dimension with name {name!r} already exists")
@@ -375,6 +398,8 @@ def add_dimension(self, name: str, label: Union[str, float], type: str = None) -
375398
dim = SpatialDimension(name=name, extent=[label, label])
376399
elif type == "temporal":
377400
dim = TemporalDimension(name=name, extent=[label, label])
401+
elif type == "geometry":
402+
dim = GeometryDimension(name=name)
378403
else:
379404
dim = Dimension(type=type or "other", name=name)
380405
return self._clone_and_update(dimensions=self._dimensions + [dim])

tests/test_metadata.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ def test_collectionmetadata_add_band_dimension_duplicate():
632632
_ = metadata.add_dimension("layer", "red", "bands")
633633

634634

635-
def test_cubemetadata_add_band_dimension_dublicate():
635+
def test_cubemetadata_add_band_dimension_duplicate():
636636
metadata = CubeMetadata(dimensions=[TemporalDimension(name="t", extent=None)])
637637
metadata = metadata.add_dimension("layer", "red", "bands")
638638
with pytest.raises(DimensionAlreadyExistsException, match="Dimension with name 'layer' already exists"):
@@ -679,6 +679,20 @@ def test_cubemetadata_add_temporal_dimension_duplicate():
679679
_ = metadata.add_dimension("date", "2020-05-15", "temporal")
680680

681681

682+
def test_cube_metadata_add_dimension_geometry():
683+
orig = CubeMetadata(dimensions=[TemporalDimension(name="t", extent=None)])
684+
new = orig.add_dimension(name="fields", label="Mol", type="geometry")
685+
686+
assert orig.dimension_names() == ["t"]
687+
assert not orig.has_geometry_dimension()
688+
with pytest.raises(MetadataException):
689+
orig.geometry_dimension()
690+
691+
assert new.dimension_names() == ["t", "fields"]
692+
assert new.has_geometry_dimension()
693+
assert new.geometry_dimension.name == "fields"
694+
assert new.geometry_dimension.type == "geometry"
695+
682696
def test_collectionmetadata_drop_dimension():
683697
metadata = CollectionMetadata(
684698
{

0 commit comments

Comments
 (0)