From 9bdabdfec8924cc553887ac025a3fdf134120175 Mon Sep 17 00:00:00 2001 From: ValentinaHutter <85164505+ValentinaHutter@users.noreply.github.com> Date: Fri, 5 Apr 2024 11:25:51 +0200 Subject: [PATCH 1/6] allow crs in aggregate_spatial as int, str --- .../process_implementations/cubes/aggregate.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/openeo_processes_dask/process_implementations/cubes/aggregate.py b/openeo_processes_dask/process_implementations/cubes/aggregate.py index 5bc28b4f..3c2807b9 100644 --- a/openeo_processes_dask/process_implementations/cubes/aggregate.py +++ b/openeo_processes_dask/process_implementations/cubes/aggregate.py @@ -135,10 +135,15 @@ def aggregate_spatial( if "properties" not in feature: feature["properties"] = {} elif feature["properties"] is None: - feature["properties"] = {} - DEFAULT_CRS = ( - geometries.get("crs", {}).get("properties", {}).get("name", DEFAULT_CRS) - ) + feature["properties"] = {} + if isinstance(geometries.get("crs", {}), dict): + DEFAULT_CRS = ( + geometries.get("crs", {}).get("properties", {}).get("name", DEFAULT_CRS) + ) + else: + DEFAULT_CRS = int(geometries.get("crs", {})) + logger.info(f"CRS in geometries: {DEFAULT_CRS}.") + if "type" in geometries and geometries["type"] == "FeatureCollection": gdf = gpd.GeoDataFrame.from_features(geometries, crs=DEFAULT_CRS) elif "type" in geometries and geometries["type"] in ["Polygon"]: From 7b55b5b22ad1398c606666e7459b28f0ae9fa4b9 Mon Sep 17 00:00:00 2001 From: ValentinaHutter <85164505+ValentinaHutter@users.noreply.github.com> Date: Fri, 5 Apr 2024 11:32:16 +0200 Subject: [PATCH 2/6] add test for crs int --- tests/test_aggregate.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_aggregate.py b/tests/test_aggregate.py index b1d7c8d2..037b91a3 100644 --- a/tests/test_aggregate.py +++ b/tests/test_aggregate.py @@ -148,6 +148,14 @@ def test_aggregate_spatial( assert (output_cube.values == expected_values).all() + polygon_geometry_small["crs"] = 4326 + + output_cube = aggregate_spatial( + data=reduced_cube, geometries=polygon_geometry_small, reducer=reducer + ) + + assert len(output_cube.dims) < len(reduced_cube.dims) + geometry_url = "https://raw.githubusercontent.com/ValentinaHutter/polygons/master/polygons_small.json" output_cube = aggregate_spatial( data=reduced_cube, geometries=geometry_url, reducer=reducer From 0d53be35c65f4859c1b6a185debc46f1956391f0 Mon Sep 17 00:00:00 2001 From: ValentinaHutter Date: Fri, 5 Apr 2024 11:41:37 +0200 Subject: [PATCH 3/6] pre-commit --- .../process_implementations/cubes/aggregate.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/openeo_processes_dask/process_implementations/cubes/aggregate.py b/openeo_processes_dask/process_implementations/cubes/aggregate.py index 3c2807b9..6e0c5539 100644 --- a/openeo_processes_dask/process_implementations/cubes/aggregate.py +++ b/openeo_processes_dask/process_implementations/cubes/aggregate.py @@ -135,15 +135,17 @@ def aggregate_spatial( if "properties" not in feature: feature["properties"] = {} elif feature["properties"] is None: - feature["properties"] = {} + feature["properties"] = {} if isinstance(geometries.get("crs", {}), dict): DEFAULT_CRS = ( - geometries.get("crs", {}).get("properties", {}).get("name", DEFAULT_CRS) + geometries.get("crs", {}) + .get("properties", {}) + .get("name", DEFAULT_CRS) ) else: DEFAULT_CRS = int(geometries.get("crs", {})) logger.info(f"CRS in geometries: {DEFAULT_CRS}.") - + if "type" in geometries and geometries["type"] == "FeatureCollection": gdf = gpd.GeoDataFrame.from_features(geometries, crs=DEFAULT_CRS) elif "type" in geometries and geometries["type"] in ["Polygon"]: From d47b2da8cce6320fdea345672f3442a73d253a21 Mon Sep 17 00:00:00 2001 From: ValentinaHutter Date: Mon, 15 Apr 2024 11:18:56 +0200 Subject: [PATCH 4/6] update input geometry types --- .../cubes/aggregate.py | 8 ++++++++ openeo_processes_dask/specs/openeo-processes | 2 +- tests/test_aggregate.py | 20 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/openeo_processes_dask/process_implementations/cubes/aggregate.py b/openeo_processes_dask/process_implementations/cubes/aggregate.py index 6e0c5539..3af1d0d0 100644 --- a/openeo_processes_dask/process_implementations/cubes/aggregate.py +++ b/openeo_processes_dask/process_implementations/cubes/aggregate.py @@ -153,6 +153,14 @@ def aggregate_spatial( gdf = gpd.GeoDataFrame(geometry=[polygon]) gdf.crs = DEFAULT_CRS + if isinstance(geometries, xr.Dataset): + if hasattr(geometries, "xvec"): + gdf = geometries.xvec.to_geodataframe() + + if isinstance(geometries, gpd.GeoDataFrame): + gdf = geometries + + gdf = gdf.to_crs(data.rio.crs) geometries = gdf.geometry.values positional_parameters = {"data": 0} diff --git a/openeo_processes_dask/specs/openeo-processes b/openeo_processes_dask/specs/openeo-processes index ea3d202a..e5902f2e 160000 --- a/openeo_processes_dask/specs/openeo-processes +++ b/openeo_processes_dask/specs/openeo-processes @@ -1 +1 @@ -Subproject commit ea3d202a43e966c8524b524efc1a283e3b15a2df +Subproject commit e5902f2ebe4d3f2b7cadee256b0bdbbb02e60918 diff --git a/tests/test_aggregate.py b/tests/test_aggregate.py index 037b91a3..6faf1c82 100644 --- a/tests/test_aggregate.py +++ b/tests/test_aggregate.py @@ -3,6 +3,8 @@ import geopandas as gpd import numpy as np import pytest +import xarray as xr +import xvec from openeo_pg_parser_networkx.pg_schema import ParameterReference, TemporalInterval from openeo_processes_dask.process_implementations.cubes.aggregate import ( @@ -148,6 +150,24 @@ def test_aggregate_spatial( assert (output_cube.values == expected_values).all() + gdf = gpd.GeoDataFrame.from_features(polygon_geometry_small, crs="EPSG:4326") + gdf_equi7 = gdf.to_crs( + "+proj=aeqd +lat_0=53 +lon_0=24 +x_0=5837287.81977 +y_0=2121415.69617 +datum=WGS84 +units=m +no_defs" + ) + output_cube_transform = aggregate_spatial( + data=reduced_cube, geometries=gdf_equi7, reducer=reducer + ) + assert len(output_cube_transform.dims) == len(output_cube.dims) + assert output_cube_transform.shape == output_cube.shape + + cube = xr.Dataset( + data_vars={ + "variable": (["geometry"], np.arange(len(gdf))) + }, + coords={"geometry": gdf["geometry"].values}, + ).xvec.set_geom_indexes("geometry", crs=gdf.crs) + + polygon_geometry_small["crs"] = 4326 output_cube = aggregate_spatial( From 2c254205248edd2a11457f3f3368d2f5adda54fc Mon Sep 17 00:00:00 2001 From: ValentinaHutter Date: Mon, 15 Apr 2024 11:23:39 +0200 Subject: [PATCH 5/6] update input geometry types --- tests/test_aggregate.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_aggregate.py b/tests/test_aggregate.py index 6faf1c82..edd08bc0 100644 --- a/tests/test_aggregate.py +++ b/tests/test_aggregate.py @@ -160,12 +160,17 @@ def test_aggregate_spatial( assert len(output_cube_transform.dims) == len(output_cube.dims) assert output_cube_transform.shape == output_cube.shape - cube = xr.Dataset( + geometry_cube = xr.Dataset( data_vars={ "variable": (["geometry"], np.arange(len(gdf))) }, coords={"geometry": gdf["geometry"].values}, ).xvec.set_geom_indexes("geometry", crs=gdf.crs) + output_cube_transform = aggregate_spatial( + data=reduced_cube, geometries=geometry_cube, reducer=reducer + ) + assert len(output_cube_transform.dims) == len(output_cube.dims) + assert output_cube_transform.shape == output_cube.shape polygon_geometry_small["crs"] = 4326 From 32de8b862f006db41233214cc155eeb386e6dae0 Mon Sep 17 00:00:00 2001 From: ValentinaHutter Date: Mon, 15 Apr 2024 11:25:22 +0200 Subject: [PATCH 6/6] run pre commit --- tests/test_aggregate.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/test_aggregate.py b/tests/test_aggregate.py index edd08bc0..5ed18bb4 100644 --- a/tests/test_aggregate.py +++ b/tests/test_aggregate.py @@ -161,9 +161,7 @@ def test_aggregate_spatial( assert output_cube_transform.shape == output_cube.shape geometry_cube = xr.Dataset( - data_vars={ - "variable": (["geometry"], np.arange(len(gdf))) - }, + data_vars={"variable": (["geometry"], np.arange(len(gdf)))}, coords={"geometry": gdf["geometry"].values}, ).xvec.set_geom_indexes("geometry", crs=gdf.crs) output_cube_transform = aggregate_spatial( @@ -172,7 +170,6 @@ def test_aggregate_spatial( assert len(output_cube_transform.dims) == len(output_cube.dims) assert output_cube_transform.shape == output_cube.shape - polygon_geometry_small["crs"] = 4326 output_cube = aggregate_spatial(