Skip to content

Commit c862e1b

Browse files
committed
Issue #114/#211/#197 vector cube apply_dimension: put results in cube (too)
1 parent 463afba commit c862e1b

File tree

4 files changed

+67
-10
lines changed

4 files changed

+67
-10
lines changed

openeo_driver/_version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.61.1a1"
1+
__version__ = "0.61.2a1"

openeo_driver/datacube.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ def apply_dimension(
676676
raise ValueError(
677677
f"UDF should return single feature collection but got {result_features and len(result_features)}"
678678
)
679-
return DriverVectorCube(geometries=result_features[0].data)
679+
return DriverVectorCube.from_geodataframe(result_features[0].data)
680680

681681
raise FeatureUnsupportedException(
682682
message=f"DriverVectorCube.apply_dimension with {dimension=} and {bool(single_run_udf)=}"

tests/test_vectorcube.py

+61-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from openeo_driver.datacube import DriverVectorCube
1212
from openeo_driver.errors import OpenEOApiException
13-
from openeo_driver.testing import ApproxGeometry, DictSubSet, IsNan
13+
from openeo_driver.testing import ApproxGeometry, DictSubSet, IsNan, ApproxGeoJSONByBounds
1414
from openeo_driver.util.geometry import as_geojson_feature_collection
1515
from openeo_driver.utils import EvalEnv
1616

@@ -808,7 +808,7 @@ def test_apply_dimension_run_udf_change_geometry(self, gdf, backend_implementati
808808
udf = textwrap.dedent(
809809
"""
810810
from openeo.udf import UdfData, FeatureCollection
811-
def process_geometries(udf_data: UdfData) -> UdfData:
811+
def process_vector_cube(udf_data: UdfData) -> UdfData:
812812
[feature_collection] = udf_data.get_feature_collection_list()
813813
gdf = feature_collection.data
814814
gdf["geometry"] = gdf["geometry"].buffer(distance=1, resolution=2)
@@ -850,3 +850,62 @@ def process_geometries(udf_data: UdfData) -> UdfData:
850850
],
851851
}
852852
)
853+
854+
@pytest.mark.parametrize("dimension", ["bands", "properties"])
855+
def test_apply_dimension_run_udf_add_properties(self, gdf, backend_implementation, dimension):
856+
vc = DriverVectorCube.from_geodataframe(gdf, dimension_name=dimension)
857+
udf = textwrap.dedent(
858+
"""
859+
from openeo.udf import UdfData, FeatureCollection
860+
def process_vector_cube(udf_data: UdfData) -> UdfData:
861+
[feature_collection] = udf_data.get_feature_collection_list()
862+
gdf = feature_collection.data
863+
gdf["popone"] = gdf["pop"] + 1
864+
gdf["poppop"] = gdf["pop"] ** 2
865+
udf_data.set_feature_collection_list([
866+
FeatureCollection(id="_", data=gdf),
867+
])
868+
"""
869+
)
870+
callback = {
871+
"runudf1": {
872+
"process_id": "run_udf",
873+
"arguments": {"data": {"from_parameter": "data"}, "udf": udf, "runtime": "Python"},
874+
"result": True,
875+
}
876+
}
877+
env = EvalEnv({"backend_implementation": backend_implementation})
878+
result = vc.apply_dimension(process=callback, dimension=dimension, env=env)
879+
assert isinstance(result, DriverVectorCube)
880+
assert result.to_internal_json() == {
881+
"geometries": {
882+
"type": "FeatureCollection",
883+
"features": [
884+
{
885+
"type": "Feature",
886+
"geometry": ApproxGeoJSONByBounds(1, 1, 3, 3, types=["Polygon"], abs=0.01),
887+
"id": "0",
888+
"properties": {"id": "first", "pop": 1234, "popone": 1235, "poppop": 1522756},
889+
"bbox": pytest.approx((1, 1, 3, 3), abs=0.01),
890+
},
891+
{
892+
"type": "Feature",
893+
"geometry": ApproxGeoJSONByBounds(3, 2, 5, 4, types=["Polygon"], abs=0.01),
894+
"id": "1",
895+
"properties": {"id": "second", "pop": 5678, "popone": 5679, "poppop": 32239684},
896+
"bbox": pytest.approx((3, 2, 5, 4), abs=0.01),
897+
},
898+
],
899+
"bbox": pytest.approx((1, 1, 5, 4), abs=0.01),
900+
},
901+
"cube": {
902+
"name": None,
903+
"dims": ("geometries", "properties"),
904+
"coords": {
905+
"geometries": {"attrs": {}, "data": [0, 1], "dims": ("geometries",)},
906+
"properties": {"attrs": {}, "data": ["pop", "popone", "poppop"], "dims": ("properties",)},
907+
},
908+
"data": [[1234, 1235, 1522756], [5678, 5679, 32239684]],
909+
"attrs": {},
910+
},
911+
}

tests/test_views_execute.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -3763,7 +3763,7 @@ def test_apply_dimension_run_udf_change_geometry(self, api100, dimension):
37633763
"process": self._build_run_udf_callback(
37643764
"""
37653765
from openeo.udf import UdfData, FeatureCollection
3766-
def process_geometries(udf_data: UdfData) -> UdfData:
3766+
def process_vector_cube(udf_data: UdfData) -> UdfData:
37673767
[feature_collection] = udf_data.get_feature_collection_list()
37683768
gdf = feature_collection.data
37693769
gdf["geometry"] = gdf["geometry"].buffer(distance=1, resolution=2)
@@ -3827,7 +3827,7 @@ def test_apply_dimension_run_udf_filter_on_geometries(self, api100, dimension):
38273827
"""
38283828
from openeo.udf import UdfData, FeatureCollection
38293829
import shapely.geometry
3830-
def process_geometries(udf_data: UdfData) -> UdfData:
3830+
def process_vector_cube(udf_data: UdfData) -> UdfData:
38313831
[feature_collection] = udf_data.get_feature_collection_list()
38323832
gdf = feature_collection.data
38333833
to_intersect = shapely.geometry.box(4, 3, 8, 4)
@@ -3896,8 +3896,7 @@ def test_apply_dimension_run_udf_filter_on_properties(self, api100, dimension):
38963896
"process": self._build_run_udf_callback(
38973897
"""
38983898
from openeo.udf import UdfData, FeatureCollection
3899-
import shapely.geometry
3900-
def process_geometries(udf_data: UdfData) -> UdfData:
3899+
def process_vector_cube(udf_data: UdfData) -> UdfData:
39013900
[feature_collection] = udf_data.get_feature_collection_list()
39023901
gdf = feature_collection.data
39033902
gdf = gdf[gdf["pop"] > 500]
@@ -3959,8 +3958,7 @@ def test_apply_dimension_run_udf_add_properties(self, api100, dimension):
39593958
"process": self._build_run_udf_callback(
39603959
"""
39613960
from openeo.udf import UdfData, FeatureCollection
3962-
import shapely.geometry
3963-
def process_geometries(udf_data: UdfData) -> UdfData:
3961+
def process_vector_cube(udf_data: UdfData) -> UdfData:
39643962
[feature_collection] = udf_data.get_feature_collection_list()
39653963
gdf = feature_collection.data
39663964
gdf["poppop"] = gdf["pop"] ** 2

0 commit comments

Comments
 (0)