- "udf": "\"\"\"\nImport the biopar library and the BioParNp class to calculate the FAPAR index.\nIt is the Python implementation of biophyscial parameter computation, \nas described here: http://step.esa.int/docs/extra/ATBD_S2ToolBox_L2B_V1.1.pdf\n\"\"\"\nfrom functools import lru_cache\nimport numpy as np\nfrom typing import Dict\nfrom numpy import cos, radians\n\nfrom openeo.udf.xarraydatacube import XarrayDataCube\nfrom biopar.bioparnp import BioParNp\n\n\n@lru_cache(maxsize=6)\ndef get_bioparrun(biopar) -> BioParNp:\n return BioParNp(version='3band', parameter=biopar, singleConfig = True)\n \n\ndef apply_datacube(cube: XarrayDataCube, context: Dict) -> XarrayDataCube:\n ds_date = cube.get_array()\n\n ### LOAD THE DIFFERENT REQUIRED BANDS FOR THE 8-BAND FAPAR\n scaling_bands = 0.0001\n\n saa = ds_date.sel(bands='sunAzimuthAngles')\n sza = ds_date.sel(bands=\"sunZenithAngles\")\n vaa = ds_date.sel(bands=\"viewAzimuthMean\")\n vza = ds_date.sel(bands=\"viewZenithMean\")\n\n B03 = ds_date.sel(bands='B03') * scaling_bands\n B04 = ds_date.sel(bands='B04') * scaling_bands\n B8 = ds_date.sel(bands='B08') * scaling_bands\n\n g1 = cos(radians(vza))\n g2 = cos(radians(sza))\n g3 = cos(radians(saa - vaa))\n\n #### FLATTEN THE ARRAY ####\n flat = list(map(lambda arr: arr.flatten(),\n [B03.values, B04.values, B8.values, g1.values, g2.values, g3.values]))\n bands = np.array(flat)\n\n #### CALCULATE THE BIOPAR BASED ON THE BANDS #####\n \n image = get_bioparrun('FAPAR').run(bands,\n output_scale=1,\n output_dtype=np.float32,\n minmax_flagging=False) # netcdf algorithm\n as_image = image.reshape((g1.shape))\n\n ## SET NOTDATA TO NAN\n as_image[np.where(np.isnan(B03))] = np.nan\n xr_biopar = vza.copy()\n xr_biopar.values = as_image\n return XarrayDataCube(xr_biopar)"
0 commit comments