diff --git a/openeo_driver/delayed_vector.py b/openeo_driver/delayed_vector.py index f4a4abe5..4524768f 100644 --- a/openeo_driver/delayed_vector.py +++ b/openeo_driver/delayed_vector.py @@ -321,6 +321,6 @@ def _read_geojson_crs(geojson: Dict) -> pyproj.CRS: crs = geojson.get("crs", {}).get("properties", {}).get("name") return pyproj.CRS("epsg:4326") if crs is None else pyproj.CRS(crs) - def to_driver_vector_cube(self): + def to_driver_vector_cube(self) -> DriverVectorCube: gdf = self.as_geodataframe() return DriverVectorCube.from_geodataframe(gdf, dimension_name="bands") diff --git a/openeo_driver/save_result.py b/openeo_driver/save_result.py index cfab273b..e92b56a6 100644 --- a/openeo_driver/save_result.py +++ b/openeo_driver/save_result.py @@ -26,6 +26,8 @@ import xarray from openeo.metadata import CollectionMetadata +from typeguard import typechecked + from openeo_driver.datacube import DriverDataCube, DriverVectorCube, DriverMlModel from openeo_driver.datastructs import StacAsset from openeo_driver.delayed_vector import DelayedVector @@ -299,12 +301,12 @@ class AggregatePolygonResult(JSONResult): # TODO: if it supports NetCDF and CSV """ # TODO #71 #114 EP-3981 port this to proper vector cube support - + @typechecked def __init__( self, - timeseries: Dict[int, List[List[Any]]], + timeseries: Optional[Dict[str, List[List[Any]]]], regions: Union[GeometryCollection, DriverVectorCube], - metadata: CollectionMetadata = None, + metadata: Optional[CollectionMetadata] = None, ): """ :param timeseries: {timestamp: [geometries, bands]} @@ -1010,7 +1012,7 @@ def to_save_result(data: Any, format: Optional[str] = None, options: Optional[di return JSONResult(data.geojson, format="geojson", options=options) else: data = data.to_driver_vector_cube() - elif isinstance(data, DriverDataCube): + if isinstance(data, DriverDataCube): return ImageCollectionResult(data, format=format, options=options) elif isinstance(data, DriverVectorCube): return VectorCubeResult(cube=data, format=format, options=options) diff --git a/setup.py b/setup.py index a6ef418f..b4f4897d 100644 --- a/setup.py +++ b/setup.py @@ -30,6 +30,7 @@ "pyarrow>=10.0.0", "jsonschema", "dirty-equals>=0.6", + "typeguard", ] typing_require = [ diff --git a/tests/test_save_result_parquet.py b/tests/test_save_result_parquet.py index ae1a1d48..a2ff1da9 100644 --- a/tests/test_save_result_parquet.py +++ b/tests/test_save_result_parquet.py @@ -1,7 +1,8 @@ import pytest from openeo_driver.datacube import DriverVectorCube -from openeo_driver.save_result import AggregatePolygonSpatialResult +from openeo_driver.delayed_vector import DelayedVector +from openeo_driver.save_result import AggregatePolygonSpatialResult, to_save_result, VectorCubeResult from .data import get_path import geopandas as gpd @@ -48,3 +49,12 @@ def test_write_driver_vector_cube_to_parquet(tmp_path): vector_cube.write_assets(tmp_path / "dummy", format="Parquet") assert gpd.read_parquet(tmp_path / "vectorcube.parquet").shape == (2, 3) + + +def test_write_delayed_vector_cube_to_parquet(tmp_path): + dv = DelayedVector(str(get_path("geojson/FeatureCollection02.json"))) + vector_cube = to_save_result(dv, format="parquet") + assert isinstance(vector_cube, VectorCubeResult) + vector_cube.write_assets(tmp_path / "dummy") + # TODO: Why are id and pop columns missing here? + assert gpd.read_parquet(tmp_path / "vectorcube.parquet").shape == (2, 1)