From b79bc2cf1806d994cbb790958a15fd649dda1891 Mon Sep 17 00:00:00 2001 From: Stefaan Lippens Date: Fri, 24 Mar 2023 17:33:11 +0100 Subject: [PATCH] Use BoundingBox to simplify load_result logic related to Open-EO/openeo-aggregator#95 --- openeogeotrellis/backend.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/openeogeotrellis/backend.py b/openeogeotrellis/backend.py index 068884882..7323863ab 100644 --- a/openeogeotrellis/backend.py +++ b/openeogeotrellis/backend.py @@ -30,7 +30,7 @@ from pyspark import SparkContext from pyspark.mllib.tree import RandomForestModel from pyspark.version import __version__ as pysparkversion -from pystac import Collection +import pystac from shapely.geometry import box, Polygon from openeo.internal.process_graph_visitor import ProcessGraphVisitor @@ -49,6 +49,7 @@ from openeo_driver.jobregistry import ElasticJobRegistry, JOB_STATUS, DEPENDENCY_STATUS from openeo_driver.save_result import ImageCollectionResult from openeo_driver.users import User +from openeo_driver.util.geometry import BoundingBox from openeo_driver.util.logging import ( FlaskRequestCorrelationIdLogging, FlaskUserIdLogging, @@ -564,17 +565,19 @@ def load_result(self, job_id: str, user_id: Optional[str], load_params: LoadPara env: EvalEnv) -> GeopysparkDataCube: logger.info("load_result from job ID {j!r} with load params {p!r}".format(j=job_id, p=load_params)) + requested_bbox = BoundingBox.from_dict_or_none( + load_params.spatial_extent, default_crs="EPSG:4326" + ) spatial_extent = load_params.spatial_extent west = spatial_extent.get("west", None) east = spatial_extent.get("east", None) north = spatial_extent.get("north", None) south = spatial_extent.get("south", None) crs = spatial_extent.get("crs", None) - spatial_bounds_present = all(b is not None for b in [west, south, east, north]) if job_id.startswith("http://") or job_id.startswith("https://"): job_results_canonical_url = job_id - job_results = Collection.from_file(href=job_results_canonical_url) + job_results = pystac.Collection.from_file(href=job_results_canonical_url) def reproject(bbox: List[float], crs_from, crs_to) -> List[float]: from pyproj import Transformer @@ -584,14 +587,13 @@ def reproject(bbox: List[float], crs_from, crs_to) -> List[float]: return [xmin, ymin, xmax, ymax] def intersects_spatial_extent(item) -> bool: - if not spatial_bounds_present or item.bbox is None: + if not requested_bbox or item.bbox is None: return True - spatial_extent_epsg4326 = reproject([west, south, east, north], - crs_from=crs or "EPSG:4326", - crs_to="EPSG:4326") - - return Polygon.from_bounds(*spatial_extent_epsg4326).intersects(Polygon.from_bounds(*item.bbox)) + requested_bbox_lonlat = requested_bbox.reproject("EPSG:4326") + return requested_bbox_lonlat.as_polygon().intersects( + Polygon.from_bounds(*item.bbox) + ) uris_with_metadata = {asset.get_absolute_href(): (item.datetime.isoformat(), asset.extra_fields.get("eo:bands", [])) @@ -675,8 +677,8 @@ def load_spatial_bounds_from_job_info(): if single_level: existing_bbox, existing_epsg = load_spatial_bounds() - if spatial_bounds_present: - extent = jvm.geotrellis.vector.Extent(float(west), float(south), float(east), float(north)) + if requested_bbox: + extent = jvm.geotrellis.vector.Extent(*requested_bbox.as_wsen_tuple()) else: extent = jvm.geotrellis.vector.Extent(*[float(value) for value in existing_bbox]) crs = "EPSG:4326" @@ -693,8 +695,11 @@ def load_spatial_bounds_from_job_info(): pyramid = pyramid_factory.datacube_seq(projected_polygons, from_date, to_date, metadata_properties, correlation_id, data_cube_parameters) else: - extent = (jvm.geotrellis.vector.Extent(float(west), float(south), float(east), float(north)) - if spatial_bounds_present else None) + extent = ( + jvm.geotrellis.vector.Extent(*requested_bbox.as_wsen_tuple()) + if requested_bbox + else None + ) pyramid = pyramid_factory.pyramid_seq(extent, crs, from_date, to_date)