""" Main file for extractions and pre-processing of data through OpenEO """ from enum import Enum from typing import Callable import openeo from openeo_gfmap import BackendContext from openeo_gfmap.spatial import SpatialContext from openeo_gfmap.temporal import TemporalContext class FetchType(Enum): """Enumerates the different types of extraction. There are three types of enumerations. * TILE: Tile based extractions, getting the data for a dense part. The output of such fetching process in a dense DataCube. * POINT: Point based extractions. From a datasets of polygons, gets sparse extractions and performs spatial aggregation on the selected polygons. The output of such fetching process is a VectorCube, that can be used to get a pandas.DataFrame * POLYGON: Patch based extractions, returning a VectorCube of sparsed patches. This can be retrieved as multiple NetCDF files from one job. """ TILE = "tile" POINT = "point" POLYGON = "polygon" class CollectionFetcher: """Base class to fetch a particular collection. Parameters ---------- backend_context: BackendContext Information about the backend in use, useful in certain cases. bands: list List of band names to load from that collection. collection_fetch: Callable Function defining how to fetch a collection for a specific backend, the function accepts the following parameters: connection, spatial extent, temporal extent, bands and additional parameters. collection_preprocessing: Callable Function defining how to harmonize the data of a collection in a backend. For example, this function could rename the bands as they can be different for every backend/collection (SENTINEL2_L2A or SENTINEL2_L2A_SENTINELHUB). Accepts the following parameters: datacube (of pre-fetched collection) and additional parameters. colection_params: dict Additional parameters encoded within a dictionnary that will be passed in the fetch and preprocessing function. """ def __init__( self, backend_context: BackendContext, bands: list, collection_fetch: Callable, collection_preprocessing: Callable, **collection_params, ): self.backend_contect = backend_context self.bands = bands self.fetcher = collection_fetch self.processing = collection_preprocessing self.params = collection_params def get_cube( self, connection: openeo.Connection, spatial_context: SpatialContext, temporal_context: TemporalContext, ) -> openeo.DataCube: """Retrieve a data cube from the given spatial and temporal context. Parameters ---------- connection: openeo.Connection A connection to an OpenEO backend. The backend provided must be the same as the one this extractor class is configured for. spatial_extent: SpatialContext Either a GeoJSON collection on which spatial filtering will be applied or a bounding box with an EPSG code. If a bounding box is provided, no filtering is applied and the entirety of the data is fetched for that region. temporal_extent: TemporalContext The begin and end date of the extraction. """ collection_data = self.fetcher( connection, spatial_context, temporal_context, self.bands, **self.params ) preprocessed_data = self.processing(collection_data, **self.params) return preprocessed_data