diff --git a/404.html b/404.html index 57ff87bfe..7ad002a31 100644 --- a/404.html +++ b/404.html @@ -8,13 +8,13 @@ - + -

404

There's nothing here.
+ - + diff --git a/api/index.html b/api/index.html index ce4a45b41..edbfa8eb5 100644 --- a/api/index.html +++ b/api/index.html @@ -8,7 +8,7 @@ - + @@ -165,6 +165,6 @@
- + diff --git a/assets/js/37.5740e8ce.js b/assets/js/37.58eb9300.js similarity index 98% rename from assets/js/37.5740e8ce.js rename to assets/js/37.58eb9300.js index 8c8f3a2c3..ffe870c3d 100644 --- a/assets/js/37.5740e8ce.js +++ b/assets/js/37.58eb9300.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{352:function(e,t,a){e.exports=a.p+"assets/img/score.e247f05c.png"},353:function(e,t,a){e.exports=a.p+"assets/img/PG_prediction.405498a8.png"},354:function(e,t,a){e.exports=a.p+"assets/img/Predicted_FCC.7e4f40fe.png"},355:function(e,t,a){e.exports=a.p+"assets/img/Validation.e5a7edd6.png"},586:function(e,t,a){"use strict";a.r(t);var r=a(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"fractional-canopy-cover"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fractional-canopy-cover"}},[e._v("#")]),e._v(" Fractional Canopy Cover")]),e._v(" "),t("p",[e._v("Forests play an essential role in our ecosystem and getting a quantitative measurement on the forest cover is essential for various applications. From understanding ecosystem health, biomass estimation, and monitoring changes over time due to factors like climate change or land use. Higher canopy covers regard for dense forests or other complex ecosystems while lower canopy cover means the presence of grasslands and less sparse vegetation. Getting a percentage of forest cover is also useful in controlling soil erosion to carbon sequestration which serves as an important factor in understanding and mitigating climate change.")]),e._v(" "),t("p",[e._v("Given all these uses, having an accurate percentage of the forest cover is imperial in different studies. The objective of this use case was to derive the fractional canopy cover (FCC) using Sentinel-1 and Sentinel-2 in a random forest regression approach from very high-resolution (VHR) data acquired from the Planet Scope satellite constellation. This was done for an area with different forest types spreading throughout central Europe around the Alps as defined by the Eusropean Strategy for Alpine Regions (EUSALP).")]),e._v(" "),t("h2",{attrs:{id:"data-preparation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-preparation"}},[e._v("#")]),e._v(" Data Preparation")]),e._v(" "),t("p",[e._v("As VHR commercial data from Planet was used for the training of the model, a stratification scheme was devised for getting the maximum coverage throughout the study area. Additional data which included Copernicus Forest High-Resolution Layers (HRL, https://land.copernicus.eu/pan-european/high-resolution-layers/forests) of “Forest Type” and “Forest Cover Density” as well as the CORINE Land Cover were used to find suitable subsets within the study area to derive the target variable from the VHR data. The study area was divided into 40,000 potential test sites, which were sub-sequentially analyzed based on the amount of forest, its density, tree dominance as well as the land cover classes. Therefore, five different score criteria were introduced for each potential test site. These are shown below in Figure 1.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(352),alt:"Scoring method"}}),e._v(" "),t("figcaption",[e._v("Figure 1: Scoring based on the scoring criterion \n ")])]),e._v(" "),t("p",[e._v("Based on the maximum scores within each cell Planet data was ordered for the 300 highest-scoring areas and then using these tiles, forest masks were created. 3 masks were generated from this VHR dataset including evergreen, deciduous, and mixed forests based on various thresholds of NDVI values. Finally, these masks were summed together and then resampled to 60 meters to be compatible with Sentinel 1 and 2.")]),e._v(" "),t("h2",{attrs:{id:"model-training"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-training"}},[e._v("#")]),e._v(" Model training")]),e._v(" "),t("p",[e._v("The Forest masks extracted from the VHR data were vectorized to polygons which were then used as training points for the random forest regression model. The model's predictors are the Sentinel-2 Bands 02, 03, 04 and 08 representing Blue/Green/Red/NIR and the Sigma0 Sentinel-1 VV and VH polarizations.")]),e._v(" "),t("p",[e._v("The trained model can be stored for further jobs in different regions within the interest area. In Figure 2 below a process graph is shown where the trained model is applied on the predictors mentioned above.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(353),alt:"Scoring method"}}),e._v(" "),t("figcaption",[e._v("Figure 2: Process graph showing the prediction of Fractional Canopy Cover with Sentinel-1 and Sentinel-2 \n ")])]),e._v(" "),t("h2",{attrs:{id:"predicted-fractional-canopy-cover"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#predicted-fractional-canopy-cover"}},[e._v("#")]),e._v(" Predicted Fractional Canopy Cover")]),e._v(" "),t("p",[e._v("In the fit_regr_random_forest process, the actual regression calculation is taking place. Based on the random forest implementation a model is created to predict the target variable. The fitting is done in a standard machine learning approach with 70% of the polygons whereas 30% of the polygons are used for the evaluation of the model.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(354),alt:"Scoring method"}}),e._v(" "),t("figcaption",[e._v("Figure 3: Predicted Fractional Canopy Cover for part of the study area \n ")])]),e._v(" "),t("h2",{attrs:{id:"validation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#validation"}},[e._v("#")]),e._v(" Validation")]),e._v(" "),t("p",[e._v("Polygons were separated in the initial stage of the project for the validation. 512 polygons with 36 pixels each corresponding to the HRL tree density layer were used for the validation task. The comparison showed a correlation of 0.76 summarised in the plot below in Figure 4.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(355),alt:"Scoring method"}}),e._v(" "),t("figcaption",[e._v("Figure 4: Correlation plot with HRL tree density polygons\n ")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{352:function(e,t,a){e.exports=a.p+"assets/img/score.e247f05c.png"},353:function(e,t,a){e.exports=a.p+"assets/img/PG_prediction.405498a8.png"},354:function(e,t,a){e.exports=a.p+"assets/img/Predicted_FCC.7e4f40fe.png"},355:function(e,t,a){e.exports=a.p+"assets/img/Validation.e5a7edd6.png"},585:function(e,t,a){"use strict";a.r(t);var r=a(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"fractional-canopy-cover"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fractional-canopy-cover"}},[e._v("#")]),e._v(" Fractional Canopy Cover")]),e._v(" "),t("p",[e._v("Forests play an essential role in our ecosystem and getting a quantitative measurement on the forest cover is essential for various applications. From understanding ecosystem health, biomass estimation, and monitoring changes over time due to factors like climate change or land use. Higher canopy covers regard for dense forests or other complex ecosystems while lower canopy cover means the presence of grasslands and less sparse vegetation. Getting a percentage of forest cover is also useful in controlling soil erosion to carbon sequestration which serves as an important factor in understanding and mitigating climate change.")]),e._v(" "),t("p",[e._v("Given all these uses, having an accurate percentage of the forest cover is imperial in different studies. The objective of this use case was to derive the fractional canopy cover (FCC) using Sentinel-1 and Sentinel-2 in a random forest regression approach from very high-resolution (VHR) data acquired from the Planet Scope satellite constellation. This was done for an area with different forest types spreading throughout central Europe around the Alps as defined by the Eusropean Strategy for Alpine Regions (EUSALP).")]),e._v(" "),t("h2",{attrs:{id:"data-preparation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-preparation"}},[e._v("#")]),e._v(" Data Preparation")]),e._v(" "),t("p",[e._v("As VHR commercial data from Planet was used for the training of the model, a stratification scheme was devised for getting the maximum coverage throughout the study area. Additional data which included Copernicus Forest High-Resolution Layers (HRL, https://land.copernicus.eu/pan-european/high-resolution-layers/forests) of “Forest Type” and “Forest Cover Density” as well as the CORINE Land Cover were used to find suitable subsets within the study area to derive the target variable from the VHR data. The study area was divided into 40,000 potential test sites, which were sub-sequentially analyzed based on the amount of forest, its density, tree dominance as well as the land cover classes. Therefore, five different score criteria were introduced for each potential test site. These are shown below in Figure 1.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(352),alt:"Scoring method"}}),e._v(" "),t("figcaption",[e._v("Figure 1: Scoring based on the scoring criterion \n ")])]),e._v(" "),t("p",[e._v("Based on the maximum scores within each cell Planet data was ordered for the 300 highest-scoring areas and then using these tiles, forest masks were created. 3 masks were generated from this VHR dataset including evergreen, deciduous, and mixed forests based on various thresholds of NDVI values. Finally, these masks were summed together and then resampled to 60 meters to be compatible with Sentinel 1 and 2.")]),e._v(" "),t("h2",{attrs:{id:"model-training"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#model-training"}},[e._v("#")]),e._v(" Model training")]),e._v(" "),t("p",[e._v("The Forest masks extracted from the VHR data were vectorized to polygons which were then used as training points for the random forest regression model. The model's predictors are the Sentinel-2 Bands 02, 03, 04 and 08 representing Blue/Green/Red/NIR and the Sigma0 Sentinel-1 VV and VH polarizations.")]),e._v(" "),t("p",[e._v("The trained model can be stored for further jobs in different regions within the interest area. In Figure 2 below a process graph is shown where the trained model is applied on the predictors mentioned above.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(353),alt:"Scoring method"}}),e._v(" "),t("figcaption",[e._v("Figure 2: Process graph showing the prediction of Fractional Canopy Cover with Sentinel-1 and Sentinel-2 \n ")])]),e._v(" "),t("h2",{attrs:{id:"predicted-fractional-canopy-cover"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#predicted-fractional-canopy-cover"}},[e._v("#")]),e._v(" Predicted Fractional Canopy Cover")]),e._v(" "),t("p",[e._v("In the fit_regr_random_forest process, the actual regression calculation is taking place. Based on the random forest implementation a model is created to predict the target variable. The fitting is done in a standard machine learning approach with 70% of the polygons whereas 30% of the polygons are used for the evaluation of the model.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(354),alt:"Scoring method"}}),e._v(" "),t("figcaption",[e._v("Figure 3: Predicted Fractional Canopy Cover for part of the study area \n ")])]),e._v(" "),t("h2",{attrs:{id:"validation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#validation"}},[e._v("#")]),e._v(" Validation")]),e._v(" "),t("p",[e._v("Polygons were separated in the initial stage of the project for the validation. 512 polygons with 36 pixels each corresponding to the HRL tree density layer were used for the validation task. The comparison showed a correlation of 0.76 summarised in the plot below in Figure 4.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(355),alt:"Scoring method"}}),e._v(" "),t("figcaption",[e._v("Figure 4: Correlation plot with HRL tree density polygons\n ")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/38.7ff5d323.js b/assets/js/38.f770568d.js similarity index 99% rename from assets/js/38.7ff5d323.js rename to assets/js/38.f770568d.js index b3e1f0d1c..0dd338a45 100644 --- a/assets/js/38.7ff5d323.js +++ b/assets/js/38.f770568d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{356:function(t,s,a){t.exports=a.p+"assets/img/Composition_sen2like.3f40cbdd.png"},357:function(t,s,a){t.exports=a.p+"assets/img/RGBplot_sen2like.fa72de81.png"},358:function(t,s,a){t.exports=a.p+"assets/img/NDVIplot_sen2like.7165c449.png"},359:function(t,s,a){t.exports=a.p+"assets/img/WE_graph.c65299ba.png"},589:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"sen2like"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#sen2like"}},[t._v("#")]),t._v(" Sen2Like")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Warning")]),t._v(" "),s("p",[t._v("To use this service, you have to be registered at openEO platform. If you are not yet registered, you can apply "),s("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")])]),t._v(" "),s("p",[t._v("The sen2like processor was developed by ESA as part of the "),s("a",{attrs:{href:"https://www.copernicus.eu/en",target:"_blank",rel:"noopener noreferrer"}},[t._v("EU Copernicus program"),s("OutboundLink")],1),t._v(". It creates Sentinel-2 like (Level-2F) fused surface reflectances by harmonizing Sentinel-2 and Landsat 8/Landsat 9 to increase the temporal revisits. Based on the resulting L2F product, multiple indices can be computed, such as the NDVI and LAI.\nThe fusion also involves the upscaling of Landsat 8/Landsat 9 data to Sentinel-2 resolution. The Level 2F includes Blue, Green, Red Landsat 8 image bands rescaled to 10.0 m pixel spacing.")]),t._v(" "),s("p",[s("img",{attrs:{src:a(356),alt:"image"}})]),t._v(" "),s("p",[s("a",{attrs:{href:"https://openeo.cloud/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO"),s("OutboundLink")],1),t._v(" provides an option to run the sen2like processor on the requested extent on an openEO backend. The backend takes care of getting the required input data and the computational resources to run sen2like on. openEO users can start sen2like jobs on the backend and download the results.")]),t._v(" "),s("p",[t._v("This document describes how to use the sen2like processor in OpenEO for a requested spatio-temporal extent. We’ve prepared a "),s("a",{attrs:{href:"https://github.com/eodcgmbh/sen2like/blob/master/openeo/openeo-sen2like.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jupyter Notebook"),s("OutboundLink")],1),t._v(" that you can use to run the process.")]),t._v(" "),s("h2",{attrs:{id:"_1-sen2like-for-rgb"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-sen2like-for-rgb"}},[t._v("#")]),t._v(" 1. sen2like for RGB")]),t._v(" "),s("h3",{attrs:{id:"openeo-sen2like-processing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#openeo-sen2like-processing"}},[t._v("#")]),t._v(" openEO sen2like processing")]),t._v(" "),s("p",[t._v("To start the sen2like openEO processing, we need to connect to the EODC openEO backend.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("datacube "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" PGNode"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" THIS\n\neodc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.eodc.eu/openeo/1.1.0/"')]),t._v("\n\nconn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("eodc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nconn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sen2like"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("As sen2like can only process "),s("code",[t._v("SENTINEL2_L1C")]),t._v(" data, we chose this as our collection and specify the spatial and temporal extent and the bands to compute. Here we chose the Band 02, Band 03 and Band 04 as they are the bands for true Colors (RGB).\nThe sen2like processing automatically includes the Landsat 8 & 9 data into the computation, so we do not need to call it explicitely. The processing also automatically includes other additional data, such as the digital elevation model and data from the Copernicus Atmosphere Monitoring Service.")]),t._v(" "),s("p",[t._v("We aditionally set the parameters:")]),t._v(" "),s("ul",[s("li",[t._v("target_product: can be L2F or L2H, usually L2F as it is the 'final' fused product")]),t._v(" "),s("li",[t._v("cloud_cover: is between 1 and 100. A high cloud cover can make data inaccurate, so we ignore files with a higher cloud cover than 50%.")]),t._v(" "),s("li",[t._v("export_original_files: can be True or False - if True, the .SAFE folders are an output of the openEO process as well.")])]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("collection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),t._v("\nspatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-07-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B03"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nS2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nsen2like "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" S2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sen2like'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" THIS"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'target_product'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'L2F'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'export_original_files'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cloud_cover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),s("p",[t._v("Additionally, we can make use of other openEO processes. Here, the data is aggregated to produce monthly means and stored in NetCDF files.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2like_month "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_temporal_period"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" period"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"month"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nsen2like_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like_month"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We create and start the openEO job.\nTo reuse the results without uploading them again, we need to know the job id. To see the job status the job.status() function has to be called.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("When the job is finished, the results can be downloaded.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("results "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmetadata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_metadata"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"explore-the-openeo-l2f-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#explore-the-openeo-l2f-results"}},[t._v("#")]),t._v(" Explore the openEO L2F results")]),t._v(" "),s("p",[t._v("To create a plot of our data, we need the libraries numpy, xarray and matplotlib.pyplot. First, the desired data set must be selected.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("open_mfdataset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"EU010M_E051N014T1_20230930T000000.nc"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("To get a true color image the colors need to get adjusted. Then, we can plot our data.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("brg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("zeros"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("shape"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("shape"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B03"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B02"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.6")]),t._v("\nbrg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("clip"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("brg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("astype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("uint8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("figure"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RGB sen2like Maribor, September 2022"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("brg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("cmap"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'brg'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:a(357),alt:"image"}})]),t._v(" "),s("h2",{attrs:{id:"_2-sen2like-for-ndvi"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-sen2like-for-ndvi"}},[t._v("#")]),t._v(" 2. sen2like for NDVI")]),t._v(" "),s("p",[t._v("The Normalized difference vegetation index is a metric for quantifying the health and density of vegetation using eo data.\nFirst, we need to add the connection of the EODC backend as described above.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("datacube "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" PGNode"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" THIS\n\neodc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.eodc.eu/openeo/1.1.0/"')]),t._v("\n\nconn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("eodc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nconn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sen2like"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("To calculate the NDVI the red band (04) and the band for the near infrared (08) are needed. The other values are the same as above.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("collection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),t._v("\nspatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nS2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nsen2like "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" S2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sen2like'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" THIS"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'target_product'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'L2F'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'export_original_files'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cloud_cover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),s("p",[t._v("Additionally, we can make use of other openEO processes. The nir and red bands of the data are combined to the NDVI and stored in NetCDF files.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2like_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nir"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nsen2like_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We create and start the openEO batch job:")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("When the job is finished, the results can be downloaded.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("results "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmetadata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_metadata"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"explore-the-openeo-l2f-ndvi-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#explore-the-openeo-l2f-ndvi-results"}},[t._v("#")]),t._v(" Explore the openEO L2F NDVI results")]),t._v(" "),s("p",[t._v("Here, we only need to load the data and plot the results.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name\n\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("figure"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI sen2like Maribor, September 2022"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("cmap"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Greens'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("colorbar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:a(358),alt:"image"}})]),t._v(" "),s("h2",{attrs:{id:"_3-sen2like-processing-in-the-openeo-web-editor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-sen2like-processing-in-the-openeo-web-editor"}},[t._v("#")]),t._v(" 3. Sen2Like processing in the openeo web editor")]),t._v(" "),s("p",[t._v("The "),s("a",{attrs:{href:"https://editor.openeo.org/?server=https%3A%2F%2Fopeneo.eodc.eu%2Fopeneo%2F1.1.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO web editor"),s("OutboundLink")],1),t._v(" is another way to use the Sen2Like processor. To interact with the server, you need to log in first.")]),t._v(" "),s("p",[t._v("When the editor is opened, you can see all previous batch jobs at the bottom, all available collections and processes on the left hand side and the main editor window on the top right side of the window. You can build your own graphs by connecting collections and processes.")]),t._v(" "),s("p",[t._v("The processing graph for the Sen2Like processor looks like this:\n"),s("img",{attrs:{src:a(359),alt:"image"}})]),t._v(" "),s("p",[t._v("The structure is the same as in the notebooks. First, the Sentinel-2 data is selected. Then the Sen2Like process is executed, which is then filtered by time, extent and bands. The new data is then saved and can be used individually.")]),t._v(" "),s("p",[t._v("Below the graph, you can switch between the "),s("code",[t._v("Visual Model")]),t._v(" and "),s("code",[t._v("Code")]),t._v(". The Visual Model is the processing graph and Code is the JSON code of the built processing graph and can also be customized. The processing graph then automatically updates again.")]),t._v(" "),s("p",[t._v("The JSON Code for Sen2Like looks like this.")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('{\n "process_graph": {\n "loadcollection1": {\n "process_id": "load_collection",\n "arguments": {\n "bands": [\n "B02",\n "B03",\n "B04",\n "B05",\n "B06",\n "B07",\n "B08",\n "B8A",\n "B11",\n "B12"\n ],\n "id": "SENTINEL2_L1C",\n "spatial_extent": {\n "west": 15.2,\n "east": 17.6,\n "south": 47.9,\n "north": 49.5\n },\n "temporal_extent": [\n "2023-06-01",\n "2023-09-30"\n ]\n }\n },\n "sen2like1": {\n "process_id": "sen2like",\n "arguments": {\n "data": {\n "from_node": "loadcollection1"\n }\n }\n },\n "filtertemporal1": {\n "process_id": "filter_temporal",\n "arguments": {\n "data": {\n "from_node": "sen2like1"\n },\n "extent": [\n "2023-06-01",\n "2023-06-30"\n ]\n }\n },\n "filterbbox1": {\n "process_id": "filter_bbox",\n "arguments": {\n "data": {\n "from_node": "filtertemporal1"\n },\n "extent": {\n "west": 16.6,\n "east": 16.7,\n "north": 48,\n "south": 47.9\n }\n }\n },\n "filterbands1": {\n "process_id": "filter_bands",\n "arguments": {\n "bands": [\n "B02",\n "B03",\n "B04"\n ],\n "data": {\n "from_node": "filterbbox1"\n }\n }\n },\n "saveresult1": {\n "process_id": "save_result",\n "arguments": {\n "data": {\n "from_node": "filterbands1"\n },\n "format": "NetCDF",\n "options": {}\n },\n "result": true\n }\n },\n "parameters": []\n}\n')])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{356:function(t,s,a){t.exports=a.p+"assets/img/Composition_sen2like.3f40cbdd.png"},357:function(t,s,a){t.exports=a.p+"assets/img/RGBplot_sen2like.fa72de81.png"},358:function(t,s,a){t.exports=a.p+"assets/img/NDVIplot_sen2like.7165c449.png"},359:function(t,s,a){t.exports=a.p+"assets/img/WE_graph.c65299ba.png"},588:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"sen2like"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#sen2like"}},[t._v("#")]),t._v(" Sen2Like")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Warning")]),t._v(" "),s("p",[t._v("To use this service, you have to be registered at openEO platform. If you are not yet registered, you can apply "),s("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")])]),t._v(" "),s("p",[t._v("The sen2like processor was developed by ESA as part of the "),s("a",{attrs:{href:"https://www.copernicus.eu/en",target:"_blank",rel:"noopener noreferrer"}},[t._v("EU Copernicus program"),s("OutboundLink")],1),t._v(". It creates Sentinel-2 like (Level-2F) fused surface reflectances by harmonizing Sentinel-2 and Landsat 8/Landsat 9 to increase the temporal revisits. Based on the resulting L2F product, multiple indices can be computed, such as the NDVI and LAI.\nThe fusion also involves the upscaling of Landsat 8/Landsat 9 data to Sentinel-2 resolution. The Level 2F includes Blue, Green, Red Landsat 8 image bands rescaled to 10.0 m pixel spacing.")]),t._v(" "),s("p",[s("img",{attrs:{src:a(356),alt:"image"}})]),t._v(" "),s("p",[s("a",{attrs:{href:"https://openeo.cloud/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO"),s("OutboundLink")],1),t._v(" provides an option to run the sen2like processor on the requested extent on an openEO backend. The backend takes care of getting the required input data and the computational resources to run sen2like on. openEO users can start sen2like jobs on the backend and download the results.")]),t._v(" "),s("p",[t._v("This document describes how to use the sen2like processor in OpenEO for a requested spatio-temporal extent. We’ve prepared a "),s("a",{attrs:{href:"https://github.com/eodcgmbh/sen2like/blob/master/openeo/openeo-sen2like.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jupyter Notebook"),s("OutboundLink")],1),t._v(" that you can use to run the process.")]),t._v(" "),s("h2",{attrs:{id:"_1-sen2like-for-rgb"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-sen2like-for-rgb"}},[t._v("#")]),t._v(" 1. sen2like for RGB")]),t._v(" "),s("h3",{attrs:{id:"openeo-sen2like-processing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#openeo-sen2like-processing"}},[t._v("#")]),t._v(" openEO sen2like processing")]),t._v(" "),s("p",[t._v("To start the sen2like openEO processing, we need to connect to the EODC openEO backend.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("datacube "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" PGNode"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" THIS\n\neodc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.eodc.eu/openeo/1.1.0/"')]),t._v("\n\nconn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("eodc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nconn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sen2like"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("As sen2like can only process "),s("code",[t._v("SENTINEL2_L1C")]),t._v(" data, we chose this as our collection and specify the spatial and temporal extent and the bands to compute. Here we chose the Band 02, Band 03 and Band 04 as they are the bands for true Colors (RGB).\nThe sen2like processing automatically includes the Landsat 8 & 9 data into the computation, so we do not need to call it explicitely. The processing also automatically includes other additional data, such as the digital elevation model and data from the Copernicus Atmosphere Monitoring Service.")]),t._v(" "),s("p",[t._v("We aditionally set the parameters:")]),t._v(" "),s("ul",[s("li",[t._v("target_product: can be L2F or L2H, usually L2F as it is the 'final' fused product")]),t._v(" "),s("li",[t._v("cloud_cover: is between 1 and 100. A high cloud cover can make data inaccurate, so we ignore files with a higher cloud cover than 50%.")]),t._v(" "),s("li",[t._v("export_original_files: can be True or False - if True, the .SAFE folders are an output of the openEO process as well.")])]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("collection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),t._v("\nspatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-07-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B03"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nS2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nsen2like "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" S2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sen2like'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" THIS"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'target_product'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'L2F'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'export_original_files'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cloud_cover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),s("p",[t._v("Additionally, we can make use of other openEO processes. Here, the data is aggregated to produce monthly means and stored in NetCDF files.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2like_month "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_temporal_period"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" period"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"month"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nsen2like_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like_month"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We create and start the openEO job.\nTo reuse the results without uploading them again, we need to know the job id. To see the job status the job.status() function has to be called.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("When the job is finished, the results can be downloaded.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("results "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmetadata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_metadata"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"explore-the-openeo-l2f-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#explore-the-openeo-l2f-results"}},[t._v("#")]),t._v(" Explore the openEO L2F results")]),t._v(" "),s("p",[t._v("To create a plot of our data, we need the libraries numpy, xarray and matplotlib.pyplot. First, the desired data set must be selected.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("open_mfdataset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"EU010M_E051N014T1_20230930T000000.nc"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("To get a true color image the colors need to get adjusted. Then, we can plot our data.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("brg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("zeros"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("shape"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("shape"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B03"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B02"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.6")]),t._v("\nbrg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("clip"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("brg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("astype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("uint8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("figure"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RGB sen2like Maribor, September 2022"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("brg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("cmap"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'brg'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:a(357),alt:"image"}})]),t._v(" "),s("h2",{attrs:{id:"_2-sen2like-for-ndvi"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-sen2like-for-ndvi"}},[t._v("#")]),t._v(" 2. sen2like for NDVI")]),t._v(" "),s("p",[t._v("The Normalized difference vegetation index is a metric for quantifying the health and density of vegetation using eo data.\nFirst, we need to add the connection of the EODC backend as described above.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("datacube "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" PGNode"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" THIS\n\neodc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.eodc.eu/openeo/1.1.0/"')]),t._v("\n\nconn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("eodc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nconn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sen2like"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("To calculate the NDVI the red band (04) and the band for the near infrared (08) are needed. The other values are the same as above.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("collection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),t._v("\nspatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nS2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nsen2like "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" S2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sen2like'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" THIS"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'target_product'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'L2F'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'export_original_files'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cloud_cover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),s("p",[t._v("Additionally, we can make use of other openEO processes. The nir and red bands of the data are combined to the NDVI and stored in NetCDF files.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2like_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nir"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nsen2like_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We create and start the openEO batch job:")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("When the job is finished, the results can be downloaded.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("results "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmetadata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_metadata"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"explore-the-openeo-l2f-ndvi-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#explore-the-openeo-l2f-ndvi-results"}},[t._v("#")]),t._v(" Explore the openEO L2F NDVI results")]),t._v(" "),s("p",[t._v("Here, we only need to load the data and plot the results.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name\n\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("figure"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI sen2like Maribor, September 2022"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("cmap"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Greens'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("colorbar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:a(358),alt:"image"}})]),t._v(" "),s("h2",{attrs:{id:"_3-sen2like-processing-in-the-openeo-web-editor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-sen2like-processing-in-the-openeo-web-editor"}},[t._v("#")]),t._v(" 3. Sen2Like processing in the openeo web editor")]),t._v(" "),s("p",[t._v("The "),s("a",{attrs:{href:"https://editor.openeo.org/?server=https%3A%2F%2Fopeneo.eodc.eu%2Fopeneo%2F1.1.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO web editor"),s("OutboundLink")],1),t._v(" is another way to use the Sen2Like processor. To interact with the server, you need to log in first.")]),t._v(" "),s("p",[t._v("When the editor is opened, you can see all previous batch jobs at the bottom, all available collections and processes on the left hand side and the main editor window on the top right side of the window. You can build your own graphs by connecting collections and processes.")]),t._v(" "),s("p",[t._v("The processing graph for the Sen2Like processor looks like this:\n"),s("img",{attrs:{src:a(359),alt:"image"}})]),t._v(" "),s("p",[t._v("The structure is the same as in the notebooks. First, the Sentinel-2 data is selected. Then the Sen2Like process is executed, which is then filtered by time, extent and bands. The new data is then saved and can be used individually.")]),t._v(" "),s("p",[t._v("Below the graph, you can switch between the "),s("code",[t._v("Visual Model")]),t._v(" and "),s("code",[t._v("Code")]),t._v(". The Visual Model is the processing graph and Code is the JSON code of the built processing graph and can also be customized. The processing graph then automatically updates again.")]),t._v(" "),s("p",[t._v("The JSON Code for Sen2Like looks like this.")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('{\n "process_graph": {\n "loadcollection1": {\n "process_id": "load_collection",\n "arguments": {\n "bands": [\n "B02",\n "B03",\n "B04",\n "B05",\n "B06",\n "B07",\n "B08",\n "B8A",\n "B11",\n "B12"\n ],\n "id": "SENTINEL2_L1C",\n "spatial_extent": {\n "west": 15.2,\n "east": 17.6,\n "south": 47.9,\n "north": 49.5\n },\n "temporal_extent": [\n "2023-06-01",\n "2023-09-30"\n ]\n }\n },\n "sen2like1": {\n "process_id": "sen2like",\n "arguments": {\n "data": {\n "from_node": "loadcollection1"\n }\n }\n },\n "filtertemporal1": {\n "process_id": "filter_temporal",\n "arguments": {\n "data": {\n "from_node": "sen2like1"\n },\n "extent": [\n "2023-06-01",\n "2023-06-30"\n ]\n }\n },\n "filterbbox1": {\n "process_id": "filter_bbox",\n "arguments": {\n "data": {\n "from_node": "filtertemporal1"\n },\n "extent": {\n "west": 16.6,\n "east": 16.7,\n "north": 48,\n "south": 47.9\n }\n }\n },\n "filterbands1": {\n "process_id": "filter_bands",\n "arguments": {\n "bands": [\n "B02",\n "B03",\n "B04"\n ],\n "data": {\n "from_node": "filterbbox1"\n }\n }\n },\n "saveresult1": {\n "process_id": "save_result",\n "arguments": {\n "data": {\n "from_node": "filterbands1"\n },\n "format": "NetCDF",\n "options": {}\n },\n "result": true\n }\n },\n "parameters": []\n}\n')])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/52.5fd0c00d.js b/assets/js/52.36e989f0.js similarity index 99% rename from assets/js/52.5fd0c00d.js rename to assets/js/52.36e989f0.js index 6ecdb9a70..3263b98cd 100644 --- a/assets/js/52.5fd0c00d.js +++ b/assets/js/52.36e989f0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{350:function(e,t,o){e.exports=o.p+"assets/img/Registration_Flow.a1d30769.png"},351:function(e,t,o){e.exports=o.p+"assets/img/join0.60a3bf5f.png"},582:function(e,t,o){"use strict";o.r(t);var n=o(4),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"registration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#registration"}},[e._v("#")]),e._v(" Registration")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(350),alt:"Registration Flow"}}),e._v(" "),t("figcaption",[e._v("Figure 1: Registration Flow")])]),e._v(" "),t("p",[e._v("Register for openEO Platform and immediately start a 30 day free trial:")]),e._v(" "),t("p",[t("a",{staticClass:"action-button",staticStyle:{display:"inline-block","font-size":"1.2rem",color:"#fff","background-color":"#335e6f",padding:"0.8rem 1.6rem","border-radius":"4px","border-bottom":"1px solid #2e5564"},attrs:{href:"https://sso.terrascope.be/auth/realms/terrascope/protocol/openid-connect/auth?client_id=openeoplatform&redirect_uri=https://openeo.cloud/welcome-to-openeo-platform/&state=0%2F95954a95-1968-4a64-8b88-fef0f47936fb&response_type=code&scope=openid"}},[e._v("→ Register for openEO Platform")])]),e._v(" "),t("p",[e._v("Free trial users receive "),t("strong",[e._v("1000 free credits")]),e._v(" upon registration. openEO Platform is a federation of services which include:")]),e._v(" "),t("ul",[t("li",[e._v("EGI for Authentification & Authorization via "),t("a",{attrs:{href:"https://www.egi.eu/services/check-in/",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI Check-in"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Terrascope EOPlaza for Account management")]),e._v(" "),t("li",[e._v("EODC for provisioning of JupyterLab")]),e._v(" "),t("li",[e._v("Terrascope including Sentinel Hub connection via the EuroDataCube, EODC and Sentinel Hub backends")])]),e._v(" "),t("p",[e._v("The Network of Resources a ESA sponsoring initiative to facilitate the use of cloud environments.\nThe registration link above will lead you automatically through a couple of phases,\nwhich are explained in the graphic below.")]),e._v(" "),t("h2",{attrs:{id:"connect-with-egi-check-in"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-with-egi-check-in"}},[e._v("#")]),e._v(" Connect with EGI Check-in")]),e._v(" "),t("p",[e._v("The first step is to become member of the "),t("em",[e._v("EGI User Community")]),e._v(",\nby creating an account there,\npreferably by just connecting with an "),t("strong",[e._v("existing account")]),e._v("\nand filling in some additional information.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v('EGI Check-in based "Single Sign-on"')]),e._v(" "),t("p",[e._v("OpenEO Platform relies on\n"),t("a",{attrs:{href:"https://www.egi.eu/services/check-in/",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI Check-in"),t("OutboundLink")],1),e._v("\n(provided by the "),t("a",{attrs:{href:"https://egi.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI Foundation"),t("OutboundLink")],1),e._v(")\nfor authentication and authorization services,\nwhich offers several benefits:")]),e._v(" "),t("ul",[t("li",[e._v("Register and log in through an "),t("strong",[e._v("existing account")]),e._v("\nfrom either your academic/scientific institution,\nor other social platforms such as Google, GitHub, Facebook or LinkedIn.")]),e._v(" "),t("li",[e._v("No need to set up and remember yet another username-password combo.")]),e._v(" "),t("li",[e._v("Neither openEO Platform nor the EGI Foundation see, handle or store your password.")]),e._v(" "),t("li",[e._v("openEO Platform and EOPlaza only keep minimal user information (e.g. email address).\nCheck the privacy policy of "),t("a",{attrs:{href:"https://openeo.cloud/privacy-policy",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Platform"),t("OutboundLink")],1),e._v("\nand "),t("a",{attrs:{href:"https://vito.be/en/privacy-policy",target:"_blank",rel:"noopener noreferrer"}},[e._v("EOPlaza"),t("OutboundLink")],1),e._v(" for further details.")]),e._v(" "),t("li",[e._v("Use the same EGI account accross multiple scientific services")])])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Recommendation")]),e._v(" "),t("p",[e._v("We recommend using your "),t("strong",[e._v("institutional account")]),e._v(" whenever possible.\nNevertheless, if you are the first member of your institution to work with EGI Check-in,\nproblems may occur and sometimes require your institution's IT team to properly\nsupport EGI Check-in through EduGain.\n"),t("a",{attrs:{href:"https://www.egi.eu/service-contact/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Contact EGI"),t("OutboundLink")],1),e._v(" for further support.")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Already connected?")]),e._v(" "),t("p",[e._v("Did you already connect an existing account with EGI Check-in in the past,\nor you are unsure about that?\nJust follow the procedure discussed here:\npreviously completed steps will be skipped automatically.")])]),e._v(" "),t("p",[e._v("To get an idea of how the EGI sign up flow works and what it will require from you,\nyou can consult an "),t("a",{attrs:{href:"https://docs.egi.eu/users/aai/check-in/signup/",target:"_blank",rel:"noopener noreferrer"}},[e._v("illustrated step-by-step guide in the EGI Documentation"),t("OutboundLink")],1),e._v(".\nIf problems occur during this process, feel free to send a support request to "),t("code",[e._v("check-in egi.eu")]),e._v(".")]),e._v(" "),t("p",[e._v("If you didn't see the list of institutions and (social) platforms, you are likely already logged in.\nIn this case you can simply select "),t("em",[e._v("'SIGN UP'")]),e._v(".")]),e._v(" "),t("p",[e._v("Afterward, you will have to complete a small registration procedure to connect your account.\nYou may have to fill any missing personal information: "),t("em",[e._v("Name")]),e._v(", "),t("em",[e._v("Email")]),e._v(", "),t("em",[e._v("Affiliation")]),e._v(" and/or "),t("em",[e._v("Organisation")]),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("Patience required!")]),e._v(" "),t("p",[e._v("Please Wait until your registration is processed and you see the following Banner on top of your screen:\n")]),t("figure",[t("img",{attrs:{src:o(351),alt:"Join EGI user community - process end"}}),e._v(" "),t("figcaption",[e._v("Figure 2: Join EGI user community - Screen when the process is finished")])]),t("p")]),e._v(" "),t("p",[e._v("After submitting the registration form, you will receive a verification e-mail.\nThe e-mail verification needs to be completed before you can contine with the next steps.")]),e._v(" "),t("h2",{attrs:{id:"eoplaza"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eoplaza"}},[e._v("#")]),e._v(" EOPlaza")]),e._v(" "),t("p",[e._v("Once you finished the registration flow at EGI Check-in,\nyou will be forwarded to EOPlaza for further set up of your openEO Platform account.")]),e._v(" "),t("p",[e._v("For example, on the "),t("a",{attrs:{href:"https://portal.terrascope.be/dashboard",target:"_blank",rel:"noopener noreferrer"}},[e._v("EOPlaza Dashboard"),t("OutboundLink")],1),e._v("\nyou can consult your balance of credits.\nWhenever you consume processing resources on openEO Platform, credits will be deducted.\nYou can increase the number of credits by a "),t("a",{attrs:{href:"https://openeo.cloud/esa-network-of-resources-funding/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Network of Resources"),t("OutboundLink")],1),e._v(" request,\nor acquiring them directly on EOPlaza.")]),e._v(" "),t("p",[e._v("If you have any questions about the enrollment to openEO Platform or the free trial period,\nplease "),t("a",{attrs:{href:"https://openeo.cloud/contact/",target:"_blank",rel:"noopener noreferrer"}},[e._v("contact us"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"working-with-openeo-platform"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-openeo-platform"}},[e._v("#")]),e._v(" Working with openEO Platform")]),e._v(" "),t("p",[e._v("After you've been registered on openEO Platform, you can start working with\nthe platform through any of the clients. With all clients you will need to connect to\n"),t("code",[e._v("https://openeo.cloud")]),e._v(" and then authenticate through EGI Check-in with the\naccount used above.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Tip")]),e._v(" "),t("p",[e._v("For your own convenience, we advise you to always log in with the same identity provider you originally registered with. Otherwise, you run the risk of creating a separate new EGI account, which in turn will have to go through the openEO Platform virtual organization acceptance process again.\nIt is possible to link multiple accounts from multiple identity providers to the same EGI account. However, this must be done before you use these accounts to log in, as explained in the "),t("a",{attrs:{href:"https://docs.egi.eu/users/aai/check-in/linking/",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI documentation"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("See the getting started guides to find out more about how to use the clients for this:")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/getting-started/editor/"}},[e._v("Editor")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/getting-started/javascript/#authentication"}},[e._v("JavaScript")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/getting-started/jupyterlab/"}},[e._v("JupyterLab")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/getting-started/python/#authentication"}},[e._v("Python")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/getting-started/r/#authentication"}},[e._v("R")])],1)])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{350:function(e,t,o){e.exports=o.p+"assets/img/Registration_Flow.a1d30769.png"},351:function(e,t,o){e.exports=o.p+"assets/img/join0.60a3bf5f.png"},583:function(e,t,o){"use strict";o.r(t);var n=o(4),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"registration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#registration"}},[e._v("#")]),e._v(" Registration")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(350),alt:"Registration Flow"}}),e._v(" "),t("figcaption",[e._v("Figure 1: Registration Flow")])]),e._v(" "),t("p",[e._v("Register for openEO Platform and immediately start a 30 day free trial:")]),e._v(" "),t("p",[t("a",{staticClass:"action-button",staticStyle:{display:"inline-block","font-size":"1.2rem",color:"#fff","background-color":"#335e6f",padding:"0.8rem 1.6rem","border-radius":"4px","border-bottom":"1px solid #2e5564"},attrs:{href:"https://sso.terrascope.be/auth/realms/terrascope/protocol/openid-connect/auth?client_id=openeoplatform&redirect_uri=https://openeo.cloud/welcome-to-openeo-platform/&state=0%2F95954a95-1968-4a64-8b88-fef0f47936fb&response_type=code&scope=openid"}},[e._v("→ Register for openEO Platform")])]),e._v(" "),t("p",[e._v("Free trial users receive "),t("strong",[e._v("1000 free credits")]),e._v(" upon registration. openEO Platform is a federation of services which include:")]),e._v(" "),t("ul",[t("li",[e._v("EGI for Authentification & Authorization via "),t("a",{attrs:{href:"https://www.egi.eu/services/check-in/",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI Check-in"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Terrascope EOPlaza for Account management")]),e._v(" "),t("li",[e._v("EODC for provisioning of JupyterLab")]),e._v(" "),t("li",[e._v("Terrascope including Sentinel Hub connection via the EuroDataCube, EODC and Sentinel Hub backends")])]),e._v(" "),t("p",[e._v("The Network of Resources a ESA sponsoring initiative to facilitate the use of cloud environments.\nThe registration link above will lead you automatically through a couple of phases,\nwhich are explained in the graphic below.")]),e._v(" "),t("h2",{attrs:{id:"connect-with-egi-check-in"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-with-egi-check-in"}},[e._v("#")]),e._v(" Connect with EGI Check-in")]),e._v(" "),t("p",[e._v("The first step is to become member of the "),t("em",[e._v("EGI User Community")]),e._v(",\nby creating an account there,\npreferably by just connecting with an "),t("strong",[e._v("existing account")]),e._v("\nand filling in some additional information.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v('EGI Check-in based "Single Sign-on"')]),e._v(" "),t("p",[e._v("OpenEO Platform relies on\n"),t("a",{attrs:{href:"https://www.egi.eu/services/check-in/",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI Check-in"),t("OutboundLink")],1),e._v("\n(provided by the "),t("a",{attrs:{href:"https://egi.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI Foundation"),t("OutboundLink")],1),e._v(")\nfor authentication and authorization services,\nwhich offers several benefits:")]),e._v(" "),t("ul",[t("li",[e._v("Register and log in through an "),t("strong",[e._v("existing account")]),e._v("\nfrom either your academic/scientific institution,\nor other social platforms such as Google, GitHub, Facebook or LinkedIn.")]),e._v(" "),t("li",[e._v("No need to set up and remember yet another username-password combo.")]),e._v(" "),t("li",[e._v("Neither openEO Platform nor the EGI Foundation see, handle or store your password.")]),e._v(" "),t("li",[e._v("openEO Platform and EOPlaza only keep minimal user information (e.g. email address).\nCheck the privacy policy of "),t("a",{attrs:{href:"https://openeo.cloud/privacy-policy",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Platform"),t("OutboundLink")],1),e._v("\nand "),t("a",{attrs:{href:"https://vito.be/en/privacy-policy",target:"_blank",rel:"noopener noreferrer"}},[e._v("EOPlaza"),t("OutboundLink")],1),e._v(" for further details.")]),e._v(" "),t("li",[e._v("Use the same EGI account accross multiple scientific services")])])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Recommendation")]),e._v(" "),t("p",[e._v("We recommend using your "),t("strong",[e._v("institutional account")]),e._v(" whenever possible.\nNevertheless, if you are the first member of your institution to work with EGI Check-in,\nproblems may occur and sometimes require your institution's IT team to properly\nsupport EGI Check-in through EduGain.\n"),t("a",{attrs:{href:"https://www.egi.eu/service-contact/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Contact EGI"),t("OutboundLink")],1),e._v(" for further support.")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Already connected?")]),e._v(" "),t("p",[e._v("Did you already connect an existing account with EGI Check-in in the past,\nor you are unsure about that?\nJust follow the procedure discussed here:\npreviously completed steps will be skipped automatically.")])]),e._v(" "),t("p",[e._v("To get an idea of how the EGI sign up flow works and what it will require from you,\nyou can consult an "),t("a",{attrs:{href:"https://docs.egi.eu/users/aai/check-in/signup/",target:"_blank",rel:"noopener noreferrer"}},[e._v("illustrated step-by-step guide in the EGI Documentation"),t("OutboundLink")],1),e._v(".\nIf problems occur during this process, feel free to send a support request to "),t("code",[e._v("check-in egi.eu")]),e._v(".")]),e._v(" "),t("p",[e._v("If you didn't see the list of institutions and (social) platforms, you are likely already logged in.\nIn this case you can simply select "),t("em",[e._v("'SIGN UP'")]),e._v(".")]),e._v(" "),t("p",[e._v("Afterward, you will have to complete a small registration procedure to connect your account.\nYou may have to fill any missing personal information: "),t("em",[e._v("Name")]),e._v(", "),t("em",[e._v("Email")]),e._v(", "),t("em",[e._v("Affiliation")]),e._v(" and/or "),t("em",[e._v("Organisation")]),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("Patience required!")]),e._v(" "),t("p",[e._v("Please Wait until your registration is processed and you see the following Banner on top of your screen:\n")]),t("figure",[t("img",{attrs:{src:o(351),alt:"Join EGI user community - process end"}}),e._v(" "),t("figcaption",[e._v("Figure 2: Join EGI user community - Screen when the process is finished")])]),t("p")]),e._v(" "),t("p",[e._v("After submitting the registration form, you will receive a verification e-mail.\nThe e-mail verification needs to be completed before you can contine with the next steps.")]),e._v(" "),t("h2",{attrs:{id:"eoplaza"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eoplaza"}},[e._v("#")]),e._v(" EOPlaza")]),e._v(" "),t("p",[e._v("Once you finished the registration flow at EGI Check-in,\nyou will be forwarded to EOPlaza for further set up of your openEO Platform account.")]),e._v(" "),t("p",[e._v("For example, on the "),t("a",{attrs:{href:"https://portal.terrascope.be/dashboard",target:"_blank",rel:"noopener noreferrer"}},[e._v("EOPlaza Dashboard"),t("OutboundLink")],1),e._v("\nyou can consult your balance of credits.\nWhenever you consume processing resources on openEO Platform, credits will be deducted.\nYou can increase the number of credits by a "),t("a",{attrs:{href:"https://openeo.cloud/esa-network-of-resources-funding/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Network of Resources"),t("OutboundLink")],1),e._v(" request,\nor acquiring them directly on EOPlaza.")]),e._v(" "),t("p",[e._v("If you have any questions about the enrollment to openEO Platform or the free trial period,\nplease "),t("a",{attrs:{href:"https://openeo.cloud/contact/",target:"_blank",rel:"noopener noreferrer"}},[e._v("contact us"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"working-with-openeo-platform"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-openeo-platform"}},[e._v("#")]),e._v(" Working with openEO Platform")]),e._v(" "),t("p",[e._v("After you've been registered on openEO Platform, you can start working with\nthe platform through any of the clients. With all clients you will need to connect to\n"),t("code",[e._v("https://openeo.cloud")]),e._v(" and then authenticate through EGI Check-in with the\naccount used above.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Tip")]),e._v(" "),t("p",[e._v("For your own convenience, we advise you to always log in with the same identity provider you originally registered with. Otherwise, you run the risk of creating a separate new EGI account, which in turn will have to go through the openEO Platform virtual organization acceptance process again.\nIt is possible to link multiple accounts from multiple identity providers to the same EGI account. However, this must be done before you use these accounts to log in, as explained in the "),t("a",{attrs:{href:"https://docs.egi.eu/users/aai/check-in/linking/",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI documentation"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("See the getting started guides to find out more about how to use the clients for this:")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/getting-started/editor/"}},[e._v("Editor")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/getting-started/javascript/#authentication"}},[e._v("JavaScript")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/getting-started/jupyterlab/"}},[e._v("JupyterLab")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/getting-started/python/#authentication"}},[e._v("Python")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/getting-started/r/#authentication"}},[e._v("R")])],1)])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/53.08c214fd.js b/assets/js/53.bcdb681a.js similarity index 99% rename from assets/js/53.08c214fd.js rename to assets/js/53.bcdb681a.js index c2fe2acbf..beca7d5d7 100644 --- a/assets/js/53.08c214fd.js +++ b/assets/js/53.bcdb681a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{364:function(t,s,a){t.exports=a.p+"assets/img/RGBplot_sen2like.a0105b85.png"},365:function(t,s,a){t.exports=a.p+"assets/img/LAI_S2L.e1e81fff.png"},593:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"crop-conditions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#crop-conditions"}},[t._v("#")]),t._v(" Crop conditions")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Attention")]),t._v(" "),s("p",[t._v("To use this service, you have to be registered at openEO platform. If you are not yet registered, you can apply "),s("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")])]),t._v(" "),s("p",[t._v("To enable higher time-series resolution vegetation indices (such as NDVI, LAI, FAPAR, FCOVER) than the Sentinel-2 time series, we have implemented the computation based on the Sen2Like processor which enables users to process these indices on-demand.")]),t._v(" "),s("p",[t._v("The Sen2Like processor was developed by ESA as part of the EU Copernicus program. It creates Sentinel-2 like harmonized (Level-2H) or fused (Level-2F) surface reflectances by harmonizing Sentinel-2 and Landsat 8/Landsat 9 to increase the temporal revisits. Based on the resulting L2F product, multiple indices can be computed, such as the NDVI and LAI.\nThe fusion also involves the upscaling of Landsat 8/Landsat 9 data to Sentinel-2 resolution.\nWith the new L2F data higher time-series resolution vegetation indices (such as NDVI, LAI, FAPAR, FCOVER) can be calculated.")]),t._v(" "),s("p",[t._v("This document describes how to use the Sen2Like processor in OpenEO for a requested spatio-temporal extent and how to use the new data to calculate indices. We’ve prepared "),s("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC15-sen2like.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jupyter Notebook"),s("OutboundLink")],1),t._v(" that you can use to run the Sen2Like process and another "),s("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC15-indices.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jupyter Notebook"),s("OutboundLink")],1),t._v(" to calculate some indices.")]),t._v(" "),s("h2",{attrs:{id:"_1-data-preparation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-data-preparation"}},[t._v("#")]),t._v(" 1. data preparation")]),t._v(" "),s("p",[t._v("To start the Sen2Like openEO processing, first we need to connect to the openEO backend.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("datacube "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" THIS\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n\nconn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo.cloud"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("As Sen2Like can only process "),s("code",[t._v("SENTINEL2_L1C")]),t._v(" data, we chose this as our collection and specify the spatial and temporal extent and the bands to compute.\nThe sen2like processing automatically includes the Landsat 8 & 9 data into the computation, so we do not need to call it explicitely. The processing also automatically includes other additional data, such as the digital elevation model and data from the Copernicus Atmosphere Monitoring Service.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("49.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ncollection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B03"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B06"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B07"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B11"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B12"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nS2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"_2-sen2like-processing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-sen2like-processing"}},[t._v("#")]),t._v(" 2. Sen2like processing")]),t._v(" "),s("p",[t._v("Here, we apply the Sen2Like processing. The "),s("code",[t._v("export_original_files")]),t._v("-parameter has to be true to specify the L2F. A high cloud cover can make data inaccurate, so we ignore files with a higher cloud cover than 50%.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2like "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" S2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sen2like'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" THIS"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'target_product'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'L2F'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'export_original_files'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cloud_cover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We select a temporal subset of the data to create an RGB.\nRGB stands for red (Band 4), green (Band 3), blue (Band 2) and describes the true colors of an image in remote sensing.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2_small "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bbox"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nrgb "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2_small"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B03"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We save the data into a NetCDF, a file format for storing multidimensional scientific data (variables). Two types of output are created: The Sen2Like original .SAFE files for the extent of four UTM tiles and the NetCDF for a smaller sector.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("rgb_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" rgb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"_3-running-the-job"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-running-the-job"}},[t._v("#")]),t._v(" 3. Running the Job")]),t._v(" "),s("p",[t._v("We create and start the openEO job.\nTo reuse the results (e.g. for the "),s("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC15-indices.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("indices notebook"),s("OutboundLink")],1),t._v("), we need to know the job id. To see the job status the job-variable has to be called.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" rgb_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\njob\n")])])]),s("p",[t._v('Once the job status is "finished", we can download and explore the results.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("results "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sen2like_outputs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"_4-explore-the-openeo-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_4-explore-the-openeo-results"}},[t._v("#")]),t._v(" 4. Explore the openEO results")]),t._v(" "),s("p",[t._v("To create a plot of our data, we need the libraries numpy, xarray and matplotlib.pyplot. First, the desired data set must be selected.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" numpy "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" np \n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" xarray "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" xr\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" matplotlib"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pyplot "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" plt\n")])])]),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("path "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./sen2like_outputs/"')]),t._v("\nfiles "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" os"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("listdir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("endswith"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('".nc"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\ntemp_xarray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n temp_xr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("open_dataset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" chunks"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("coords"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n temp_xr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("expand_dims"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("elif")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("coords"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n temp_xr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("expand_dims"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n temp_xarray"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("append"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("combine_by_coords"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("temp_xarray"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" fill_value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ndata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("where"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9999")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("data_t "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("isel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("To get a true color image the colors need to get adjusted. Then, we can plot our data.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("brg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("zeros"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("shape"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("shape"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B03"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B02"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.6")]),t._v("\nbrg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("clip"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("brg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("astype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("uint8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("figure"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RGB sen2like, Austria 2023"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("brg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("cmap"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'brg'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:a(364),alt:"image"}})]),t._v(" "),s("h2",{attrs:{id:"_5-indices-calculations"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-indices-calculations"}},[t._v("#")]),t._v(" 5. Indices calculations")]),t._v(" "),s("p",[t._v("To calculate some Indices on our L2F data, we’ve prepared another "),s("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC15-indices.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jupyter Notebook"),s("OutboundLink")],1),t._v(". We make use of the "),s("code",[t._v("load_stac")]),t._v(" process, to reload the previously computed Sen2Like outputs. This is especially useful, when we compute multiple indices from the same Sen2Like outputs, as the Sen2Like processing only needs to be done once.")]),t._v(" "),s("p",[t._v('To load the results, insert the url with the saved "job_id" into the "load_stac" process. The spatio-temporal extent can be the same or smaller/shorter as in the selected data. We select the bands "B03", "B04", "B05", "B06", "B07", "B8A", "B11", "B12", as these are required in the computation for the following indices.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2like_job_id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"eodc-5d4c1746-33b2-42fb-914c-d36987747ae6"')]),t._v("\nspatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B03"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B06"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B07"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B11"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B12"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ndata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_stac"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-interpolation"}},[s("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"https://openeo.eodc.eu/openeo/1.1.0/jobs/')]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("sen2like_job_id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('/results"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-1-leaf-area-index-lai"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-1-leaf-area-index-lai"}},[t._v("#")]),t._v(" 5.1 Leaf Area Index (LAI)")]),t._v(" "),s("p",[t._v("The LAI process is based on the computation specified at "),s("a",{attrs:{href:"https://custom-scripts.sentinel-hub.com/sentinel-2/lai/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinelhub"),s("OutboundLink")],1),t._v(". All needed Bands and angles are included in the Sen2Like output data.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("lai "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'lai'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nlai_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" lai"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v('We create and start the openEO job. Once the job status is "finished", we can download the results.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" lai_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./lai/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-2leaf-chlorophyll-content-cab"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-2leaf-chlorophyll-content-cab"}},[t._v("#")]),t._v(" 5.2\tLeaf Chlorophyll Content (CAB)")]),t._v(" "),s("p",[t._v("With the same input as the LAI, the CAB can be calculated. The processing is based on the computation from "),s("a",{attrs:{href:"https://custom-scripts.sentinel-hub.com/sentinel-2/cab/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinelhub"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("cab "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cab'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncab_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cab"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cab_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./cab/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-3fraction-of-green-vegetation-cover-fcover"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-3fraction-of-green-vegetation-cover-fcover"}},[t._v("#")]),t._v(" 5.3\tFraction of green Vegetation Cover (FCOVER)")]),t._v(" "),s("p",[t._v("In the same manner, we compute the Fraction of green Vegetation Cover (FCOVER), which is based on the FCOVER-calculations from "),s("a",{attrs:{href:"https://custom-scripts.sentinel-hub.com/sentinel-2/fcover/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinelhub"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("fcover "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'fcover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nfcover_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fcover"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fcover_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./fcover/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-4fraction-of-absorbed-photosynthetically-active-radiation-fapar"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-4fraction-of-absorbed-photosynthetically-active-radiation-fapar"}},[t._v("#")]),t._v(" 5.4\tFraction of Absorbed Photosynthetically Active Radiation (FAPAR)")]),t._v(" "),s("p",[t._v("The FAPAR-computation can be found at "),s("a",{attrs:{href:"https://custom-scripts.sentinel-hub.com/sentinel-2/fapar/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinelhub"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("fapar "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'fapar'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nfapar_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fapar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fapar_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./fapar/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-5normalized-difference-vegetation-index"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-5normalized-difference-vegetation-index"}},[t._v("#")]),t._v(" 5.5\tNormalized difference vegetation index")]),t._v(" "),s("p",[t._v('The computation of the indices could also be done in one process graph with the Sen2Like processing. In this case, we start again with the "load_collection" process and select the bands "B04" and "B08".')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ncollection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nS2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n\nsen2like "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" S2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sen2like'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" THIS"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'target_product'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'L2F'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'export_original_files'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cloud_cover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v('We make use of the "ndvi" process and select a format and options for saving. Then we create and start the job and download the results.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nir"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./ndvi/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-6-explore-the-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-6-explore-the-results"}},[t._v("#")]),t._v(" 5.6 Explore the results")]),t._v(" "),s("p",[t._v("The functionality is shown using the LAI, but it works the same for the other indices. To create a plot of the results, we need the libraries os, numpy, mathplotlib and xarray. First, the LAI files are loaded. A map with the results is then created using matplotlib.pyplot.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" os\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" numpy "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" np\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" matplotlib"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pyplot "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" plt\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" xarray "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" xr\n\npath "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./lai/"')]),t._v("\nfiles "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" os"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("listdir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("startswith"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Time"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nlai "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("open_mfdataset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name\nlai "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" lai"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("where"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lai"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9999")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("plt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("figure"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lai"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cmap"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"YlGn"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("colorbar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:a(365),alt:"image"}})])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{360:function(t,s,a){t.exports=a.p+"assets/img/RGBplot_sen2like.a0105b85.png"},361:function(t,s,a){t.exports=a.p+"assets/img/LAI_S2L.e1e81fff.png"},589:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"crop-conditions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#crop-conditions"}},[t._v("#")]),t._v(" Crop conditions")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Attention")]),t._v(" "),s("p",[t._v("To use this service, you have to be registered at openEO platform. If you are not yet registered, you can apply "),s("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")])]),t._v(" "),s("p",[t._v("To enable higher time-series resolution vegetation indices (such as NDVI, LAI, FAPAR, FCOVER) than the Sentinel-2 time series, we have implemented the computation based on the Sen2Like processor which enables users to process these indices on-demand.")]),t._v(" "),s("p",[t._v("The Sen2Like processor was developed by ESA as part of the EU Copernicus program. It creates Sentinel-2 like harmonized (Level-2H) or fused (Level-2F) surface reflectances by harmonizing Sentinel-2 and Landsat 8/Landsat 9 to increase the temporal revisits. Based on the resulting L2F product, multiple indices can be computed, such as the NDVI and LAI.\nThe fusion also involves the upscaling of Landsat 8/Landsat 9 data to Sentinel-2 resolution.\nWith the new L2F data higher time-series resolution vegetation indices (such as NDVI, LAI, FAPAR, FCOVER) can be calculated.")]),t._v(" "),s("p",[t._v("This document describes how to use the Sen2Like processor in OpenEO for a requested spatio-temporal extent and how to use the new data to calculate indices. We’ve prepared "),s("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC15-sen2like.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jupyter Notebook"),s("OutboundLink")],1),t._v(" that you can use to run the Sen2Like process and another "),s("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC15-indices.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jupyter Notebook"),s("OutboundLink")],1),t._v(" to calculate some indices.")]),t._v(" "),s("h2",{attrs:{id:"_1-data-preparation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-data-preparation"}},[t._v("#")]),t._v(" 1. data preparation")]),t._v(" "),s("p",[t._v("To start the Sen2Like openEO processing, first we need to connect to the openEO backend.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("datacube "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" THIS\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n\nconn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo.cloud"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("As Sen2Like can only process "),s("code",[t._v("SENTINEL2_L1C")]),t._v(" data, we chose this as our collection and specify the spatial and temporal extent and the bands to compute.\nThe sen2like processing automatically includes the Landsat 8 & 9 data into the computation, so we do not need to call it explicitely. The processing also automatically includes other additional data, such as the digital elevation model and data from the Copernicus Atmosphere Monitoring Service.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("49.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ncollection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B03"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B06"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B07"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B11"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B12"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nS2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"_2-sen2like-processing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-sen2like-processing"}},[t._v("#")]),t._v(" 2. Sen2like processing")]),t._v(" "),s("p",[t._v("Here, we apply the Sen2Like processing. The "),s("code",[t._v("export_original_files")]),t._v("-parameter has to be true to specify the L2F. A high cloud cover can make data inaccurate, so we ignore files with a higher cloud cover than 50%.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2like "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" S2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sen2like'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" THIS"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'target_product'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'L2F'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'export_original_files'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cloud_cover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We select a temporal subset of the data to create an RGB.\nRGB stands for red (Band 4), green (Band 3), blue (Band 2) and describes the true colors of an image in remote sensing.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2_small "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bbox"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nrgb "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2_small"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B03"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We save the data into a NetCDF, a file format for storing multidimensional scientific data (variables). Two types of output are created: The Sen2Like original .SAFE files for the extent of four UTM tiles and the NetCDF for a smaller sector.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("rgb_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" rgb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"_3-running-the-job"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-running-the-job"}},[t._v("#")]),t._v(" 3. Running the Job")]),t._v(" "),s("p",[t._v("We create and start the openEO job.\nTo reuse the results (e.g. for the "),s("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC15-indices.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("indices notebook"),s("OutboundLink")],1),t._v("), we need to know the job id. To see the job status the job-variable has to be called.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" rgb_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\njob\n")])])]),s("p",[t._v('Once the job status is "finished", we can download and explore the results.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("results "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sen2like_outputs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"_4-explore-the-openeo-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_4-explore-the-openeo-results"}},[t._v("#")]),t._v(" 4. Explore the openEO results")]),t._v(" "),s("p",[t._v("To create a plot of our data, we need the libraries numpy, xarray and matplotlib.pyplot. First, the desired data set must be selected.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" numpy "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" np \n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" xarray "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" xr\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" matplotlib"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pyplot "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" plt\n")])])]),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("path "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./sen2like_outputs/"')]),t._v("\nfiles "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" os"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("listdir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("endswith"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('".nc"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\ntemp_xarray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n temp_xr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("open_dataset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" chunks"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("coords"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n temp_xr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("expand_dims"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("elif")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("coords"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n temp_xr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("expand_dims"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n temp_xarray"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("append"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("temp_xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("combine_by_coords"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("temp_xarray"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" fill_value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ndata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("where"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9999")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("data_t "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("isel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("To get a true color image the colors need to get adjusted. Then, we can plot our data.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("brg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("zeros"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("shape"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("shape"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B03"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\nbrg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("B02"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("values"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.6")]),t._v("\nbrg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("clip"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("brg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("astype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("uint8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("figure"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RGB sen2like, Austria 2023"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("brg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("cmap"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'brg'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:a(360),alt:"image"}})]),t._v(" "),s("h2",{attrs:{id:"_5-indices-calculations"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-indices-calculations"}},[t._v("#")]),t._v(" 5. Indices calculations")]),t._v(" "),s("p",[t._v("To calculate some Indices on our L2F data, we’ve prepared another "),s("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC15-indices.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jupyter Notebook"),s("OutboundLink")],1),t._v(". We make use of the "),s("code",[t._v("load_stac")]),t._v(" process, to reload the previously computed Sen2Like outputs. This is especially useful, when we compute multiple indices from the same Sen2Like outputs, as the Sen2Like processing only needs to be done once.")]),t._v(" "),s("p",[t._v('To load the results, insert the url with the saved "job_id" into the "load_stac" process. The spatio-temporal extent can be the same or smaller/shorter as in the selected data. We select the bands "B03", "B04", "B05", "B06", "B07", "B8A", "B11", "B12", as these are required in the computation for the following indices.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("sen2like_job_id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"eodc-5d4c1746-33b2-42fb-914c-d36987747ae6"')]),t._v("\nspatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B03"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B06"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B07"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B11"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B12"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ndata "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_stac"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-interpolation"}},[s("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"https://openeo.eodc.eu/openeo/1.1.0/jobs/')]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("sen2like_job_id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('/results"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-1-leaf-area-index-lai"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-1-leaf-area-index-lai"}},[t._v("#")]),t._v(" 5.1 Leaf Area Index (LAI)")]),t._v(" "),s("p",[t._v("The LAI process is based on the computation specified at "),s("a",{attrs:{href:"https://custom-scripts.sentinel-hub.com/sentinel-2/lai/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinelhub"),s("OutboundLink")],1),t._v(". All needed Bands and angles are included in the Sen2Like output data.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("lai "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'lai'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nlai_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" lai"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v('We create and start the openEO job. Once the job status is "finished", we can download the results.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" lai_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./lai/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-2leaf-chlorophyll-content-cab"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-2leaf-chlorophyll-content-cab"}},[t._v("#")]),t._v(" 5.2\tLeaf Chlorophyll Content (CAB)")]),t._v(" "),s("p",[t._v("With the same input as the LAI, the CAB can be calculated. The processing is based on the computation from "),s("a",{attrs:{href:"https://custom-scripts.sentinel-hub.com/sentinel-2/cab/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinelhub"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("cab "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cab'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncab_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cab"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cab_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./cab/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-3fraction-of-green-vegetation-cover-fcover"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-3fraction-of-green-vegetation-cover-fcover"}},[t._v("#")]),t._v(" 5.3\tFraction of green Vegetation Cover (FCOVER)")]),t._v(" "),s("p",[t._v("In the same manner, we compute the Fraction of green Vegetation Cover (FCOVER), which is based on the FCOVER-calculations from "),s("a",{attrs:{href:"https://custom-scripts.sentinel-hub.com/sentinel-2/fcover/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinelhub"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("fcover "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'fcover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nfcover_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fcover"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fcover_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./fcover/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-4fraction-of-absorbed-photosynthetically-active-radiation-fapar"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-4fraction-of-absorbed-photosynthetically-active-radiation-fapar"}},[t._v("#")]),t._v(" 5.4\tFraction of Absorbed Photosynthetically Active Radiation (FAPAR)")]),t._v(" "),s("p",[t._v("The FAPAR-computation can be found at "),s("a",{attrs:{href:"https://custom-scripts.sentinel-hub.com/sentinel-2/fapar/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinelhub"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("fapar "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'fapar'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nfapar_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fapar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fapar_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./fapar/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-5normalized-difference-vegetation-index"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-5normalized-difference-vegetation-index"}},[t._v("#")]),t._v(" 5.5\tNormalized difference vegetation index")]),t._v(" "),s("p",[t._v('The computation of the indices could also be done in one process graph with the Sen2Like processing. In this case, we start again with the "load_collection" process and select the bands "B04" and "B08".')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2023-09-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ncollection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),t._v("\nbands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nS2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n spatial_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n\nsen2like "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" S2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sen2like'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'data'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" THIS"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'target_product'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'L2F'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'export_original_files'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cloud_cover'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v('We make use of the "ndvi" process and select a format and options for saving. Then we create and start the job and download the results.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sen2like"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nir"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_nc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NetCDF"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time-series"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./ndvi/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-6-explore-the-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-6-explore-the-results"}},[t._v("#")]),t._v(" 5.6 Explore the results")]),t._v(" "),s("p",[t._v("The functionality is shown using the LAI, but it works the same for the other indices. To create a plot of the results, we need the libraries os, numpy, mathplotlib and xarray. First, the LAI files are loaded. A map with the results is then created using matplotlib.pyplot.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" os\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" numpy "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" np\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" matplotlib"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pyplot "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" plt\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" xarray "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" xr\n\npath "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./lai/"')]),t._v("\nfiles "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" os"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("listdir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("file")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("startswith"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Time"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nlai "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("open_mfdataset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name\nlai "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" lai"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("where"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lai"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9999")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("plt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("figure"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lai"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cmap"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"YlGn"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nplt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("colorbar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:a(361),alt:"image"}})])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/54.ed6c0bee.js b/assets/js/54.0c819fd9.js similarity index 98% rename from assets/js/54.ed6c0bee.js rename to assets/js/54.0c819fd9.js index 88575b95f..e209b7b70 100644 --- a/assets/js/54.ed6c0bee.js +++ b/assets/js/54.0c819fd9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{360:function(t,e,a){t.exports=a.p+"assets/img/S1_S2_predictedvsfitted.8c6b7fdb.jpg"},361:function(t,e,a){t.exports=a.p+"assets/img/Change_S1S2.6b6633ae.jpg"},591:function(t,e,a){"use strict";a.r(e);var s=a(4),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"forest-change-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#forest-change-detection"}},[t._v("#")]),t._v(" Forest Change Detection")]),t._v(" "),e("p",[t._v("Spatially and temporally explicit information of forest ecosystems is essential for a broad range of applications and Earth observation has become a key instrument for forest management and for monitoring forest cover dynamics.\nForest change detection tries to identify critical variations in the time series signal, with a strong focus on forests (e.g., illegal deforestation, wind throw, fire).\nForests follow a seasonal growth: during the summer months, they carry more leaves which leads to higher surface reflectance whereas in winter the reflectance will be much lower. This up and down in the surface reflectance of vegetated areas, can be mapped as a sinusoidal function with peaks in the vegetative periods (summer) and valleys in between. Knowing the shape of this sinusoidal function allow us to inspect disturbances, checking how much the new signal differ from the reference harmonic behavior.")]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://user-images.githubusercontent.com/31700619/131147116-f0b94015-cde2-4630-9fe6-4a854f8d2474.png",alt:"Sample result from the curve fitting and prediction steps"}}),t._v(" "),e("figcaption",[t._v("Figure 1: Sample result from the curve fitting and prediction steps. In blue the S2 B08 data and in orange the predicted values following the harmonic seasonal function.")])]),t._v(" "),e("p",[t._v("This approach can be applied to single pixels, looking into a particular area of interest, or more in general over a wide area, where each pixel time series is treated independently.\nThe following figure shows such pixels with detected change from both Sentinel-1 and Sentinel-2\n")]),e("figure",[e("img",{attrs:{src:a(360),alt:"S1 and S2 curve fitting and prediction steps"}}),t._v(" "),e("figcaption",[t._v("Figure 2: Curve fitting and prediction for Sentinel-1 and Sentinel-2. In blue the S2 B08 and S1SIGÖ VH data and in orange the respective predicted values following the harmonic seasonal function.")])]),e("p"),t._v(" "),e("p",[t._v("In this section, we will show how to combine openEO functionality into a basic change detection pipeline.")]),t._v(" "),e("h2",{attrs:{id:"data-preparation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-preparation"}},[t._v("#")]),t._v(" Data preparation")]),t._v(" "),e("p",[t._v("To correctly find the right fitting for the harmonic function, we need cloud-free data if using optical data, or shadow masked data if using radar data, over a timeseries of at least two years (but more is better!). Pixels covered by clouds or shadows deviate from the expected trend of the vegetation and therefore we must start with pre-processed data.")]),t._v(" "),e("p",[t._v("The current implementation of the "),e("code",[t._v("fit_curve()")]),t._v(" / "),e("code",[t._v("predict_curve()")]),t._v(" process and available processing and memory resources limit the spatio-temporal extent of data which can be processed in a single job. If a large extent should be processed, the extent has to be split into multiple parts and can be processed in multiple jobs.")]),t._v(" "),e("h2",{attrs:{id:"seasonal-curve-fitting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#seasonal-curve-fitting"}},[t._v("#")]),t._v(" Seasonal curve fitting")]),t._v(" "),e("p",[t._v("Supposing that the training input data is a cloud-free Sentinel-2 timeseries we can write the following code using the openEO clients to find the optimal function coefficients:")]),t._v(" "),e("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" cos"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" sin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" array_element\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fit_function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("ProcessBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parameters"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("ProcessBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n t "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pi "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("31557600")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" x\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" parameters"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" parameters"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" cos"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" parameters"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" sin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncurve_fitting "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("fit_curve"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n parameters"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Initial guess of the parameters")]),t._v("\n dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Fit the function along the temporal dimension")]),t._v("\n function"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("fit_function\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[e("div",{staticClass:"language-js extra-class"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 31557600 are the seconds in one year")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" fitFunction "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Formula")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'$$0 + $$1*cos(2*pi()/31557600*x) + $$2*sin(2*pi()/31557600*x)'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\ncurve_fitting "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fit_curve")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Initial guess of the parameters")]),t._v("\n fitFunction"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fit the function along the temporal dimension")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),e("h2",{attrs:{id:"predicting-values"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#predicting-values"}},[t._v("#")]),t._v(" Predicting values")]),t._v(" "),e("p",[t._v("With the seasonal function coefficients, we can predict the expected value for a particular time step. In the following case, we are computing the values following the seasonal trend for the training time steps:")]),t._v(" "),e("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("temporal_labels "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("dimension_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncurve_prediction "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("predict_curve"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parameters"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("curve_fitting"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("function"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("fitFunction"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("labels"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[e("div",{staticClass:"language-js extra-class"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[t._v("temporal_labels "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("dimension_labels")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ncurve_prediction "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("predict_curve")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" curve_fitting"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" fitFunction"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" temporal_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),e("p",[t._v("The difference between the training data and the predicted values following the seasonal model is a key information, which is used to perform the change detection with new data. Please have a look at the "),e("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC6%20-%20Forest%20Dynamics.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("reference notebook"),e("OutboundLink")],1),t._v(" for the complete pipeline.")]),t._v(" "),e("p",[t._v("The results obtained over an area of South Tyrol in Northern Italy which was hit by the Vaia storm are shown below. Similar damages are detected from Sentinel-1 and Sentinel-2\n")]),e("figure",[e("img",{attrs:{src:a(361),alt:"Change detection from Sentinel-1 and Sentinel-2"}}),t._v(" "),e("figcaption",[t._v("Figure 3: Change detection maps for the Vaia storm from Sentinel-1 and Sentinel-2.")])]),e("p")],1)}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{362:function(t,e,a){t.exports=a.p+"assets/img/S1_S2_predictedvsfitted.8c6b7fdb.jpg"},363:function(t,e,a){t.exports=a.p+"assets/img/Change_S1S2.6b6633ae.jpg"},591:function(t,e,a){"use strict";a.r(e);var s=a(4),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"forest-change-detection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#forest-change-detection"}},[t._v("#")]),t._v(" Forest Change Detection")]),t._v(" "),e("p",[t._v("Spatially and temporally explicit information of forest ecosystems is essential for a broad range of applications and Earth observation has become a key instrument for forest management and for monitoring forest cover dynamics.\nForest change detection tries to identify critical variations in the time series signal, with a strong focus on forests (e.g., illegal deforestation, wind throw, fire).\nForests follow a seasonal growth: during the summer months, they carry more leaves which leads to higher surface reflectance whereas in winter the reflectance will be much lower. This up and down in the surface reflectance of vegetated areas, can be mapped as a sinusoidal function with peaks in the vegetative periods (summer) and valleys in between. Knowing the shape of this sinusoidal function allow us to inspect disturbances, checking how much the new signal differ from the reference harmonic behavior.")]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://user-images.githubusercontent.com/31700619/131147116-f0b94015-cde2-4630-9fe6-4a854f8d2474.png",alt:"Sample result from the curve fitting and prediction steps"}}),t._v(" "),e("figcaption",[t._v("Figure 1: Sample result from the curve fitting and prediction steps. In blue the S2 B08 data and in orange the predicted values following the harmonic seasonal function.")])]),t._v(" "),e("p",[t._v("This approach can be applied to single pixels, looking into a particular area of interest, or more in general over a wide area, where each pixel time series is treated independently.\nThe following figure shows such pixels with detected change from both Sentinel-1 and Sentinel-2\n")]),e("figure",[e("img",{attrs:{src:a(362),alt:"S1 and S2 curve fitting and prediction steps"}}),t._v(" "),e("figcaption",[t._v("Figure 2: Curve fitting and prediction for Sentinel-1 and Sentinel-2. In blue the S2 B08 and S1SIGÖ VH data and in orange the respective predicted values following the harmonic seasonal function.")])]),e("p"),t._v(" "),e("p",[t._v("In this section, we will show how to combine openEO functionality into a basic change detection pipeline.")]),t._v(" "),e("h2",{attrs:{id:"data-preparation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-preparation"}},[t._v("#")]),t._v(" Data preparation")]),t._v(" "),e("p",[t._v("To correctly find the right fitting for the harmonic function, we need cloud-free data if using optical data, or shadow masked data if using radar data, over a timeseries of at least two years (but more is better!). Pixels covered by clouds or shadows deviate from the expected trend of the vegetation and therefore we must start with pre-processed data.")]),t._v(" "),e("p",[t._v("The current implementation of the "),e("code",[t._v("fit_curve()")]),t._v(" / "),e("code",[t._v("predict_curve()")]),t._v(" process and available processing and memory resources limit the spatio-temporal extent of data which can be processed in a single job. If a large extent should be processed, the extent has to be split into multiple parts and can be processed in multiple jobs.")]),t._v(" "),e("h2",{attrs:{id:"seasonal-curve-fitting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#seasonal-curve-fitting"}},[t._v("#")]),t._v(" Seasonal curve fitting")]),t._v(" "),e("p",[t._v("Supposing that the training input data is a cloud-free Sentinel-2 timeseries we can write the following code using the openEO clients to find the optimal function coefficients:")]),t._v(" "),e("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" cos"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" sin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" array_element\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fit_function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("ProcessBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parameters"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("ProcessBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n t "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pi "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("31557600")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" x\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" parameters"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" parameters"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" cos"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" parameters"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" sin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncurve_fitting "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("fit_curve"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n parameters"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Initial guess of the parameters")]),t._v("\n dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Fit the function along the temporal dimension")]),t._v("\n function"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("fit_function\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[e("div",{staticClass:"language-js extra-class"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 31557600 are the seconds in one year")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" fitFunction "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Formula")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'$$0 + $$1*cos(2*pi()/31557600*x) + $$2*sin(2*pi()/31557600*x)'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\ncurve_fitting "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fit_curve")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Initial guess of the parameters")]),t._v("\n fitFunction"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fit the function along the temporal dimension")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),e("h2",{attrs:{id:"predicting-values"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#predicting-values"}},[t._v("#")]),t._v(" Predicting values")]),t._v(" "),e("p",[t._v("With the seasonal function coefficients, we can predict the expected value for a particular time step. In the following case, we are computing the values following the seasonal trend for the training time steps:")]),t._v(" "),e("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("temporal_labels "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("dimension_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncurve_prediction "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("predict_curve"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parameters"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("curve_fitting"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("function"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("fitFunction"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("labels"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[e("div",{staticClass:"language-js extra-class"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[t._v("temporal_labels "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("dimension_labels")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ncurve_prediction "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("predict_curve")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l2a_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" curve_fitting"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" fitFunction"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" temporal_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),e("p",[t._v("The difference between the training data and the predicted values following the seasonal model is a key information, which is used to perform the change detection with new data. Please have a look at the "),e("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC6%20-%20Forest%20Dynamics.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("reference notebook"),e("OutboundLink")],1),t._v(" for the complete pipeline.")]),t._v(" "),e("p",[t._v("The results obtained over an area of South Tyrol in Northern Italy which was hit by the Vaia storm are shown below. Similar damages are detected from Sentinel-1 and Sentinel-2\n")]),e("figure",[e("img",{attrs:{src:a(363),alt:"Change detection from Sentinel-1 and Sentinel-2"}}),t._v(" "),e("figcaption",[t._v("Figure 3: Change detection maps for the Vaia storm from Sentinel-1 and Sentinel-2.")])]),e("p")],1)}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/55.049d7676.js b/assets/js/55.3f363fb8.js similarity index 98% rename from assets/js/55.049d7676.js rename to assets/js/55.3f363fb8.js index a6c6167ff..5484e3358 100644 --- a/assets/js/55.049d7676.js +++ b/assets/js/55.3f363fb8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{362:function(t,e,s){t.exports=s.p+"assets/img/gfm-flood-extent.46cc6068.png"},363:function(t,e,s){t.exports=s.p+"assets/img/gfm-observed-water.6638af3f.png"},592:function(t,e,s){"use strict";s.r(e);var a=s(4),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"global-flood-monitoring"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#global-flood-monitoring"}},[t._v("#")]),t._v(" Global Flood Monitoring")]),t._v(" "),e("p",[t._v("The Global Flood Monitoring (GFM) product is a component of the EU’s Copernicus\nEmergency Management Service (CEMS) that provides continuous monitoring of\nfloods worldwide, by processing and analysing in near real-time all\nincoming Sentinel-1 SAR acquisitions over land.")]),t._v(" "),e("p",[t._v("The operational implementation the GFM product includes the following key\nelements:")]),t._v(" "),e("ul",[e("li",[t._v("Downloading of worldwide Sentinel-1 SAR acquisitions (Level-1 IW GRDH)")]),t._v(" "),e("li",[t._v("Pre-processing of the downloaded Sentinel-1 data to backscatter data (SIG0)")]),t._v(" "),e("li",[t._v("Operational application of three fully automated flood mapping algorithms.")]),t._v(" "),e("li",[t._v("An ensemble-based approach is then used to combine the three flood extent\noutputs of the individual flood algorithms.")]),t._v(" "),e("li",[t._v("Generation of the required GFM output layers, including Observed flood extent,\nReference water mask, Exclusion Mask and Likelihood Values.")]),t._v(" "),e("li",[t._v("Web service-based access and dissemination of the GFM product output layers.")])]),t._v(" "),e("h2",{attrs:{id:"output-layers-used-in-openeo"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-layers-used-in-openeo"}},[t._v("#")]),t._v(" Output layers used in openEO")]),t._v(" "),e("ul",[e("li",[t._v("Observed flood extent (ENSEMBLE of all three individual flood outputs)")]),t._v(" "),e("li",[t._v("Reference water mask (permament and seasonal water bodies)")])]),t._v(" "),e("h2",{attrs:{id:"links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#links"}},[t._v("#")]),t._v(" Links")]),t._v(" "),e("p",[t._v("More documentation can be found in the "),e("a",{attrs:{href:"https://extwiki.eodc.eu/GFM",target:"_blank",rel:"noopener noreferrer"}},[t._v("GFM Wiki"),e("OutboundLink")],1),t._v(".\nThe Jupyter Notebook that is explained below can be found "),e("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC11.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"compute-the-maximum-flood-extent"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#compute-the-maximum-flood-extent"}},[t._v("#")]),t._v(" Compute the maximum flood extent")]),t._v(" "),e("p",[t._v("In this example, we have a closer look at an area in Pakistan, which was ravaged by the unprecedented floods of 2022. The flooding caused severe damage and economic losses and is referred to as the worst flood in the history of Pakistan.\nWe compute the sum of flooded pixels over time.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n\nbackend "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo.cloud"')]),t._v("\nconn "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("backend"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nspatial_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("67.5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("70")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("24.5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-09-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-10-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \ncollection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GFM'")]),t._v("\n\ngfm_data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ensemble_flood_extent"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ngfm_sum "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("sum")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ngfm_sum_tiff "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_sum"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wgs84-1degree"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"explore-how-the-flood-extent-relates-to-the-global-human-settlement-built-up-layer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#explore-how-the-flood-extent-relates-to-the-global-human-settlement-built-up-layer"}},[t._v("#")]),t._v(" Explore how the flood extent relates to the Global Human Settlement Built-up layer")]),t._v(" "),e("p",[t._v("We display the flood extent next to the Global Human Settlement Built-up layer.")]),t._v(" "),e("p",[t._v("The Global Human Settlement Layer (GHSL) project produces global spatial\ninformation about the human presence on the planet over time in the form of\nbuilt-up maps, population density maps and settlement maps.")]),t._v(" "),e("p",[t._v("Here, the GHS-BUILT-S spatial raster dataset at 10m resolution is used which\ndepicts the distribution of built-up surfaces, expressed as number of square metres.")]),t._v(" "),e("p",[t._v("Values are between 0 and 100 and represent the amount of square metres of\nbuilt-up surface in the cell.")]),t._v(" "),e("p",[t._v("https://ghsl.jrc.ec.europa.eu/about.php")]),t._v(" "),e("p",[t._v("The GHSL is available in "),e("code",[t._v("wgs84")]),t._v(". Therefore, the "),e("code",[t._v("tile_grid")]),t._v(" for the GFM data was set to "),e("code",[t._v("wgs84")]),t._v(" as well.")]),t._v(" "),e("figure",[e("img",{attrs:{src:s(362),alt:"Flood extent"}}),t._v(" "),e("figcaption",[t._v("Figure 1: Estimate of how the built-up surface was effected by the flood in Pakistan in September 2022. Some of the highest values of the GHSL can be found around 25.16 N 69.11 E, which marks Digri Tehsil, the second largest town of Mirpurkhas District, Pakistan. ")])]),t._v(" "),e("h2",{attrs:{id:"statistical-analysis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#statistical-analysis"}},[t._v("#")]),t._v(" Statistical analysis")]),t._v(" "),e("p",[t._v("In the example given above, we picked the "),e("code",[t._v("sum")]),t._v(" in "),e("code",[t._v('gfm_sum = gfm_data.reduce_dimension(dimension="t", reducer=sum)')]),t._v(". OpenEO provides a range of reducers to choose from. E.g.:")]),t._v(" "),e("ul",[e("li",[t._v("Compute the flood frequency: set the reducer to "),e("code",[t._v("mean")])]),t._v(" "),e("li",[t._v("Generate the mask of flooded pixels: set the reducer to "),e("code",[t._v("any")])])]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("gfm_flood_frequency "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ngfm_flood_frequency_tiff "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_flood_frequency"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wgs84-1degree"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"observed-water-flood-extent-refwater"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#observed-water-flood-extent-refwater"}},[t._v("#")]),t._v(" Observed water (flood_extent + refwater)")]),t._v(" "),e("p",[t._v("The observed water combines both flood extent and the reference water mask. The reference water mask represents permanent or seasonal water bodies, which are clearly distinct from flood events.\nWith openEO, the two layers "),e("code",[t._v("ensemble_flood_extent")]),t._v(" and "),e("code",[t._v("reference_water_mask")]),t._v(" can be combined directly and stored into one file. No need to download layers individually.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("spatial_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("67.5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("70")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("24.5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-09-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-10-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \ncollection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GFM'")]),t._v("\n\ngfm_data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ensemble_flood_extent"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"reference_water_mask"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# retrieve all pixels which have been detected as water during the given period")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# -> observed water")]),t._v("\nobserved_water "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Save the result in Equi7Grid and as GeoTiff")]),t._v("\nobserved_water_tif "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" observed_water"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"equi7"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"explore-the-observed-water"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#explore-the-observed-water"}},[t._v("#")]),t._v(" Explore the observed water")]),t._v(" "),e("p",[t._v("The original GFM data is stored in the Equi7 Grid and the Asian Equi7 coordinate reference system. With the "),e("code",[t._v("tile_grid")]),t._v(" parameter, the user can either keep the data like this, or pick a different CRS.")]),t._v(" "),e("figure",[e("img",{attrs:{src:s(363),alt:"Observed water"}}),t._v(" "),e("figcaption",[t._v("Figure 2: The observed water mask in Pakistan in September 2022.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{365:function(t,e,s){t.exports=s.p+"assets/img/gfm-flood-extent.46cc6068.png"},366:function(t,e,s){t.exports=s.p+"assets/img/gfm-observed-water.6638af3f.png"},596:function(t,e,s){"use strict";s.r(e);var a=s(4),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"global-flood-monitoring"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#global-flood-monitoring"}},[t._v("#")]),t._v(" Global Flood Monitoring")]),t._v(" "),e("p",[t._v("The Global Flood Monitoring (GFM) product is a component of the EU’s Copernicus\nEmergency Management Service (CEMS) that provides continuous monitoring of\nfloods worldwide, by processing and analysing in near real-time all\nincoming Sentinel-1 SAR acquisitions over land.")]),t._v(" "),e("p",[t._v("The operational implementation the GFM product includes the following key\nelements:")]),t._v(" "),e("ul",[e("li",[t._v("Downloading of worldwide Sentinel-1 SAR acquisitions (Level-1 IW GRDH)")]),t._v(" "),e("li",[t._v("Pre-processing of the downloaded Sentinel-1 data to backscatter data (SIG0)")]),t._v(" "),e("li",[t._v("Operational application of three fully automated flood mapping algorithms.")]),t._v(" "),e("li",[t._v("An ensemble-based approach is then used to combine the three flood extent\noutputs of the individual flood algorithms.")]),t._v(" "),e("li",[t._v("Generation of the required GFM output layers, including Observed flood extent,\nReference water mask, Exclusion Mask and Likelihood Values.")]),t._v(" "),e("li",[t._v("Web service-based access and dissemination of the GFM product output layers.")])]),t._v(" "),e("h2",{attrs:{id:"output-layers-used-in-openeo"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#output-layers-used-in-openeo"}},[t._v("#")]),t._v(" Output layers used in openEO")]),t._v(" "),e("ul",[e("li",[t._v("Observed flood extent (ENSEMBLE of all three individual flood outputs)")]),t._v(" "),e("li",[t._v("Reference water mask (permament and seasonal water bodies)")])]),t._v(" "),e("h2",{attrs:{id:"links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#links"}},[t._v("#")]),t._v(" Links")]),t._v(" "),e("p",[t._v("More documentation can be found in the "),e("a",{attrs:{href:"https://extwiki.eodc.eu/GFM",target:"_blank",rel:"noopener noreferrer"}},[t._v("GFM Wiki"),e("OutboundLink")],1),t._v(".\nThe Jupyter Notebook that is explained below can be found "),e("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-examples/blob/master/UCs/UC11.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"compute-the-maximum-flood-extent"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#compute-the-maximum-flood-extent"}},[t._v("#")]),t._v(" Compute the maximum flood extent")]),t._v(" "),e("p",[t._v("In this example, we have a closer look at an area in Pakistan, which was ravaged by the unprecedented floods of 2022. The flooding caused severe damage and economic losses and is referred to as the worst flood in the history of Pakistan.\nWe compute the sum of flooded pixels over time.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n\nbackend "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo.cloud"')]),t._v("\nconn "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("backend"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nspatial_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("67.5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("70")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("24.5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-09-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-10-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \ncollection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GFM'")]),t._v("\n\ngfm_data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ensemble_flood_extent"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ngfm_sum "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("sum")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ngfm_sum_tiff "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_sum"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wgs84-1degree"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"explore-how-the-flood-extent-relates-to-the-global-human-settlement-built-up-layer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#explore-how-the-flood-extent-relates-to-the-global-human-settlement-built-up-layer"}},[t._v("#")]),t._v(" Explore how the flood extent relates to the Global Human Settlement Built-up layer")]),t._v(" "),e("p",[t._v("We display the flood extent next to the Global Human Settlement Built-up layer.")]),t._v(" "),e("p",[t._v("The Global Human Settlement Layer (GHSL) project produces global spatial\ninformation about the human presence on the planet over time in the form of\nbuilt-up maps, population density maps and settlement maps.")]),t._v(" "),e("p",[t._v("Here, the GHS-BUILT-S spatial raster dataset at 10m resolution is used which\ndepicts the distribution of built-up surfaces, expressed as number of square metres.")]),t._v(" "),e("p",[t._v("Values are between 0 and 100 and represent the amount of square metres of\nbuilt-up surface in the cell.")]),t._v(" "),e("p",[t._v("https://ghsl.jrc.ec.europa.eu/about.php")]),t._v(" "),e("p",[t._v("The GHSL is available in "),e("code",[t._v("wgs84")]),t._v(". Therefore, the "),e("code",[t._v("tile_grid")]),t._v(" for the GFM data was set to "),e("code",[t._v("wgs84")]),t._v(" as well.")]),t._v(" "),e("figure",[e("img",{attrs:{src:s(365),alt:"Flood extent"}}),t._v(" "),e("figcaption",[t._v("Figure 1: Estimate of how the built-up surface was effected by the flood in Pakistan in September 2022. Some of the highest values of the GHSL can be found around 25.16 N 69.11 E, which marks Digri Tehsil, the second largest town of Mirpurkhas District, Pakistan. ")])]),t._v(" "),e("h2",{attrs:{id:"statistical-analysis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#statistical-analysis"}},[t._v("#")]),t._v(" Statistical analysis")]),t._v(" "),e("p",[t._v("In the example given above, we picked the "),e("code",[t._v("sum")]),t._v(" in "),e("code",[t._v('gfm_sum = gfm_data.reduce_dimension(dimension="t", reducer=sum)')]),t._v(". OpenEO provides a range of reducers to choose from. E.g.:")]),t._v(" "),e("ul",[e("li",[t._v("Compute the flood frequency: set the reducer to "),e("code",[t._v("mean")])]),t._v(" "),e("li",[t._v("Generate the mask of flooded pixels: set the reducer to "),e("code",[t._v("any")])])]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("gfm_flood_frequency "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ngfm_flood_frequency_tiff "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_flood_frequency"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wgs84-1degree"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"observed-water-flood-extent-refwater"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#observed-water-flood-extent-refwater"}},[t._v("#")]),t._v(" Observed water (flood_extent + refwater)")]),t._v(" "),e("p",[t._v("The observed water combines both flood extent and the reference water mask. The reference water mask represents permanent or seasonal water bodies, which are clearly distinct from flood events.\nWith openEO, the two layers "),e("code",[t._v("ensemble_flood_extent")]),t._v(" and "),e("code",[t._v("reference_water_mask")]),t._v(" can be combined directly and stored into one file. No need to download layers individually.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("spatial_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("67.5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("70")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("24.5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-09-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-10-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \ncollection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GFM'")]),t._v("\n\ngfm_data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" conn"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n bands "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ensemble_flood_extent"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"reference_water_mask"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# retrieve all pixels which have been detected as water during the given period")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# -> observed water")]),t._v("\nobserved_water "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gfm_data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Save the result in Equi7Grid and as GeoTiff")]),t._v("\nobserved_water_tif "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" observed_water"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tile_grid"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"equi7"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"explore-the-observed-water"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#explore-the-observed-water"}},[t._v("#")]),t._v(" Explore the observed water")]),t._v(" "),e("p",[t._v("The original GFM data is stored in the Equi7 Grid and the Asian Equi7 coordinate reference system. With the "),e("code",[t._v("tile_grid")]),t._v(" parameter, the user can either keep the data like this, or pick a different CRS.")]),t._v(" "),e("figure",[e("img",{attrs:{src:s(366),alt:"Observed water"}}),t._v(" "),e("figcaption",[t._v("Figure 2: The observed water mask in Pakistan in September 2022.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/57.6c62528b.js b/assets/js/57.687e115a.js similarity index 99% rename from assets/js/57.6c62528b.js rename to assets/js/57.687e115a.js index be5e89725..48140bb3e 100644 --- a/assets/js/57.6c62528b.js +++ b/assets/js/57.687e115a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{347:function(e,t,a){e.exports=a.p+"assets/img/api.2a906ee1.png"},569:function(e,t,a){"use strict";a.r(t);var r=a(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"federation-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#federation-api"}},[e._v("#")]),e._v(" Federation API")]),e._v(" "),t("p",[e._v("The general contract is the "),t("a",{attrs:{href:"https://api.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO API"),t("OutboundLink")],1),e._v(" in the latest stable version of the 1.x branch.")]),e._v(" "),t("p",[e._v('The aggregator that proxies the back-ends in the federation also implements the same API, but it also implements the "Federation Extension" (currently in draft state).')]),e._v(" "),t("h2",{attrs:{id:"profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#profiles"}},[e._v("#")]),e._v(" Profiles")]),e._v(" "),t("p",[e._v("In addition to the general openEO API specification and their "),t("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/api.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("API Profiles"),t("OutboundLink")],1),e._v(",\nopenEO Platform requires to implement an additional API profile:\n"),t("em",[e._v("LP: Required for openEO Platform")]),e._v(", which requires the openEO profile "),t("em",[e._v("L2: Recommended")]),e._v(".\nThe requirement to implement two of "),t("em",[e._v("L1A")]),e._v(", "),t("em",[e._v("L1B")]),e._v(", and "),t("em",[e._v("L1C")]),e._v(" has been restricted for openEO Platform to always require "),t("em",[e._v("L1A: Synchronous Processing")]),e._v(" and "),t("em",[e._v("L1B: Batch Jobs")]),e._v(" (see req. no. 703). This means that "),t("em",[e._v("L1C: Secondary Web Services")]),e._v(" is optional.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(347),alt:"The hierarchy of openEO and openEO Platform API profiles."}}),e._v(" "),t("figcaption",[e._v("An overview of the openEO and openEO Platform API profiles.")])]),e._v(" "),t("h3",{attrs:{id:"lp-required-for-openeo-platform"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lp-required-for-openeo-platform"}},[e._v("#")]),e._v(" LP: Required for openEO Platform")]),e._v(" "),t("p",[e._v("The profile only lists requirements that are not covered by the openEO profile "),t("em",[e._v("L2: Recommended")]),e._v(" yet.")]),e._v(" "),t("h4",{attrs:{id:"api-fundamentals"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-fundamentals"}},[e._v("#")]),e._v(" API fundamentals")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("14")]),e._v(" "),t("td",[e._v("All > Billing")]),e._v(" "),t("td",[e._v("Supports the openEO Platform credit system")])])])]),e._v(" "),t("h4",{attrs:{id:"file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[e._v("#")]),e._v(" File Formats")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("45")]),e._v(" "),t("td",[t("code",[e._v("GET /file_formats")])]),e._v(" "),t("td",[e._v("File format names and parameters aligned with openEO Platform as defined for the pre-defined "),t("RouterLink",{attrs:{to:"/federation/backends/fileformats.html"}},[e._v("file formats")])],1)])])]),e._v(" "),t("h4",{attrs:{id:"other"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#other"}},[e._v("#")]),e._v(" Other")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("90")]),e._v(" "),t("td",[t("code",[e._v("GET /health")])]),e._v(" "),t("td",[e._v("Returns 2XX or 5XX http status code (without authentication)")])])])]),e._v(" "),t("h4",{attrs:{id:"auth"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#auth"}},[e._v("#")]),e._v(" Auth")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("113")]),e._v(" "),t("td",[t("code",[e._v("GET /credentials/oidc")])]),e._v(" "),t("td",[e._v("Supports EGI as identity provider (including tokens)")])]),e._v(" "),t("tr",[t("td",[e._v("118")]),e._v(" "),t("td",[t("code",[e._v("GET /credentials/oidc")])]),e._v(" "),t("td",[e._v("Supports the required entitlements of the vo.openeo.cloud virtual organization, especially the claim eduperson_entitlement")])])])]),e._v(" "),t("p",[e._v("For more details about "),t("a",{attrs:{href:"#authentication-and-authorization"}},[e._v("Authentication and Authorization")]),e._v(", please see the corresponding chapters below.")]),e._v(" "),t("h4",{attrs:{id:"pre-defined-processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pre-defined-processes"}},[e._v("#")]),e._v(" Pre-defined Processes")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("205")]),e._v(" "),t("td",[t("code",[e._v("GET /processes")]),e._v(" > processes")]),e._v(" "),t("td",[e._v("All processes are valid according to the specification (id, description, parameters, returns are required)")])]),e._v(" "),t("tr",[t("td",[e._v("208")]),e._v(" "),t("td",[t("code",[e._v("GET /processes")]),e._v(" > processes")]),e._v(" "),t("td",[e._v("Processes are marked as experimental or deprecated if applicable")])])])]),e._v(" "),t("h4",{attrs:{id:"collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[e._v("#")]),e._v(" Collections")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("311")]),e._v(" "),t("td",[t("code",[e._v("GET /collections")]),e._v(" > collections")]),e._v(" "),t("td",[e._v("Collections are marked as experimental or deprecated if applicable")])]),e._v(" "),t("tr",[t("td",[e._v("324")]),e._v(" "),t("td",[t("code",[e._v("GET /collections/{id}")]),e._v(" > id")]),e._v(" "),t("td",[e._v("IDs follow the openEO Platform naming convention")])]),e._v(" "),t("tr",[t("td",[e._v("327")]),e._v(" "),t("td",[t("code",[e._v("GET /collections/{id}")]),e._v(" > providers")]),e._v(" "),t("td",[e._v("Each collection needs to expose the backend offering the data")])])])]),e._v(" "),t("h4",{attrs:{id:"data-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-processing"}},[e._v("#")]),e._v(" Data Processing")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("703")]),e._v(" "),t("td"),e._v(" "),t("td",[e._v("Batch jobs and synchronous processing are implemented (secondary web services are optional)")])]),e._v(" "),t("tr",[t("td",[e._v("704")]),e._v(" "),t("td"),e._v(" "),t("td",[e._v("Time after which batch job results get automatically deleted: 90 days or later")])]),e._v(" "),t("tr",[t("td",[e._v("705")]),e._v(" "),t("td"),e._v(" "),t("td",[e._v("Time after which batch job metadata gets automatically deleted: 1 year or later")])])])]),e._v(" "),t("h4",{attrs:{id:"batch-jobs-results"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results"}},[e._v("#")]),e._v(" Batch Jobs > Results")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("873")]),e._v(" "),t("td",[t("code",[e._v("GET /jobs/{id}/results")]),e._v(" > public access link")]),e._v(" "),t("td",[e._v("Default expiry time of the signed URLs for results: 7 days")])])])]),e._v(" "),t("h4",{attrs:{id:"synchronous-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#synchronous-processing"}},[e._v("#")]),e._v(" Synchronous Processing")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("920")]),e._v(" "),t("td",[t("code",[e._v("POST /result")]),e._v(" > timeout")]),e._v(" "),t("td",[e._v("The timeout for synchronous calls is: 5 minutes")])])])]),e._v(" "),t("h2",{attrs:{id:"authentication-and-authorization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication-and-authorization"}},[e._v("#")]),e._v(" Authentication and authorization")]),e._v(" "),t("p",[e._v("This important aspect of the federation is standardized by the "),t("a",{attrs:{href:"https://aarc-project.eu/architecture/",target:"_blank",rel:"noopener noreferrer"}},[e._v("AARC Blueprint Architecture"),t("OutboundLink")],1),e._v(". EGI Check-in is the concrete implementation that is currently in use.")]),e._v(" "),t("h3",{attrs:{id:"authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[e._v("#")]),e._v(" Authentication")]),e._v(" "),t("p",[e._v("The openEO platform federation standardizes on the use of "),t("a",{attrs:{href:"https://aai.egi.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI Check-in"),t("OutboundLink")],1),e._v(" as identity provider. Backends have to support the use of openID connect + PKCE, to enable this and register a client with EGI Check-in.")]),e._v(" "),t("h3",{attrs:{id:"authorization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authorization"}},[e._v("#")]),e._v(" Authorization")]),e._v(" "),t("h4",{attrs:{id:"entitlements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#entitlements"}},[e._v("#")]),e._v(" Entitlements")]),e._v(" "),t("p",[e._v("Users of the federation are organized under the 'vo.openeo.cloud' virtual organization in EGI Check-in. Inside the virtual organization, different roles can be assigned to a user, to indicate that they have a certain subscription, or even on a more fine-grained level are entitled to specific actions or resources.\nThe mechanism to check this, is again supported by EGI Check-in, under the 'eduperson_entitlement' claim: "),t("a",{attrs:{href:"https://docs.egi.eu/providers/check-in/sp/#claims",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://docs.egi.eu/providers/check-in/sp/#claims"),t("OutboundLink")],1)]),e._v(" "),t("h4",{attrs:{id:"credits"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#credits"}},[e._v("#")]),e._v(" Credits")]),e._v(" "),t("p",[e._v("The second criterium for authorization is based on credits that are available to a user. Credits allow the platform to limit the volume of data access and processing operations that a user can perform during a given time frame. The amount of available credits depends on the subscription.\nWhen the credit balance of a user goes below zero, processing operations can be blocked.")]),e._v(" "),t("h4",{attrs:{id:"aggregator-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#aggregator-rules"}},[e._v("#")]),e._v(" Aggregator rules")]),e._v(" "),t("p",[e._v("Based on the subscription and available credits, the aggregator can implement these rules:")]),e._v(" "),t("ol",[t("li",[e._v("Credit checks to block starting of batch jobs, synchronous requests to /result and viewing services.")]),e._v(" "),t("li",[e._v("Rate limiting (TBD)")])]),e._v(" "),t("h4",{attrs:{id:"backend-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backend-rules"}},[e._v("#")]),e._v(" Backend rules")]),e._v(" "),t("p",[e._v("Some authorization rules will need to be enforced by the backends themselves:")]),e._v(" "),t("ol",[t("li",[e._v("Basic access and access to user specific resources based on subscription role.")]),e._v(" "),t("li",[e._v("Number of concurrent batch jobs")]),e._v(" "),t("li",[e._v("Available processing resources, batch job priorities")]),e._v(" "),t("li",[e._v("Batch job result data volume")]),e._v(" "),t("li",[e._v("Access to restricted collections")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{347:function(e,t,a){e.exports=a.p+"assets/img/api.2a906ee1.png"},568:function(e,t,a){"use strict";a.r(t);var r=a(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"federation-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#federation-api"}},[e._v("#")]),e._v(" Federation API")]),e._v(" "),t("p",[e._v("The general contract is the "),t("a",{attrs:{href:"https://api.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO API"),t("OutboundLink")],1),e._v(" in the latest stable version of the 1.x branch.")]),e._v(" "),t("p",[e._v('The aggregator that proxies the back-ends in the federation also implements the same API, but it also implements the "Federation Extension" (currently in draft state).')]),e._v(" "),t("h2",{attrs:{id:"profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#profiles"}},[e._v("#")]),e._v(" Profiles")]),e._v(" "),t("p",[e._v("In addition to the general openEO API specification and their "),t("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/api.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("API Profiles"),t("OutboundLink")],1),e._v(",\nopenEO Platform requires to implement an additional API profile:\n"),t("em",[e._v("LP: Required for openEO Platform")]),e._v(", which requires the openEO profile "),t("em",[e._v("L2: Recommended")]),e._v(".\nThe requirement to implement two of "),t("em",[e._v("L1A")]),e._v(", "),t("em",[e._v("L1B")]),e._v(", and "),t("em",[e._v("L1C")]),e._v(" has been restricted for openEO Platform to always require "),t("em",[e._v("L1A: Synchronous Processing")]),e._v(" and "),t("em",[e._v("L1B: Batch Jobs")]),e._v(" (see req. no. 703). This means that "),t("em",[e._v("L1C: Secondary Web Services")]),e._v(" is optional.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(347),alt:"The hierarchy of openEO and openEO Platform API profiles."}}),e._v(" "),t("figcaption",[e._v("An overview of the openEO and openEO Platform API profiles.")])]),e._v(" "),t("h3",{attrs:{id:"lp-required-for-openeo-platform"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lp-required-for-openeo-platform"}},[e._v("#")]),e._v(" LP: Required for openEO Platform")]),e._v(" "),t("p",[e._v("The profile only lists requirements that are not covered by the openEO profile "),t("em",[e._v("L2: Recommended")]),e._v(" yet.")]),e._v(" "),t("h4",{attrs:{id:"api-fundamentals"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-fundamentals"}},[e._v("#")]),e._v(" API fundamentals")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("14")]),e._v(" "),t("td",[e._v("All > Billing")]),e._v(" "),t("td",[e._v("Supports the openEO Platform credit system")])])])]),e._v(" "),t("h4",{attrs:{id:"file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[e._v("#")]),e._v(" File Formats")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("45")]),e._v(" "),t("td",[t("code",[e._v("GET /file_formats")])]),e._v(" "),t("td",[e._v("File format names and parameters aligned with openEO Platform as defined for the pre-defined "),t("RouterLink",{attrs:{to:"/federation/backends/fileformats.html"}},[e._v("file formats")])],1)])])]),e._v(" "),t("h4",{attrs:{id:"other"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#other"}},[e._v("#")]),e._v(" Other")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("90")]),e._v(" "),t("td",[t("code",[e._v("GET /health")])]),e._v(" "),t("td",[e._v("Returns 2XX or 5XX http status code (without authentication)")])])])]),e._v(" "),t("h4",{attrs:{id:"auth"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#auth"}},[e._v("#")]),e._v(" Auth")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("113")]),e._v(" "),t("td",[t("code",[e._v("GET /credentials/oidc")])]),e._v(" "),t("td",[e._v("Supports EGI as identity provider (including tokens)")])]),e._v(" "),t("tr",[t("td",[e._v("118")]),e._v(" "),t("td",[t("code",[e._v("GET /credentials/oidc")])]),e._v(" "),t("td",[e._v("Supports the required entitlements of the vo.openeo.cloud virtual organization, especially the claim eduperson_entitlement")])])])]),e._v(" "),t("p",[e._v("For more details about "),t("a",{attrs:{href:"#authentication-and-authorization"}},[e._v("Authentication and Authorization")]),e._v(", please see the corresponding chapters below.")]),e._v(" "),t("h4",{attrs:{id:"pre-defined-processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pre-defined-processes"}},[e._v("#")]),e._v(" Pre-defined Processes")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("205")]),e._v(" "),t("td",[t("code",[e._v("GET /processes")]),e._v(" > processes")]),e._v(" "),t("td",[e._v("All processes are valid according to the specification (id, description, parameters, returns are required)")])]),e._v(" "),t("tr",[t("td",[e._v("208")]),e._v(" "),t("td",[t("code",[e._v("GET /processes")]),e._v(" > processes")]),e._v(" "),t("td",[e._v("Processes are marked as experimental or deprecated if applicable")])])])]),e._v(" "),t("h4",{attrs:{id:"collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[e._v("#")]),e._v(" Collections")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("311")]),e._v(" "),t("td",[t("code",[e._v("GET /collections")]),e._v(" > collections")]),e._v(" "),t("td",[e._v("Collections are marked as experimental or deprecated if applicable")])]),e._v(" "),t("tr",[t("td",[e._v("324")]),e._v(" "),t("td",[t("code",[e._v("GET /collections/{id}")]),e._v(" > id")]),e._v(" "),t("td",[e._v("IDs follow the openEO Platform naming convention")])]),e._v(" "),t("tr",[t("td",[e._v("327")]),e._v(" "),t("td",[t("code",[e._v("GET /collections/{id}")]),e._v(" > providers")]),e._v(" "),t("td",[e._v("Each collection needs to expose the backend offering the data")])])])]),e._v(" "),t("h4",{attrs:{id:"data-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-processing"}},[e._v("#")]),e._v(" Data Processing")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("703")]),e._v(" "),t("td"),e._v(" "),t("td",[e._v("Batch jobs and synchronous processing are implemented (secondary web services are optional)")])]),e._v(" "),t("tr",[t("td",[e._v("704")]),e._v(" "),t("td"),e._v(" "),t("td",[e._v("Time after which batch job results get automatically deleted: 90 days or later")])]),e._v(" "),t("tr",[t("td",[e._v("705")]),e._v(" "),t("td"),e._v(" "),t("td",[e._v("Time after which batch job metadata gets automatically deleted: 1 year or later")])])])]),e._v(" "),t("h4",{attrs:{id:"batch-jobs-results"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results"}},[e._v("#")]),e._v(" Batch Jobs > Results")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("873")]),e._v(" "),t("td",[t("code",[e._v("GET /jobs/{id}/results")]),e._v(" > public access link")]),e._v(" "),t("td",[e._v("Default expiry time of the signed URLs for results: 7 days")])])])]),e._v(" "),t("h4",{attrs:{id:"synchronous-processing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#synchronous-processing"}},[e._v("#")]),e._v(" Synchronous Processing")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("Functionality")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("920")]),e._v(" "),t("td",[t("code",[e._v("POST /result")]),e._v(" > timeout")]),e._v(" "),t("td",[e._v("The timeout for synchronous calls is: 5 minutes")])])])]),e._v(" "),t("h2",{attrs:{id:"authentication-and-authorization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication-and-authorization"}},[e._v("#")]),e._v(" Authentication and authorization")]),e._v(" "),t("p",[e._v("This important aspect of the federation is standardized by the "),t("a",{attrs:{href:"https://aarc-project.eu/architecture/",target:"_blank",rel:"noopener noreferrer"}},[e._v("AARC Blueprint Architecture"),t("OutboundLink")],1),e._v(". EGI Check-in is the concrete implementation that is currently in use.")]),e._v(" "),t("h3",{attrs:{id:"authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[e._v("#")]),e._v(" Authentication")]),e._v(" "),t("p",[e._v("The openEO platform federation standardizes on the use of "),t("a",{attrs:{href:"https://aai.egi.eu",target:"_blank",rel:"noopener noreferrer"}},[e._v("EGI Check-in"),t("OutboundLink")],1),e._v(" as identity provider. Backends have to support the use of openID connect + PKCE, to enable this and register a client with EGI Check-in.")]),e._v(" "),t("h3",{attrs:{id:"authorization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authorization"}},[e._v("#")]),e._v(" Authorization")]),e._v(" "),t("h4",{attrs:{id:"entitlements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#entitlements"}},[e._v("#")]),e._v(" Entitlements")]),e._v(" "),t("p",[e._v("Users of the federation are organized under the 'vo.openeo.cloud' virtual organization in EGI Check-in. Inside the virtual organization, different roles can be assigned to a user, to indicate that they have a certain subscription, or even on a more fine-grained level are entitled to specific actions or resources.\nThe mechanism to check this, is again supported by EGI Check-in, under the 'eduperson_entitlement' claim: "),t("a",{attrs:{href:"https://docs.egi.eu/providers/check-in/sp/#claims",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://docs.egi.eu/providers/check-in/sp/#claims"),t("OutboundLink")],1)]),e._v(" "),t("h4",{attrs:{id:"credits"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#credits"}},[e._v("#")]),e._v(" Credits")]),e._v(" "),t("p",[e._v("The second criterium for authorization is based on credits that are available to a user. Credits allow the platform to limit the volume of data access and processing operations that a user can perform during a given time frame. The amount of available credits depends on the subscription.\nWhen the credit balance of a user goes below zero, processing operations can be blocked.")]),e._v(" "),t("h4",{attrs:{id:"aggregator-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#aggregator-rules"}},[e._v("#")]),e._v(" Aggregator rules")]),e._v(" "),t("p",[e._v("Based on the subscription and available credits, the aggregator can implement these rules:")]),e._v(" "),t("ol",[t("li",[e._v("Credit checks to block starting of batch jobs, synchronous requests to /result and viewing services.")]),e._v(" "),t("li",[e._v("Rate limiting (TBD)")])]),e._v(" "),t("h4",{attrs:{id:"backend-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backend-rules"}},[e._v("#")]),e._v(" Backend rules")]),e._v(" "),t("p",[e._v("Some authorization rules will need to be enforced by the backends themselves:")]),e._v(" "),t("ol",[t("li",[e._v("Basic access and access to user specific resources based on subscription role.")]),e._v(" "),t("li",[e._v("Number of concurrent batch jobs")]),e._v(" "),t("li",[e._v("Available processing resources, batch job priorities")]),e._v(" "),t("li",[e._v("Batch job result data volume")]),e._v(" "),t("li",[e._v("Access to restricted collections")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/58.faa664f9.js b/assets/js/58.70cd5be6.js similarity index 99% rename from assets/js/58.faa664f9.js rename to assets/js/58.70cd5be6.js index 839abd960..e12a4f9b0 100644 --- a/assets/js/58.faa664f9.js +++ b/assets/js/58.70cd5be6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{348:function(e,o,t){e.exports=t.p+"assets/img/processes.f8c0abeb.png"},571:function(e,o,t){"use strict";t.r(o);var n=t(4),r=Object(n.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"processes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[e._v("#")]),e._v(" Processes")]),e._v(" "),o("p",[e._v("The openEO project defines a large number of processes, which can be found at "),o("a",{attrs:{href:"https://processes.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://processes.openeo.org"),o("OutboundLink")],1),e._v(".\nDue to the number of processes, we need to define a profile (i.e. a subset of processes) that must be implemented on each back-end so that a certain level of interoperability can be achieved.")]),e._v(" "),o("p",[e._v("In addition to the general openEO Processes specification and their "),o("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/processes.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Processes Profiles"),o("OutboundLink")],1),e._v(",\nopenEO Platform requires to implement an additional Process profile:\n"),o("em",[e._v("L2P: Required - openEO Platform")]),e._v(", which requires one of the openEO profiles "),o("em",[e._v("L2A: Recommended (Raster)")]),e._v(" or "),o("em",[e._v("L2B: Recommended (Vector)")]),e._v(".\nThere are two additional openEO Platform specific profiles with additional requirements: "),o("em",[e._v("L3P: Advanced - openEO Platform")]),e._v(" and "),o("em",[e._v("L4P: Complete - openEO Platform")]),e._v(".")]),e._v(" "),o("figure",[o("img",{attrs:{src:t(348),alt:"The hierarchy of openEO and openEO Platform Processes profiles."}}),e._v(" "),o("figcaption",[e._v("An overview of the openEO and openEO Platform Processes profiles.")])]),e._v(" "),o("h3",{attrs:{id:"requirements-per-profile"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#requirements-per-profile"}},[e._v("#")]),e._v(" Requirements per Profile")]),e._v(" "),o("p",[e._v("The profiles below only lists requirements that are not covered by the corresponding openEO profiles yet.")]),e._v(" "),o("p",[e._v('Although in the openEO Profiles experimental processes shall only lead to a "warning", experimental processes in profiles that '),o("em",[e._v("L2P")]),e._v(" depends on are required to be available (which currently are "),o("code",[e._v("inspect")]),e._v(" and "),o("code",[e._v("nan")]),e._v(").")]),e._v(" "),o("h2",{attrs:{id:"l2p-required-openeo-platform"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#l2p-required-openeo-platform"}},[e._v("#")]),e._v(" L2P: Required - openEO Platform")]),e._v(" "),o("p",[e._v("Requires "),o("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/processes.html#l2-recommended",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Profile L2: Recommended"),o("OutboundLink")],1),e._v(" and additionally:")]),e._v(" "),o("ul",[o("li",[o("strong",[o("code",[e._v("add_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("aggregate_spatial")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("aggregate_temporal")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("aggregate_temporal_period")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("apply")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("apply_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("apply_kernel")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("array_contains")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("dimension_labels")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("drop_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_bands")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_bbox")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_spatial")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_temporal")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("load_collection")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("mask")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("mask_polygon")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("merge_cubes")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("ndvi")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("reduce_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("rename_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("rename_labels")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("resample_cube_spatial")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("resample_spatial")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("save_result")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])])]),e._v(" "),o("h2",{attrs:{id:"l3p-advanced-openeo-platform"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#l3p-advanced-openeo-platform"}},[e._v("#")]),e._v(" L3P: Advanced - openEO Platform")]),e._v(" "),o("p",[e._v("Requires "),o("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/processes.html#l3-advanced",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Profile L3: Advanced"),o("OutboundLink")],1),e._v(" and additionally:")]),e._v(" "),o("ul",[o("li",[o("strong",[o("code",[e._v("apply_neighborhood")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("ard_surface_reflectance")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_labels")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("load_stac (load_result)")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("reduce_spatial")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("resample_cube_temporal")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("run_udf")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])])]),e._v(" "),o("h2",{attrs:{id:"l4p-complete-openeo-platform"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#l4p-complete-openeo-platform"}},[e._v("#")]),e._v(" L4P: Complete - openEO Platform")]),e._v(" "),o("p",[e._v("Requires "),o("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/processes.html#l4-above-and-beyond",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Profile L4: Above and Beyond"),o("OutboundLink")],1),e._v(" and additionally:")]),e._v(" "),o("ul",[o("li",[o("strong",[o("code",[e._v("atmospheric_correction")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("load_uploaded_files")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("load_url")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("sar_backscatter")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])])])])}),[],!1,null,null,null);o.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{348:function(e,o,t){e.exports=t.p+"assets/img/processes.f8c0abeb.png"},573:function(e,o,t){"use strict";t.r(o);var n=t(4),r=Object(n.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"processes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[e._v("#")]),e._v(" Processes")]),e._v(" "),o("p",[e._v("The openEO project defines a large number of processes, which can be found at "),o("a",{attrs:{href:"https://processes.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://processes.openeo.org"),o("OutboundLink")],1),e._v(".\nDue to the number of processes, we need to define a profile (i.e. a subset of processes) that must be implemented on each back-end so that a certain level of interoperability can be achieved.")]),e._v(" "),o("p",[e._v("In addition to the general openEO Processes specification and their "),o("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/processes.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Processes Profiles"),o("OutboundLink")],1),e._v(",\nopenEO Platform requires to implement an additional Process profile:\n"),o("em",[e._v("L2P: Required - openEO Platform")]),e._v(", which requires one of the openEO profiles "),o("em",[e._v("L2A: Recommended (Raster)")]),e._v(" or "),o("em",[e._v("L2B: Recommended (Vector)")]),e._v(".\nThere are two additional openEO Platform specific profiles with additional requirements: "),o("em",[e._v("L3P: Advanced - openEO Platform")]),e._v(" and "),o("em",[e._v("L4P: Complete - openEO Platform")]),e._v(".")]),e._v(" "),o("figure",[o("img",{attrs:{src:t(348),alt:"The hierarchy of openEO and openEO Platform Processes profiles."}}),e._v(" "),o("figcaption",[e._v("An overview of the openEO and openEO Platform Processes profiles.")])]),e._v(" "),o("h3",{attrs:{id:"requirements-per-profile"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#requirements-per-profile"}},[e._v("#")]),e._v(" Requirements per Profile")]),e._v(" "),o("p",[e._v("The profiles below only lists requirements that are not covered by the corresponding openEO profiles yet.")]),e._v(" "),o("p",[e._v('Although in the openEO Profiles experimental processes shall only lead to a "warning", experimental processes in profiles that '),o("em",[e._v("L2P")]),e._v(" depends on are required to be available (which currently are "),o("code",[e._v("inspect")]),e._v(" and "),o("code",[e._v("nan")]),e._v(").")]),e._v(" "),o("h2",{attrs:{id:"l2p-required-openeo-platform"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#l2p-required-openeo-platform"}},[e._v("#")]),e._v(" L2P: Required - openEO Platform")]),e._v(" "),o("p",[e._v("Requires "),o("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/processes.html#l2-recommended",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Profile L2: Recommended"),o("OutboundLink")],1),e._v(" and additionally:")]),e._v(" "),o("ul",[o("li",[o("strong",[o("code",[e._v("add_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("aggregate_spatial")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("aggregate_temporal")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("aggregate_temporal_period")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("apply")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("apply_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("apply_kernel")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("array_contains")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("dimension_labels")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("drop_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_bands")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_bbox")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_spatial")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_temporal")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("load_collection")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("mask")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("mask_polygon")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("merge_cubes")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("ndvi")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("reduce_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("rename_dimension")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("rename_labels")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("resample_cube_spatial")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("resample_spatial")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("save_result")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])])]),e._v(" "),o("h2",{attrs:{id:"l3p-advanced-openeo-platform"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#l3p-advanced-openeo-platform"}},[e._v("#")]),e._v(" L3P: Advanced - openEO Platform")]),e._v(" "),o("p",[e._v("Requires "),o("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/processes.html#l3-advanced",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Profile L3: Advanced"),o("OutboundLink")],1),e._v(" and additionally:")]),e._v(" "),o("ul",[o("li",[o("strong",[o("code",[e._v("apply_neighborhood")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("ard_surface_reflectance")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("filter_labels")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("load_stac (load_result)")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("reduce_spatial")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("resample_cube_temporal")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("run_udf")])]),e._v(" "),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])])]),e._v(" "),o("h2",{attrs:{id:"l4p-complete-openeo-platform"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#l4p-complete-openeo-platform"}},[e._v("#")]),e._v(" L4P: Complete - openEO Platform")]),e._v(" "),o("p",[e._v("Requires "),o("a",{attrs:{href:"https://openeo.org/documentation/1.0/developers/profiles/processes.html#l4-above-and-beyond",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Profile L4: Above and Beyond"),o("OutboundLink")],1),e._v(" and additionally:")]),e._v(" "),o("ul",[o("li",[o("strong",[o("code",[e._v("atmospheric_correction")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("load_uploaded_files")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("load_url")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])]),e._v(" "),o("li",[o("strong",[o("code",[e._v("sar_backscatter")])]),e._v(" (experimental)\n"),o("ul",[o("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")])])])])])}),[],!1,null,null,null);o.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/59.192b0f57.js b/assets/js/59.3be59468.js similarity index 99% rename from assets/js/59.192b0f57.js rename to assets/js/59.3be59468.js index 4a7c852c7..5d8bc6b39 100644 --- a/assets/js/59.192b0f57.js +++ b/assets/js/59.3be59468.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{349:function(e,t,s){e.exports=s.p+"assets/img/federation.c4cdfa06.png"},575:function(e,t,s){"use strict";s.r(t);var a=s(4),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"federation-aspects-and-known-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#federation-aspects-and-known-issues"}},[e._v("#")]),e._v(" Federation Aspects and Known Issues")]),e._v(" "),t("p",[e._v("openEO Platform is a federated platform. This means that multiple independent 'back-ends',\nwhich all support the openEO interface, are combined into a single instance. From the outside,\nit appears to be a single platform, but you get access to data collections and processing resources from\nmultiple instances.")]),e._v(" "),t("p",[e._v("This image gives you a look at platforms that make up the federation:")]),e._v(" "),t("p",[t("img",{attrs:{src:s(349),alt:"openeo.cloud federation"}})]),e._v(" "),t("p",[e._v("At this time, the federation can not yet entirely hide the fact that it is built out of\nseparate components:")]),e._v(" "),t("ul",[t("li",[e._v("Within the same processing request, you can only use collections from the same back-end")]),e._v(" "),t("li",[e._v("Some processes are not (fully) supported by all back-ends.")]),e._v(" "),t("li",[e._v("If a back-end requires data from an external source, bandwidth limitations may result in slower processing.")])]),e._v(" "),t("h2",{attrs:{id:"data-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-collections"}},[e._v("#")]),e._v(" Data Collections")]),e._v(" "),t("p",[e._v("The federation exposes the "),t("em",[e._v("union")]),e._v(" of the data collections of each of the underlying back-ends.\nWhen a processing request is submitted to the federated platform, the input collections are used to determine to which back-end the actual processing work should be delegated to.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("For the technical discussion on collection federation, see "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-aggregator/issues/5",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open-EO/openeo-aggregator#5"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"terrascope"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#terrascope"}},[e._v("#")]),e._v(" Terrascope")]),e._v(" "),t("p",[e._v("Terrascope hosts a number of collections itself.\nFor coarse resolution data (e.g. 100 m resolution) this is often the full archive,\nwhile for medium resolution (Sentinel 1, 2) data is only offered for selected areas.")]),e._v(" "),t("p",[e._v("Additional data can be processed upon request, if it is not available from another provider.\nThis may result in an additional cost for processing and storage.")]),e._v(" "),t("h3",{attrs:{id:"sentinel-hub"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sentinel-hub"}},[e._v("#")]),e._v(" Sentinel Hub")]),e._v(" "),t("p",[e._v("The Terrascope back-end also integrates with Sentinel Hub (part of Euro Data Cube) to give you\naccess to additional collections.\nThis practically means that data needs to be transferred from Sentinel Hub to the Terrascope data center before it can be processed.\nThis works very well for small areas, or a 100x100km MGRS tile in batch mode,\nbut is not yet recommended for processing medium size to large countries or continents.")]),e._v(" "),t("p",[e._v("The collection metadata of the Terrascope back-end tries to clearly identify which collections are served by Sentinel Hub.")]),e._v(" "),t("h4",{attrs:{id:"commercial-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commercial-data"}},[e._v("#")]),e._v(" Commercial Data")]),e._v(" "),t("p",[e._v("openEO Platform provides direct access to commercial data. Currently, data must be purchased directly through Sentinel Hub (see Sentinel Hub documentation on purchasing commercial data "),t("a",{attrs:{href:"https://docs.sentinel-hub.com/api/latest/api/data-import/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v("), but we are working to support ordering commercial data directly from the platform in the future.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Experimental usage")]),e._v(" "),t("p",[e._v("The below described way of how to connect to commercial data is currently only supported by the pyhton client and experimental. As such the behavior might still change in the future.")])]),e._v(" "),t("p",[e._v("Data is accessed as part of the load_collection process and via a "),t("code",[e._v("featureflags")]),e._v(" argument. To access the data, you must:")]),e._v(" "),t("ul",[t("li",[e._v("select the commercial data provider in "),t("code",[e._v("collection_id")]),e._v(" (e.g. "),t("code",[e._v('collection_id="PLANETSCOPE"')]),e._v(")")]),e._v(" "),t("li",[e._v("set the Sentinel Hub BYOC collection ID ("),t("code",[e._v("byoc-{id}")]),e._v(") as "),t("code",[e._v("featureflags")]),e._v(" argument\n(e.g. with openEO Python client version 0.10.1 or higher:\n"),t("code",[e._v('datacube.result_node().update_arguments(featureflags={"byoc_collection_id": byoc_collection_id})')]),e._v(")")])]),e._v(" "),t("p",[e._v("Full example of loading a commercial data collection:")]),e._v(" "),t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("toc "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" connection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("load_collection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("\n collection_id"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"PLANETSCOPE"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n spatial_extent"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"west"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("104.86")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"south"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8.85")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"east"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("106.11")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"north"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("10.37")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n temporal_extent"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2019-03-01"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2020-12-31"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n bands"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"B3"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\ntoc"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("result_node"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("update_arguments"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("featureflags"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"byoc_collection_id"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" byoc_collection_id"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("List of currently supported commercial data providers:")]),e._v(" "),t("ul",[t("li",[e._v("Airbus Pleiades (ID: "),t("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=PLEIADES",target:"_blank",rel:"noopener noreferrer"}},[e._v("PLEIADES"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Airbus Spot (ID: "),t("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=SPOT",target:"_blank",rel:"noopener noreferrer"}},[e._v("SPOT"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("PlanetScope (ID: "),t("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=PLANETSCOPE",target:"_blank",rel:"noopener noreferrer"}},[e._v("PLANETSCOPE"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("WorldView (ID: "),t("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=WORLDVIEW",target:"_blank",rel:"noopener noreferrer"}},[e._v("WORLDVIEW"),t("OutboundLink")],1),e._v(")")])]),e._v(" "),t("h3",{attrs:{id:"eodc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eodc"}},[e._v("#")]),e._v(" EODC")]),e._v(" "),t("p",[e._v("EODC provides Sentinel-1 (GRH), Sentinel-2 and Sentinel-3 Level-1 globally. On top, pre-processed Level-2 data is\navailable on request (this may result in additional costs). In detail Gamma0 data processed with SNAP and optical ARD\nproducts processed with FORCE are provided.")]),e._v(" "),t("p",[e._v("If the available pre-processed collections are not sufficient, there is on option to perform ARD processing on demand\nwith SNAP respectively FORCE. This may again result in additional costs for processing and storage.")]),e._v(" "),t("p",[e._v("Currently most processes are only available for Level-2 data. Only the ARD processes can be executed on Level-1 data. Also\nonly either ARD processes "),t("strong",[e._v("or")]),e._v(' "standard" processes can be used in one process graph. Combining both types of processes\nis not yet supported. One option to nevertheless achieve a combination of process types is to run ARD on Level-1 data,\nsave the results of the job, and then in a second job load results and perform additional computations.')]),e._v(" "),t("h3",{attrs:{id:"enforce-back-end-selection-for-common-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enforce-back-end-selection-for-common-collections"}},[e._v("#")]),e._v(" Enforce back-end selection for common collections")]),e._v(" "),t("p",[e._v("Some collections are provided by multiple underlying back-ends,\npossibly with differences in spatial or temporal coverage.\nThis is exposed in the collection metadata with "),t("code",[e._v("federation:backends")]),e._v(" summary, e.g.:")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"id"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"WATER_BODIES"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"type"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Collection"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ...\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"summaries"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"federation:backends"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"vito"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"sentinelhub"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ...\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("When a user submits a processing request,\nthe federated platform will try, by default, to automatically determine\nwhich underlying back-end is best choice for the actual processing,\nbased for example on the requested spatial extent.")]),e._v(" "),t("p",[e._v("You can however also enforce the selection of a certain back-end\nby using the metadata property filtering feature\nof the "),t("code",[e._v("load_collection")]),e._v(' process.\nFor example, with the Python client, to enforce the selection of\nthe "sentinelhub" back-end:')]),e._v(" "),t("CodeSwitcher",{attrs:{languages:{py:"Python",r:"R"}},scopedSlots:e._u([{key:"py",fn:function(){return[t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("cube "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" connection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("load_collection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"WATER_BODIES"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\n properties"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"federation:backends"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("lambda")]),e._v(" v"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" v "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("==")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"sentinelhub"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[t("div",{staticClass:"language-r extra-class"},[t("pre",{pre:!0,attrs:{class:"language-r"}},[t("code",[e._v("cube "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" p"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("$")]),e._v("load_collection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("\n id "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"WATER_BODIES"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token ellipsis"}},[e._v("...")]),e._v("\n properties "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" list"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"federation:backends"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("function")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("x"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" x "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("==")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"sentinelhub"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])])]},proxy:!0}])}),e._v(" "),t("h2",{attrs:{id:"processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[e._v("#")]),e._v(" Processes")]),e._v(" "),t("p",[e._v("Each of the underlying back-ends of the federation can define its own set of available processes,\nbut there is in practice a very large common ground across these back-ends.\nAs such, the federation's listing of available processes is the "),t("em",[e._v("intersection")]),e._v("\nof the process sets of each of the underlying back-ends.\nThis is the most straightforward combination with the least surprise.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Advanced/experimental usage")]),e._v(" "),t("p",[e._v("A savvy user that knows which underlying back-end will execute their job\ncan however still submit process graphs with processes that are available\non that back-end but fall outside the intersection,\nas the federation will just forward the process graph as-is to that back-end.")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("For the technical discussion on process federation, see "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-aggregator/issues/4",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open-EO/openeo-aggregator#4"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[e._v("#")]),e._v(" File formats")]),e._v(" "),t("p",[e._v("The federation currently lists the "),t("em",[e._v("union")]),e._v(" of import/export file formats available\nat each of the underlying back-ends.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("For the technical discussion on file format federation, see "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-aggregator/issues/1",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open-EO/openeo-aggregator#1"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"on-demand-preview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#on-demand-preview"}},[e._v("#")]),e._v(" On-demand-preview")]),e._v(" "),t("p",[e._v("Sometimes there is a need to quickly inspect results of a process graph on the map without first running the entire graph first and waiting for the results to be computed and returned. This "),t("code",[e._v("on-demand-preview")]),e._v(" is available in the "),t("a",{attrs:{href:"https://editor.openeo.cloud/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Platform Editor"),t("OutboundLink")],1),e._v(" and the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Python Client*"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("In the Editor you can find the functionality in the "),t("code",[e._v("Web Services")]),e._v(" tab. Use the button"),t("code",[e._v("Show on Map")]),e._v(".")]),e._v(" "),t("p",[e._v("In the Python Client, you can use the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.preview",target:"_blank",rel:"noopener noreferrer"}},[e._v(".preview() method"),t("OutboundLink")],1),e._v(" to create a service with your process graph and display the results in an ipyleaflet Map object. You can find an example implementation in "),t("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/on-demand_preview.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("this Jupyter notebook"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("This functionallity currently only works with collections that are also on the Sentinel Hub backend (Provider > Backend > sentinelhub). In order for the map to display meaningful results, your process graph should:")]),e._v(" "),t("ul",[t("li",[e._v("return one or three bands,")]),e._v(" "),t("li",[e._v("a single temporal extent,")]),e._v(" "),t("li",[e._v("and scale the data to a range so that the output format can adequately save it.")])])]),e._v(" "),t("p",[e._v("*You need to have at least version 0.19.0 installed to use this functionality.")]),e._v(" "),t("h2",{attrs:{id:"batch-jobs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs"}},[e._v("#")]),e._v(" Batch jobs")]),e._v(" "),t("p",[e._v("As discussed above, when the federated platform receives a processing request, such as a batch job,\nit will automatically determine to which back-end this request should be delegated for actual processing.")]),e._v(" "),t("h3",{attrs:{id:"managed-job-splitting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#managed-job-splitting"}},[e._v("#")]),e._v(" Managed job splitting")]),e._v(" "),t("p",[e._v("In addition to this basic delegation feature, the federation also provides more advanced (pre)processing capabilities.\nFor instance, the federation platform can be instructed to split up a single batch job in multiple sub-jobs\nand distribute these across one or more processing back-ends.\nThe federation platform will automatically create, start and keep track of these sub-jobs\nwhile the user just have to interact with a single job: e.g. check the overall processing status,\ndownload the combined result assets, ...")]),e._v(" "),t("p",[e._v("Currently, spatial tile-based splitting is supported as splitting strategy\nand it can be enabled by providing a specific job option when submitting the batch job.\nFor example, using the openEO Python Client, instruct the federation platform to\nsplit up datacube processing in UTM based tiles of 20km by 20km:")]),e._v(" "),t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("job "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" datacube"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("create_job"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("\n job_options"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"tile_grid"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"utm-20km"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v('This creates a virtual master job on the level of the federation platform and real batch jobs\non the appropriate processing back-ends.\nSubsequent interaction (starting the jobs, polling their status, requesting the result assets, ...)\ncan be done through the "master" '),t("code",[e._v("job")]),e._v(" object created above, in the same way as with normal batch jobs.")]),e._v(" "),t("h3",{attrs:{id:"validity-of-signed-urls-in-batch-job-results"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#validity-of-signed-urls-in-batch-job-results"}},[e._v("#")]),e._v(" Validity of signed URLs in batch job results")]),e._v(" "),t("p",[e._v("Batch job results are accessible to the user via signed URLs stored in the result assets. Within the platform,\nthese URLs have a validity (expiry time) of 7 days. Within these 7 days, the results of a batch job can be accessed\nby any person with the URL. Each time a user requests the results from the job endpoint ("),t("code",[e._v("GET /jobs/{job_id}/results")]),e._v("),\na freshly signed URL (valid for 7 days) is created for the result assets.")]),e._v(" "),t("h3",{attrs:{id:"customizing-batch-job-resources-on-terrascope"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#customizing-batch-job-resources-on-terrascope"}},[e._v("#")]),e._v(" Customizing batch job resources on Terrascope")]),e._v(" "),t("p",[e._v("Jobs running on the (Terrascope) cluster get assigned a default amount of CPU and memory resources. This\nmay not always be enough for your job, for instance when using UDF's. Also for very large jobs, you may want\nto tune your resource settings to optimize for cost.")]),e._v(" "),t("p",[e._v("The example below shows how to start a job with all options set to their default values. It is important to highlight\nthat default settings are subject to change by the backend whenever needed.")]),e._v(" "),t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("job_options "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" \n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"executor-memory"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2G"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"executor-memoryOverhead"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"3G"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"executor-cores"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"task-cpus"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"executor-request-cores"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"400m"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"max-executors"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"100"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"driver-memory"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"8G"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"driver-memoryOverhead"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2G"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"driver-cores"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"udf-dependency-archives"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"logging-threshold"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"info"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\ncube"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("execute_batch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("job_options"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("job_options"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("This is a short overview of the various options:")]),e._v(" "),t("ul",[t("li",[e._v("executor-memory: memory assigned to your workers, for the JVM that executes most predefined processes")]),e._v(" "),t("li",[e._v("executor-memoryOverhead: memory assigned on top of the JVM, for instance to run UDF's")]),e._v(" "),t("li",[e._v("executor-cores: number of CPUs per worker (executor). The number of parallel tasks is executor-cores/task-cpus")]),e._v(" "),t("li",[e._v("task-cpus: CPUs assigned to a single task. UDF's using libraries like Tensorflow can benefit from further parallellization on the level of individual tasks.")]),e._v(" "),t("li",[e._v("executor-request-cores: this settings is only relevant for Kubernetes based backends, allows to overcommit CPU")]),e._v(" "),t("li",[e._v("max-executors: the maximum number of workers assigned to your job. Maximum number of parallel tasks is "),t("code",[e._v("max-executors*executor-cores/task-cpus")]),e._v(". Increasing this can inflate your costs, while not necessarily improving performance!")]),e._v(" "),t("li",[e._v("driver-memory: memory assigned to the spark 'driver' JVM that controls execution of your batch job")]),e._v(" "),t("li",[e._v("driver-memoryOverhead: memory assigned to the spark 'driver' on top of JVM memory, for Python processes.")]),e._v(" "),t("li",[e._v("logging-threshold: the threshold for logging, set to 'info' by default, can be set to 'debug' to generate much more logging")]),e._v(" "),t("li",[e._v("udf-dependency-archives: an array of urls pointing to zip files with extra dependencies, see below")])]),e._v(" "),t("h4",{attrs:{id:"custom-udf-dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-udf-dependencies"}},[e._v("#")]),e._v(" Custom UDF dependencies")]),e._v(" "),t("p",[e._v("User defined functions often depend on (specific versions of) libraries or require small auxiliary data files. The UDF specifications do not yet\ndefine a standardized manner to provide this other than having the ability of selecting from a predefined set of 'runtimes' that than again have a predefined configuration.")]),e._v(" "),t("p",[e._v("The Terrascope/Geotrellis backends solve this via the udf-dependency-archives job option, that allows to specify a list of zip files that should be included in the working directory of the UDF.")]),e._v(" "),t("p",[e._v("This enables the following example workflow for Python UDF's:")]),e._v(" "),t("ol",[t("li",[e._v("Create a Python 'virtualenv' with your dependencies")]),e._v(" "),t("li",[e._v("Based on the 'site-packages' directory of the virtualenv, create a zip file with all dependencies")]),e._v(" "),t("li",[e._v("Upload the zip to a url that can be reached by the backend.")]),e._v(" "),t("li",[e._v("In job options, add "),t("code",[e._v("\"udf-dependency-archives\": ['https://yourhost.com/myEnv.zip#tmp/mydir']")]),e._v(" The "),t("code",[e._v("#tmp/mydir")]),e._v(" suffix indicates where you want to unzip your files, relative to the working directory.")]),e._v(" "),t("li",[e._v("In your UDF, before trying to import libraries, add your directory to the Python path: "),t("code",[e._v("sys.path.insert(0, 'tmp/mydir')")])]),e._v(" "),t("li",[e._v("Now your libraries should be loaded before anything else!")])]),e._v(" "),t("p",[e._v("Known limitations:")]),e._v(" "),t("ul",[t("li",[e._v("Your dependencies need to be compatible with the Python version of the backend, currently 3.8.")]),e._v(" "),t("li",[e._v("Your dependencies need to be compatible with the OS of the backend, currently AlmaLinux 8.")]),e._v(" "),t("li",[e._v("The backend has a limited set of Python dependences that are preloaded, and cannot be changed, such as numpy.")])]),e._v(" "),t("h4",{attrs:{id:"learning-more"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#learning-more"}},[e._v("#")]),e._v(" Learning more")]),e._v(" "),t("p",[e._v("The topic of resource optimization is a complex one, and here we just give a short summary. The goal of openEO is to hide most of these\ndetails from the user, but we realize that advanced users sometimes want to have a bit more insight, so in the spirit of being open, we give some hints.")]),e._v(" "),t("p",[e._v("To learn more about these options, we point to the piece of code that handles this:")]),e._v(" "),t("p",[e._v("https://github.com/Open-EO/openeo-geopyspark-driver/blob/faf5d5364a82e870e42efd2a8aee9742f305da9f/openeogeotrellis/backend.py#L1213")]),e._v(" "),t("p",[e._v("Most memory related options are translated to Apache Spark configuration settings, which are documented here:")]),e._v(" "),t("p",[e._v("https://spark.apache.org/docs/3.3.1/configuration.html#application-properties")]),e._v(" "),t("h3",{attrs:{id:"batch-job-results-on-sentinel-hub"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-results-on-sentinel-hub"}},[e._v("#")]),e._v(" Batch job results on Sentinel Hub")]),e._v(" "),t("p",[e._v("If you are processing data and the underlying back-end is Sentinel Hub, the output extent of your batch job results is currently larger than your input extent because Sentinel Hub processes whole tiles (this may change in the future and the data will be cropped to your input extent).")])],1)}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{349:function(e,t,s){e.exports=s.p+"assets/img/federation.c4cdfa06.png"},574:function(e,t,s){"use strict";s.r(t);var a=s(4),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"federation-aspects-and-known-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#federation-aspects-and-known-issues"}},[e._v("#")]),e._v(" Federation Aspects and Known Issues")]),e._v(" "),t("p",[e._v("openEO Platform is a federated platform. This means that multiple independent 'back-ends',\nwhich all support the openEO interface, are combined into a single instance. From the outside,\nit appears to be a single platform, but you get access to data collections and processing resources from\nmultiple instances.")]),e._v(" "),t("p",[e._v("This image gives you a look at platforms that make up the federation:")]),e._v(" "),t("p",[t("img",{attrs:{src:s(349),alt:"openeo.cloud federation"}})]),e._v(" "),t("p",[e._v("At this time, the federation can not yet entirely hide the fact that it is built out of\nseparate components:")]),e._v(" "),t("ul",[t("li",[e._v("Within the same processing request, you can only use collections from the same back-end")]),e._v(" "),t("li",[e._v("Some processes are not (fully) supported by all back-ends.")]),e._v(" "),t("li",[e._v("If a back-end requires data from an external source, bandwidth limitations may result in slower processing.")])]),e._v(" "),t("h2",{attrs:{id:"data-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-collections"}},[e._v("#")]),e._v(" Data Collections")]),e._v(" "),t("p",[e._v("The federation exposes the "),t("em",[e._v("union")]),e._v(" of the data collections of each of the underlying back-ends.\nWhen a processing request is submitted to the federated platform, the input collections are used to determine to which back-end the actual processing work should be delegated to.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("For the technical discussion on collection federation, see "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-aggregator/issues/5",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open-EO/openeo-aggregator#5"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"terrascope"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#terrascope"}},[e._v("#")]),e._v(" Terrascope")]),e._v(" "),t("p",[e._v("Terrascope hosts a number of collections itself.\nFor coarse resolution data (e.g. 100 m resolution) this is often the full archive,\nwhile for medium resolution (Sentinel 1, 2) data is only offered for selected areas.")]),e._v(" "),t("p",[e._v("Additional data can be processed upon request, if it is not available from another provider.\nThis may result in an additional cost for processing and storage.")]),e._v(" "),t("h3",{attrs:{id:"sentinel-hub"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sentinel-hub"}},[e._v("#")]),e._v(" Sentinel Hub")]),e._v(" "),t("p",[e._v("The Terrascope back-end also integrates with Sentinel Hub (part of Euro Data Cube) to give you\naccess to additional collections.\nThis practically means that data needs to be transferred from Sentinel Hub to the Terrascope data center before it can be processed.\nThis works very well for small areas, or a 100x100km MGRS tile in batch mode,\nbut is not yet recommended for processing medium size to large countries or continents.")]),e._v(" "),t("p",[e._v("The collection metadata of the Terrascope back-end tries to clearly identify which collections are served by Sentinel Hub.")]),e._v(" "),t("h4",{attrs:{id:"commercial-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commercial-data"}},[e._v("#")]),e._v(" Commercial Data")]),e._v(" "),t("p",[e._v("openEO Platform provides direct access to commercial data. Currently, data must be purchased directly through Sentinel Hub (see Sentinel Hub documentation on purchasing commercial data "),t("a",{attrs:{href:"https://docs.sentinel-hub.com/api/latest/api/data-import/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v("), but we are working to support ordering commercial data directly from the platform in the future.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Experimental usage")]),e._v(" "),t("p",[e._v("The below described way of how to connect to commercial data is currently only supported by the pyhton client and experimental. As such the behavior might still change in the future.")])]),e._v(" "),t("p",[e._v("Data is accessed as part of the load_collection process and via a "),t("code",[e._v("featureflags")]),e._v(" argument. To access the data, you must:")]),e._v(" "),t("ul",[t("li",[e._v("select the commercial data provider in "),t("code",[e._v("collection_id")]),e._v(" (e.g. "),t("code",[e._v('collection_id="PLANETSCOPE"')]),e._v(")")]),e._v(" "),t("li",[e._v("set the Sentinel Hub BYOC collection ID ("),t("code",[e._v("byoc-{id}")]),e._v(") as "),t("code",[e._v("featureflags")]),e._v(" argument\n(e.g. with openEO Python client version 0.10.1 or higher:\n"),t("code",[e._v('datacube.result_node().update_arguments(featureflags={"byoc_collection_id": byoc_collection_id})')]),e._v(")")])]),e._v(" "),t("p",[e._v("Full example of loading a commercial data collection:")]),e._v(" "),t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("toc "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" connection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("load_collection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("\n collection_id"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"PLANETSCOPE"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n spatial_extent"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"west"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("104.86")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"south"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8.85")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"east"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("106.11")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"north"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("10.37")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n temporal_extent"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2019-03-01"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2020-12-31"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n bands"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"B3"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\ntoc"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("result_node"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("update_arguments"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("featureflags"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"byoc_collection_id"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" byoc_collection_id"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("List of currently supported commercial data providers:")]),e._v(" "),t("ul",[t("li",[e._v("Airbus Pleiades (ID: "),t("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=PLEIADES",target:"_blank",rel:"noopener noreferrer"}},[e._v("PLEIADES"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Airbus Spot (ID: "),t("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=SPOT",target:"_blank",rel:"noopener noreferrer"}},[e._v("SPOT"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("PlanetScope (ID: "),t("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=PLANETSCOPE",target:"_blank",rel:"noopener noreferrer"}},[e._v("PLANETSCOPE"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("WorldView (ID: "),t("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=WORLDVIEW",target:"_blank",rel:"noopener noreferrer"}},[e._v("WORLDVIEW"),t("OutboundLink")],1),e._v(")")])]),e._v(" "),t("h3",{attrs:{id:"eodc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eodc"}},[e._v("#")]),e._v(" EODC")]),e._v(" "),t("p",[e._v("EODC provides Sentinel-1 (GRH), Sentinel-2 and Sentinel-3 Level-1 globally. On top, pre-processed Level-2 data is\navailable on request (this may result in additional costs). In detail Gamma0 data processed with SNAP and optical ARD\nproducts processed with FORCE are provided.")]),e._v(" "),t("p",[e._v("If the available pre-processed collections are not sufficient, there is on option to perform ARD processing on demand\nwith SNAP respectively FORCE. This may again result in additional costs for processing and storage.")]),e._v(" "),t("p",[e._v("Currently most processes are only available for Level-2 data. Only the ARD processes can be executed on Level-1 data. Also\nonly either ARD processes "),t("strong",[e._v("or")]),e._v(' "standard" processes can be used in one process graph. Combining both types of processes\nis not yet supported. One option to nevertheless achieve a combination of process types is to run ARD on Level-1 data,\nsave the results of the job, and then in a second job load results and perform additional computations.')]),e._v(" "),t("h3",{attrs:{id:"enforce-back-end-selection-for-common-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enforce-back-end-selection-for-common-collections"}},[e._v("#")]),e._v(" Enforce back-end selection for common collections")]),e._v(" "),t("p",[e._v("Some collections are provided by multiple underlying back-ends,\npossibly with differences in spatial or temporal coverage.\nThis is exposed in the collection metadata with "),t("code",[e._v("federation:backends")]),e._v(" summary, e.g.:")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"id"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"WATER_BODIES"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"type"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Collection"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ...\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"summaries"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"federation:backends"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"vito"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"sentinelhub"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ...\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("When a user submits a processing request,\nthe federated platform will try, by default, to automatically determine\nwhich underlying back-end is best choice for the actual processing,\nbased for example on the requested spatial extent.")]),e._v(" "),t("p",[e._v("You can however also enforce the selection of a certain back-end\nby using the metadata property filtering feature\nof the "),t("code",[e._v("load_collection")]),e._v(' process.\nFor example, with the Python client, to enforce the selection of\nthe "sentinelhub" back-end:')]),e._v(" "),t("CodeSwitcher",{attrs:{languages:{py:"Python",r:"R"}},scopedSlots:e._u([{key:"py",fn:function(){return[t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("cube "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" connection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("load_collection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"WATER_BODIES"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\n properties"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"federation:backends"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("lambda")]),e._v(" v"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" v "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("==")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"sentinelhub"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[t("div",{staticClass:"language-r extra-class"},[t("pre",{pre:!0,attrs:{class:"language-r"}},[t("code",[e._v("cube "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" p"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("$")]),e._v("load_collection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("\n id "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"WATER_BODIES"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token ellipsis"}},[e._v("...")]),e._v("\n properties "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" list"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"federation:backends"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("function")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("x"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" x "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("==")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"sentinelhub"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])])]},proxy:!0}])}),e._v(" "),t("h2",{attrs:{id:"processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[e._v("#")]),e._v(" Processes")]),e._v(" "),t("p",[e._v("Each of the underlying back-ends of the federation can define its own set of available processes,\nbut there is in practice a very large common ground across these back-ends.\nAs such, the federation's listing of available processes is the "),t("em",[e._v("intersection")]),e._v("\nof the process sets of each of the underlying back-ends.\nThis is the most straightforward combination with the least surprise.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Advanced/experimental usage")]),e._v(" "),t("p",[e._v("A savvy user that knows which underlying back-end will execute their job\ncan however still submit process graphs with processes that are available\non that back-end but fall outside the intersection,\nas the federation will just forward the process graph as-is to that back-end.")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("For the technical discussion on process federation, see "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-aggregator/issues/4",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open-EO/openeo-aggregator#4"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[e._v("#")]),e._v(" File formats")]),e._v(" "),t("p",[e._v("The federation currently lists the "),t("em",[e._v("union")]),e._v(" of import/export file formats available\nat each of the underlying back-ends.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("For the technical discussion on file format federation, see "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-aggregator/issues/1",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open-EO/openeo-aggregator#1"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"on-demand-preview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#on-demand-preview"}},[e._v("#")]),e._v(" On-demand-preview")]),e._v(" "),t("p",[e._v("Sometimes there is a need to quickly inspect results of a process graph on the map without first running the entire graph first and waiting for the results to be computed and returned. This "),t("code",[e._v("on-demand-preview")]),e._v(" is available in the "),t("a",{attrs:{href:"https://editor.openeo.cloud/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Platform Editor"),t("OutboundLink")],1),e._v(" and the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Python Client*"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("In the Editor you can find the functionality in the "),t("code",[e._v("Web Services")]),e._v(" tab. Use the button"),t("code",[e._v("Show on Map")]),e._v(".")]),e._v(" "),t("p",[e._v("In the Python Client, you can use the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.preview",target:"_blank",rel:"noopener noreferrer"}},[e._v(".preview() method"),t("OutboundLink")],1),e._v(" to create a service with your process graph and display the results in an ipyleaflet Map object. You can find an example implementation in "),t("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/on-demand_preview.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("this Jupyter notebook"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("This functionallity currently only works with collections that are also on the Sentinel Hub backend (Provider > Backend > sentinelhub). In order for the map to display meaningful results, your process graph should:")]),e._v(" "),t("ul",[t("li",[e._v("return one or three bands,")]),e._v(" "),t("li",[e._v("a single temporal extent,")]),e._v(" "),t("li",[e._v("and scale the data to a range so that the output format can adequately save it.")])])]),e._v(" "),t("p",[e._v("*You need to have at least version 0.19.0 installed to use this functionality.")]),e._v(" "),t("h2",{attrs:{id:"batch-jobs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs"}},[e._v("#")]),e._v(" Batch jobs")]),e._v(" "),t("p",[e._v("As discussed above, when the federated platform receives a processing request, such as a batch job,\nit will automatically determine to which back-end this request should be delegated for actual processing.")]),e._v(" "),t("h3",{attrs:{id:"managed-job-splitting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#managed-job-splitting"}},[e._v("#")]),e._v(" Managed job splitting")]),e._v(" "),t("p",[e._v("In addition to this basic delegation feature, the federation also provides more advanced (pre)processing capabilities.\nFor instance, the federation platform can be instructed to split up a single batch job in multiple sub-jobs\nand distribute these across one or more processing back-ends.\nThe federation platform will automatically create, start and keep track of these sub-jobs\nwhile the user just have to interact with a single job: e.g. check the overall processing status,\ndownload the combined result assets, ...")]),e._v(" "),t("p",[e._v("Currently, spatial tile-based splitting is supported as splitting strategy\nand it can be enabled by providing a specific job option when submitting the batch job.\nFor example, using the openEO Python Client, instruct the federation platform to\nsplit up datacube processing in UTM based tiles of 20km by 20km:")]),e._v(" "),t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("job "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" datacube"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("create_job"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("\n job_options"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"tile_grid"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"utm-20km"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v('This creates a virtual master job on the level of the federation platform and real batch jobs\non the appropriate processing back-ends.\nSubsequent interaction (starting the jobs, polling their status, requesting the result assets, ...)\ncan be done through the "master" '),t("code",[e._v("job")]),e._v(" object created above, in the same way as with normal batch jobs.")]),e._v(" "),t("h3",{attrs:{id:"validity-of-signed-urls-in-batch-job-results"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#validity-of-signed-urls-in-batch-job-results"}},[e._v("#")]),e._v(" Validity of signed URLs in batch job results")]),e._v(" "),t("p",[e._v("Batch job results are accessible to the user via signed URLs stored in the result assets. Within the platform,\nthese URLs have a validity (expiry time) of 7 days. Within these 7 days, the results of a batch job can be accessed\nby any person with the URL. Each time a user requests the results from the job endpoint ("),t("code",[e._v("GET /jobs/{job_id}/results")]),e._v("),\na freshly signed URL (valid for 7 days) is created for the result assets.")]),e._v(" "),t("h3",{attrs:{id:"customizing-batch-job-resources-on-terrascope"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#customizing-batch-job-resources-on-terrascope"}},[e._v("#")]),e._v(" Customizing batch job resources on Terrascope")]),e._v(" "),t("p",[e._v("Jobs running on the (Terrascope) cluster get assigned a default amount of CPU and memory resources. This\nmay not always be enough for your job, for instance when using UDF's. Also for very large jobs, you may want\nto tune your resource settings to optimize for cost.")]),e._v(" "),t("p",[e._v("The example below shows how to start a job with all options set to their default values. It is important to highlight\nthat default settings are subject to change by the backend whenever needed.")]),e._v(" "),t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("job_options "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" \n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"executor-memory"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2G"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"executor-memoryOverhead"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"3G"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"executor-cores"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"task-cpus"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"executor-request-cores"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"400m"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"max-executors"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"100"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"driver-memory"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"8G"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"driver-memoryOverhead"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2G"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"driver-cores"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"udf-dependency-archives"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"logging-threshold"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"info"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\ncube"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("execute_batch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("job_options"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("job_options"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("This is a short overview of the various options:")]),e._v(" "),t("ul",[t("li",[e._v("executor-memory: memory assigned to your workers, for the JVM that executes most predefined processes")]),e._v(" "),t("li",[e._v("executor-memoryOverhead: memory assigned on top of the JVM, for instance to run UDF's")]),e._v(" "),t("li",[e._v("executor-cores: number of CPUs per worker (executor). The number of parallel tasks is executor-cores/task-cpus")]),e._v(" "),t("li",[e._v("task-cpus: CPUs assigned to a single task. UDF's using libraries like Tensorflow can benefit from further parallellization on the level of individual tasks.")]),e._v(" "),t("li",[e._v("executor-request-cores: this settings is only relevant for Kubernetes based backends, allows to overcommit CPU")]),e._v(" "),t("li",[e._v("max-executors: the maximum number of workers assigned to your job. Maximum number of parallel tasks is "),t("code",[e._v("max-executors*executor-cores/task-cpus")]),e._v(". Increasing this can inflate your costs, while not necessarily improving performance!")]),e._v(" "),t("li",[e._v("driver-memory: memory assigned to the spark 'driver' JVM that controls execution of your batch job")]),e._v(" "),t("li",[e._v("driver-memoryOverhead: memory assigned to the spark 'driver' on top of JVM memory, for Python processes.")]),e._v(" "),t("li",[e._v("logging-threshold: the threshold for logging, set to 'info' by default, can be set to 'debug' to generate much more logging")]),e._v(" "),t("li",[e._v("udf-dependency-archives: an array of urls pointing to zip files with extra dependencies, see below")])]),e._v(" "),t("h4",{attrs:{id:"custom-udf-dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-udf-dependencies"}},[e._v("#")]),e._v(" Custom UDF dependencies")]),e._v(" "),t("p",[e._v("User defined functions often depend on (specific versions of) libraries or require small auxiliary data files. The UDF specifications do not yet\ndefine a standardized manner to provide this other than having the ability of selecting from a predefined set of 'runtimes' that than again have a predefined configuration.")]),e._v(" "),t("p",[e._v("The Terrascope/Geotrellis backends solve this via the udf-dependency-archives job option, that allows to specify a list of zip files that should be included in the working directory of the UDF.")]),e._v(" "),t("p",[e._v("This enables the following example workflow for Python UDF's:")]),e._v(" "),t("ol",[t("li",[e._v("Create a Python 'virtualenv' with your dependencies")]),e._v(" "),t("li",[e._v("Based on the 'site-packages' directory of the virtualenv, create a zip file with all dependencies")]),e._v(" "),t("li",[e._v("Upload the zip to a url that can be reached by the backend.")]),e._v(" "),t("li",[e._v("In job options, add "),t("code",[e._v("\"udf-dependency-archives\": ['https://yourhost.com/myEnv.zip#tmp/mydir']")]),e._v(" The "),t("code",[e._v("#tmp/mydir")]),e._v(" suffix indicates where you want to unzip your files, relative to the working directory.")]),e._v(" "),t("li",[e._v("In your UDF, before trying to import libraries, add your directory to the Python path: "),t("code",[e._v("sys.path.insert(0, 'tmp/mydir')")])]),e._v(" "),t("li",[e._v("Now your libraries should be loaded before anything else!")])]),e._v(" "),t("p",[e._v("Known limitations:")]),e._v(" "),t("ul",[t("li",[e._v("Your dependencies need to be compatible with the Python version of the backend, currently 3.8.")]),e._v(" "),t("li",[e._v("Your dependencies need to be compatible with the OS of the backend, currently AlmaLinux 8.")]),e._v(" "),t("li",[e._v("The backend has a limited set of Python dependences that are preloaded, and cannot be changed, such as numpy.")])]),e._v(" "),t("h4",{attrs:{id:"learning-more"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#learning-more"}},[e._v("#")]),e._v(" Learning more")]),e._v(" "),t("p",[e._v("The topic of resource optimization is a complex one, and here we just give a short summary. The goal of openEO is to hide most of these\ndetails from the user, but we realize that advanced users sometimes want to have a bit more insight, so in the spirit of being open, we give some hints.")]),e._v(" "),t("p",[e._v("To learn more about these options, we point to the piece of code that handles this:")]),e._v(" "),t("p",[e._v("https://github.com/Open-EO/openeo-geopyspark-driver/blob/faf5d5364a82e870e42efd2a8aee9742f305da9f/openeogeotrellis/backend.py#L1213")]),e._v(" "),t("p",[e._v("Most memory related options are translated to Apache Spark configuration settings, which are documented here:")]),e._v(" "),t("p",[e._v("https://spark.apache.org/docs/3.3.1/configuration.html#application-properties")]),e._v(" "),t("h3",{attrs:{id:"batch-job-results-on-sentinel-hub"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-results-on-sentinel-hub"}},[e._v("#")]),e._v(" Batch job results on Sentinel Hub")]),e._v(" "),t("p",[e._v("If you are processing data and the underlying back-end is Sentinel Hub, the output extent of your batch job results is currently larger than your input extent because Sentinel Hub processes whole tiles (this may change in the future and the data will be cropped to your input extent).")])],1)}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/60.2f68be4f.js b/assets/js/60.fec7b7e8.js similarity index 99% rename from assets/js/60.2f68be4f.js rename to assets/js/60.fec7b7e8.js index f492c7459..133bb5d0f 100644 --- a/assets/js/60.2f68be4f.js +++ b/assets/js/60.fec7b7e8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{366:function(t,a,s){t.exports=s.p+"assets/img/chart.722d5801.png"},596:function(t,a,s){"use strict";s.r(a);var n=s(4),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"no2-monitoring"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#no2-monitoring"}},[t._v("#")]),t._v(" NO₂ monitoring")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://sentinels.copernicus.eu/web/sentinel/missions/sentinel-5p/instrumental-payload",target:"_blank",rel:"noopener noreferrer"}},[t._v("TROPOMI ("),a("strong",[t._v("TROPO")]),t._v("spheric "),a("strong",[t._v("M")]),t._v("onitoring "),a("strong",[t._v("I")]),t._v("nstrument)"),a("OutboundLink")],1),t._v(" is the name of a sensor on board of the "),a("a",{attrs:{href:"https://sentinels.copernicus.eu/web/sentinel/missions/sentinel-5p",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinel-5 Precursor (S5P) satellite"),a("OutboundLink")],1),t._v(", developed to monitor atmospheric chemistry.")]),t._v(" "),a("p",[t._v("This use case analyses Sentinel 5P imagery, focusing in particular on NO₂ measurements. Compared to other variables measured by TROPOMI, NO₂ is of high interest not only because of its direct relation with environmental health, but also because the main sources are typically known, because it is not transported over long distances and because the total column values measured by TROPOMI are strong indication of the ground level values.")]),t._v(" "),a("p",[t._v("This document describes how to analyze NO₂ data on openEO Platform using the Python, JavaScript and R client.\nAdditionally, we've prepared "),a("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/sentinel-5p.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("a basic Jupyter Notebook"),a("OutboundLink")],1),t._v(" for Python and much more advanced R and Python Shiny apps that you can run to analyze and visualize the NO₂ data in various ways.")]),t._v(" "),a("h2",{attrs:{id:"shiny-apps-r-and-python"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#shiny-apps-r-and-python"}},[t._v("#")]),t._v(" Shiny apps (R and Python)")]),t._v(" "),a("p",[t._v("In the Shiny app the NO₂ values can be analyzed globally over a full year. The analysis allows the user to set threshold values for the cloud cover. Gaps due to the cloud removal are filled by a linear interpolation. Noise gets removed by computing 30-day smoothed values, using kernel smoothing of the time series.")]),t._v(" "),a("p",[t._v("The Shiny app allows for three different modes:")]),t._v(" "),a("ul",[a("li",[t._v("Time series analysis / comparison against locally measured data")]),t._v(" "),a("li",[t._v("Map visualization for individual days")]),t._v(" "),a("li",[t._v("Animated maps that highlight differences in space and time")])]),t._v(" "),a("p",[t._v("Currently, the Shiny apps can only run on your local computer but we are looking into offering a hosted version, too. There's also "),a("RouterLink",{attrs:{to:"/getting-started/python/shiny.html"}},[t._v("a guide that explains how to run openEO code in a Python Shiny app in general")]),t._v(".")],1),t._v(" "),a("p",[t._v("You can find the full source code and documentation of the apps in their respective repositories:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/r4openeo-usecases/tree/main/uc3-s5p-dashboard",target:"_blank",rel:"noopener noreferrer"}},[t._v("R Shiny app repository"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/openEOPlatform/s5p-py-dashboard",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python Shiny app repository"),a("OutboundLink")],1)])]),t._v(" "),a("h3",{attrs:{id:"time-series-analyser"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#time-series-analyser"}},[t._v("#")]),t._v(" Time-Series Analyser")]),t._v(" "),a("p",[t._v('The Time-Series Analyser allows one to see the "reduced" time series (min/max/smoothed mean) of Sentinel 5P NO2 data from a given region. Basically, to use this function, the user can pass the coordinates of the bounding box of the area of interest, which are shown in a dynamic map; but also the time frame and the cloud cover to be considered in the computation. The analyser can also do a comparison against locally measured data (for selected areas only).')]),t._v(" "),a("h3",{attrs:{id:"map-maker-for-one-snapshot"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#map-maker-for-one-snapshot"}},[t._v("#")]),t._v(" Map Maker for one Snapshot")]),t._v(" "),a("p",[t._v("If the user desires to look at NO2 data at one given point in time, this function is the developed for this purpose. This second option in the Shiny app allows one to visualize how does a country's pattern in NO2 looks like in a given time, following S5P NO2 data.")]),t._v(" "),a("h3",{attrs:{id:"spacetime-animation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#spacetime-animation"}},[t._v("#")]),t._v(" Spacetime Animation")]),t._v(" "),a("p",[t._v("Here, the user can create and visualise their own spatio-temporal animation of S5P NO2 data. Given a starting and ending date, as well as the quality flag for cloud cover and a given country name, the user may have their own personalised spacetime GIF ready for their usage.")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://github.com/Open-EO/r4openeo-usecases/raw/main/uc3-s5p-dashboard/image/spacetime-animation.gif",alt:"Spacetime animation generated by the dashboard"}})]),t._v(" "),a("h2",{attrs:{id:"basic-no2-analysis-in-python-r-and-javascript"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#basic-no2-analysis-in-python-r-and-javascript"}},[t._v("#")]),t._v(" Basic NO₂ analysis in Python, R and JavaScript")]),t._v(" "),a("p",[t._v("openEO Platform has multiple collections that offer Sentinel-5P data, e.g. for NO₂:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=TERRASCOPE_S5P_L3_NO2_TD_V1",target:"_blank",rel:"noopener noreferrer"}},[t._v("TERRASCOPE_S5P_L3_NO2_TD_V1"),a("OutboundLink")],1),t._v(" - daily, hosted by VITO, pre-processed to remove clouds etc.")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=TERRASCOPE_S5P_L3_NO2_TM_V1",target:"_blank",rel:"noopener noreferrer"}},[t._v("TERRASCOPE_S5P_L3_NO2_TD_V1"),a("OutboundLink")],1),t._v(" - monthly, hosted by VITO, pre-processed to remove clouds etc.")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=TERRASCOPE_S5P_L3_NO2_TY_V1",target:"_blank",rel:"noopener noreferrer"}},[t._v("TERRASCOPE_S5P_L3_NO2_TD_V1"),a("OutboundLink")],1),t._v(" - yearly, hosted by VITO, pre-processed to remove clouds etc.")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=SENTINEL_5P_L2",target:"_blank",rel:"noopener noreferrer"}},[t._v("SENTINEL_5P_L2"),a("OutboundLink")],1),t._v(" - Level 2 data, hosted by Sentinel Hub")])]),t._v(" "),a("p",[a("code",[t._v("SENTINEL_5P_L2")]),t._v(" also contains additional data such as CO, O₂, SO₂ and you can also experiment with those. CO is also available on VITO in Collections such as "),a("code",[t._v("TERRASCOPE_S5P_L3_CO_TD_V1")]),t._v(".")]),t._v(" "),a("p",[t._v("In this example we'll use the daily composites from the "),a("code",[t._v("TERRASCOPE_S5P_L3_NO2_TD_V1")]),t._v(" collection, which is available starting from end of April 2018.")]),t._v(" "),a("h3",{attrs:{id:"_1-load-a-data-cube"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-load-a-data-cube"}},[t._v("#")]),t._v(" 1. Load a data cube")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Attention")]),t._v(" "),a("p",[t._v("This tutorial assumes you have completed the Getting Started guides and are connected and logged in to openEO Platform.\nYour connection object should be stored in a variable named "),a("code",[t._v("connection")]),t._v(".")])]),t._v(" "),a("p",[t._v("First of all, we need to load the data into a datacube. We set the temporal extent to the year 2019 and choose spatial extent, here an area over Münster, Germany.")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("year "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("\nextent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Münster")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.507741544165615")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.507741544165615")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.05013100121914")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.05013100121914")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TERRASCOPE_S5P_L3_NO2_TD_V1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string-interpolation"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('-01-01"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-interpolation"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('-12-31"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" builder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" year "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Münster")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"coordinates"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.507741544165615")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.507741544165615")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.05013100121914")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.05013100121914")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TERRASCOPE_S5P_L3_NO2_TD_V1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("-01-01")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("-12-31")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("p "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nyear "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019"')]),t._v("\nextent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Münster")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.9521131313239675")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.78636868072434")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.971674074614773")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.52897921775278")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.893643204421315")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.609735254808925")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.864301789485104")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.870991335721925")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.9521131313239675")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.78636868072434")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TERRASCOPE_S5P_L3_NO2_TD_V1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("paste"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-01-01"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" sep "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paste"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-12-31"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" sep "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"_2-fill-gaps"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-fill-gaps"}},[t._v("#")]),t._v(" 2. Fill gaps")]),t._v(" "),a("p",[t._v("The data cube may contain no-data values due to the removal of clouds in the pre-processing of the collection.\nWe'll apply a linear interpolation along the temporal dimension:")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array_interpolate_linear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("interpolate")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" builder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_interpolate_linear")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" interpolate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("interpolate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("array_interpolate_linear"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" interpolate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"_3-smoothen-values-optional"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_3-smoothen-values-optional"}},[t._v("#")]),t._v(" 3. Smoothen values (optional)")]),t._v(" "),a("p",[t._v("If you want to smoothen the values to get rid of noise for example, we can run a moving average over a certain amount of days over the temporal dimension.\nIf you want to work on the raw values, you can also omit this step.\nThe "),a("code",[t._v("moving_average_window")]),t._v(" variable specifies the smoothing in number of days.\nYou can choose it freely, but it needs to be an odd integer >= 3.\nIn the example below 31 was chosen to smooth the timeseries with a moving average of a full month.")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("moving_average_window "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\nudf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UDF"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token triple-quoted-string string"}},[t._v('"""\nfrom pandas import Series\nimport numpy as np\n\ndef apply_timeseries(series: Series, context: dict) -> Series:\n return np.convolve(series, np.ones({n})/{n}, mode=\'same\')\n"""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" moving_average_window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" udf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" moving_average_window "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" udf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("\nfrom pandas import Series\nimport numpy as np\n\ndef apply_timeseries(series: Series, context: dict) -> Series:\n return np.convolve(series, np.ones(")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("moving_average_window"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(")/")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("moving_average_window"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(", mode='same')\n")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("run")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" builder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("run_udf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" udf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Python"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" run"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("moving_average_window "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nudf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(' "\nfrom pandas import Series\nimport numpy as np\n\ndef apply_timeseries'),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("series"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" dict"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),t._v(" Series"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n return np.convolve"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" np.ones"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("NN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("NN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mode"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'same'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v('\n"\nrun '),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("run_udf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" runtime "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Python"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" udf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gsub"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NN"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" moving_average_window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" udf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" run"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),a("p",[t._v("A technical detail here is that we run the moving average as a Python UDF, which is custom Python code.\nWe don't have a pre-defined process in openEO yet that easily allows this and as such we fall back to a UDF.\nWe embed the Python code in a string in this example so that you can easily copy the code, but ideally\nyou'd store it in a file and load the UDF from there.")]),t._v(" "),a("p",[t._v("The Python UDF code (for all client languages!) itself is pretty simple:")]),t._v(" "),a("div",{staticClass:"language-py extra-class"},[a("pre",{pre:!0,attrs:{class:"language-py"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" pandas "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Series\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" numpy "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" np\n\nN "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_timeseries")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("dict")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" Series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" np"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("convolve"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" np"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ones"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("N"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("N"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mode"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'same'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("h3",{attrs:{id:"_4-what-do-you-want-to-know"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_4-what-do-you-want-to-know"}},[t._v("#")]),t._v(" 4. What do you want to know?")]),t._v(" "),a("p",[t._v("Now it's time to decide what we actually want to compute and get an insight into.")]),t._v(" "),a("p",[t._v("Currently, the data cube at still has 4 dimensions:\nThe spatial dimensions "),a("code",[t._v("x")]),t._v(" and "),a("code",[t._v("y")]),t._v(" covering the extent of Münster,\nthe temporal dimension "),a("code",[t._v("t")]),t._v(" covering usually about 365 values of the given year, and\nthe band dimension "),a("code",[t._v("bands")]),t._v(" with just a single label "),a("code",[t._v("NO2")]),t._v(".")]),t._v(" "),a("p",[t._v("As the "),a("code",[t._v("bands")]),t._v(" dimension only has a single label it gets dropped automatically during export,\nwhich means we now basically have a series of NO₂ maps, one for each day.\nWe have several options now:")]),t._v(" "),a("ol",[a("li",[t._v("Store the daily maps as netCDF file")]),t._v(" "),a("li",[t._v("Reduce the temporal dimension to get a single map for the year as GeoTIff")]),t._v(" "),a("li",[t._v("Reduce the spatial dimensions to get a timeseries as JSON")])]),t._v(" "),a("h4",{attrs:{id:"_4-1-netcdf-export"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_4-1-netcdf-export"}},[t._v("#")]),t._v(" 4.1 netCDF Export")]),t._v(" "),a("p",[t._v("To store daily maps in a netCDF file, we simply need to store the datacube:")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h4",{attrs:{id:"_4-2-map-for-a-year-as-geotiff"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_4-2-map-for-a-year-as-geotiff"}},[t._v("#")]),t._v(" 4.2 Map for a year as GeoTiff")]),t._v(" "),a("p",[t._v("To get a map with values for a year we need to reduce the temporal dimensions by reducing the values along the temporal dimension.\nYou can run different reducers such as "),a("code",[t._v("mean")]),t._v(" (in the example below), "),a("code",[t._v("max")]),t._v(" or "),a("code",[t._v("min")]),t._v(" so that\nwe get a single value for each pixel.")]),t._v(" "),a("p",[t._v("Lastly, you need to specify that you want to store the result as GeoTiff ("),a("code",[t._v("GTiff")]),t._v(" due to the naming in GDAL).")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("reducer")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" builder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h4",{attrs:{id:"_4-3-timeseries-as-json"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_4-3-timeseries-as-json"}},[t._v("#")]),t._v(" 4.3 Timeseries as JSON")]),t._v(" "),a("p",[t._v("To get a timeseries we need to reduce the spatial dimensions by aggregating them.\nYou can run different aggregation methods such as "),a("code",[t._v("mean")]),t._v(" (in the example below), "),a("code",[t._v("max")]),t._v(" or "),a("code",[t._v("min")]),t._v(" so that\nwe get a single value for each timestep.")]),t._v(" "),a("p",[t._v("Lastly, you need to specify that you want to store the result as JSON.")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("geometries "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("reducer")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" builder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("aggregate_spatial")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("aggregate_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" geometries "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"_5-execute-the-process"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_5-execute-the-process"}},[t._v("#")]),t._v(" 5. Execute the process")]),t._v(" "),a("p",[t._v("Regardless of which of the options you chose in chapter 4, you can now send the process\nto the backend and compute the result.\nFrom simplicity, we simply execute it synchronously and store the result in memory.\nFor the GeoTiff and netCDF files you may want to store them into files though.\nThe JSON output you could directly work with.")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("results "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("computeResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("result "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" compute_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"result"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#result"}},[t._v("#")]),t._v(" Result")]),t._v(" "),a("p",[t._v("If you'd visualize the results of running the timeseries analysis for mean, min and max\ncould results in such a chart:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(366),alt:"min/max/mean NO2 chart"}})])],1)}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{364:function(t,a,s){t.exports=s.p+"assets/img/chart.722d5801.png"},594:function(t,a,s){"use strict";s.r(a);var n=s(4),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"no2-monitoring"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#no2-monitoring"}},[t._v("#")]),t._v(" NO₂ monitoring")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://sentinels.copernicus.eu/web/sentinel/missions/sentinel-5p/instrumental-payload",target:"_blank",rel:"noopener noreferrer"}},[t._v("TROPOMI ("),a("strong",[t._v("TROPO")]),t._v("spheric "),a("strong",[t._v("M")]),t._v("onitoring "),a("strong",[t._v("I")]),t._v("nstrument)"),a("OutboundLink")],1),t._v(" is the name of a sensor on board of the "),a("a",{attrs:{href:"https://sentinels.copernicus.eu/web/sentinel/missions/sentinel-5p",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinel-5 Precursor (S5P) satellite"),a("OutboundLink")],1),t._v(", developed to monitor atmospheric chemistry.")]),t._v(" "),a("p",[t._v("This use case analyses Sentinel 5P imagery, focusing in particular on NO₂ measurements. Compared to other variables measured by TROPOMI, NO₂ is of high interest not only because of its direct relation with environmental health, but also because the main sources are typically known, because it is not transported over long distances and because the total column values measured by TROPOMI are strong indication of the ground level values.")]),t._v(" "),a("p",[t._v("This document describes how to analyze NO₂ data on openEO Platform using the Python, JavaScript and R client.\nAdditionally, we've prepared "),a("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/sentinel-5p.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("a basic Jupyter Notebook"),a("OutboundLink")],1),t._v(" for Python and much more advanced R and Python Shiny apps that you can run to analyze and visualize the NO₂ data in various ways.")]),t._v(" "),a("h2",{attrs:{id:"shiny-apps-r-and-python"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#shiny-apps-r-and-python"}},[t._v("#")]),t._v(" Shiny apps (R and Python)")]),t._v(" "),a("p",[t._v("In the Shiny app the NO₂ values can be analyzed globally over a full year. The analysis allows the user to set threshold values for the cloud cover. Gaps due to the cloud removal are filled by a linear interpolation. Noise gets removed by computing 30-day smoothed values, using kernel smoothing of the time series.")]),t._v(" "),a("p",[t._v("The Shiny app allows for three different modes:")]),t._v(" "),a("ul",[a("li",[t._v("Time series analysis / comparison against locally measured data")]),t._v(" "),a("li",[t._v("Map visualization for individual days")]),t._v(" "),a("li",[t._v("Animated maps that highlight differences in space and time")])]),t._v(" "),a("p",[t._v("Currently, the Shiny apps can only run on your local computer but we are looking into offering a hosted version, too. There's also "),a("RouterLink",{attrs:{to:"/getting-started/python/shiny.html"}},[t._v("a guide that explains how to run openEO code in a Python Shiny app in general")]),t._v(".")],1),t._v(" "),a("p",[t._v("You can find the full source code and documentation of the apps in their respective repositories:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/r4openeo-usecases/tree/main/uc3-s5p-dashboard",target:"_blank",rel:"noopener noreferrer"}},[t._v("R Shiny app repository"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/openEOPlatform/s5p-py-dashboard",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python Shiny app repository"),a("OutboundLink")],1)])]),t._v(" "),a("h3",{attrs:{id:"time-series-analyser"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#time-series-analyser"}},[t._v("#")]),t._v(" Time-Series Analyser")]),t._v(" "),a("p",[t._v('The Time-Series Analyser allows one to see the "reduced" time series (min/max/smoothed mean) of Sentinel 5P NO2 data from a given region. Basically, to use this function, the user can pass the coordinates of the bounding box of the area of interest, which are shown in a dynamic map; but also the time frame and the cloud cover to be considered in the computation. The analyser can also do a comparison against locally measured data (for selected areas only).')]),t._v(" "),a("h3",{attrs:{id:"map-maker-for-one-snapshot"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#map-maker-for-one-snapshot"}},[t._v("#")]),t._v(" Map Maker for one Snapshot")]),t._v(" "),a("p",[t._v("If the user desires to look at NO2 data at one given point in time, this function is the developed for this purpose. This second option in the Shiny app allows one to visualize how does a country's pattern in NO2 looks like in a given time, following S5P NO2 data.")]),t._v(" "),a("h3",{attrs:{id:"spacetime-animation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#spacetime-animation"}},[t._v("#")]),t._v(" Spacetime Animation")]),t._v(" "),a("p",[t._v("Here, the user can create and visualise their own spatio-temporal animation of S5P NO2 data. Given a starting and ending date, as well as the quality flag for cloud cover and a given country name, the user may have their own personalised spacetime GIF ready for their usage.")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://github.com/Open-EO/r4openeo-usecases/raw/main/uc3-s5p-dashboard/image/spacetime-animation.gif",alt:"Spacetime animation generated by the dashboard"}})]),t._v(" "),a("h2",{attrs:{id:"basic-no2-analysis-in-python-r-and-javascript"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#basic-no2-analysis-in-python-r-and-javascript"}},[t._v("#")]),t._v(" Basic NO₂ analysis in Python, R and JavaScript")]),t._v(" "),a("p",[t._v("openEO Platform has multiple collections that offer Sentinel-5P data, e.g. for NO₂:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=TERRASCOPE_S5P_L3_NO2_TD_V1",target:"_blank",rel:"noopener noreferrer"}},[t._v("TERRASCOPE_S5P_L3_NO2_TD_V1"),a("OutboundLink")],1),t._v(" - daily, hosted by VITO, pre-processed to remove clouds etc.")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=TERRASCOPE_S5P_L3_NO2_TM_V1",target:"_blank",rel:"noopener noreferrer"}},[t._v("TERRASCOPE_S5P_L3_NO2_TD_V1"),a("OutboundLink")],1),t._v(" - monthly, hosted by VITO, pre-processed to remove clouds etc.")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=TERRASCOPE_S5P_L3_NO2_TY_V1",target:"_blank",rel:"noopener noreferrer"}},[t._v("TERRASCOPE_S5P_L3_NO2_TD_V1"),a("OutboundLink")],1),t._v(" - yearly, hosted by VITO, pre-processed to remove clouds etc.")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://openeo.cloud/data-collections/view/?id=SENTINEL_5P_L2",target:"_blank",rel:"noopener noreferrer"}},[t._v("SENTINEL_5P_L2"),a("OutboundLink")],1),t._v(" - Level 2 data, hosted by Sentinel Hub")])]),t._v(" "),a("p",[a("code",[t._v("SENTINEL_5P_L2")]),t._v(" also contains additional data such as CO, O₂, SO₂ and you can also experiment with those. CO is also available on VITO in Collections such as "),a("code",[t._v("TERRASCOPE_S5P_L3_CO_TD_V1")]),t._v(".")]),t._v(" "),a("p",[t._v("In this example we'll use the daily composites from the "),a("code",[t._v("TERRASCOPE_S5P_L3_NO2_TD_V1")]),t._v(" collection, which is available starting from end of April 2018.")]),t._v(" "),a("h3",{attrs:{id:"_1-load-a-data-cube"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-load-a-data-cube"}},[t._v("#")]),t._v(" 1. Load a data cube")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Attention")]),t._v(" "),a("p",[t._v("This tutorial assumes you have completed the Getting Started guides and are connected and logged in to openEO Platform.\nYour connection object should be stored in a variable named "),a("code",[t._v("connection")]),t._v(".")])]),t._v(" "),a("p",[t._v("First of all, we need to load the data into a datacube. We set the temporal extent to the year 2019 and choose spatial extent, here an area over Münster, Germany.")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("year "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("\nextent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Münster")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.507741544165615")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.507741544165615")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.05013100121914")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.05013100121914")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TERRASCOPE_S5P_L3_NO2_TD_V1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string-interpolation"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('-01-01"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-interpolation"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('-12-31"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" builder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" year "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Münster")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"coordinates"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.507741544165615")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.507741544165615")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.05013100121914")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.05013100121914")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.737228350528245")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.86687168604513")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TERRASCOPE_S5P_L3_NO2_TD_V1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("-01-01")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("-12-31")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("p "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nyear "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019"')]),t._v("\nextent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Münster")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.9521131313239675")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.78636868072434")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.971674074614773")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.52897921775278")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.893643204421315")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.609735254808925")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.864301789485104")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.870991335721925")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.9521131313239675")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.78636868072434")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TERRASCOPE_S5P_L3_NO2_TD_V1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("paste"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-01-01"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" sep "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paste"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("year"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-12-31"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" sep "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"_2-fill-gaps"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-fill-gaps"}},[t._v("#")]),t._v(" 2. Fill gaps")]),t._v(" "),a("p",[t._v("The data cube may contain no-data values due to the removal of clouds in the pre-processing of the collection.\nWe'll apply a linear interpolation along the temporal dimension:")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array_interpolate_linear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("interpolate")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" builder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_interpolate_linear")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" interpolate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("interpolate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("array_interpolate_linear"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" interpolate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"_3-smoothen-values-optional"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_3-smoothen-values-optional"}},[t._v("#")]),t._v(" 3. Smoothen values (optional)")]),t._v(" "),a("p",[t._v("If you want to smoothen the values to get rid of noise for example, we can run a moving average over a certain amount of days over the temporal dimension.\nIf you want to work on the raw values, you can also omit this step.\nThe "),a("code",[t._v("moving_average_window")]),t._v(" variable specifies the smoothing in number of days.\nYou can choose it freely, but it needs to be an odd integer >= 3.\nIn the example below 31 was chosen to smooth the timeseries with a moving average of a full month.")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("moving_average_window "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\nudf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UDF"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token triple-quoted-string string"}},[t._v('"""\nfrom pandas import Series\nimport numpy as np\n\ndef apply_timeseries(series: Series, context: dict) -> Series:\n return np.convolve(series, np.ones({n})/{n}, mode=\'same\')\n"""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" moving_average_window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" udf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" moving_average_window "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" udf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("\nfrom pandas import Series\nimport numpy as np\n\ndef apply_timeseries(series: Series, context: dict) -> Series:\n return np.convolve(series, np.ones(")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("moving_average_window"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(")/")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("moving_average_window"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(", mode='same')\n")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("run")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" builder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("run_udf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" udf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Python"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" run"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("moving_average_window "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nudf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(' "\nfrom pandas import Series\nimport numpy as np\n\ndef apply_timeseries'),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("series"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" dict"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),t._v(" Series"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n return np.convolve"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" np.ones"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("NN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("NN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mode"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'same'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v('\n"\nrun '),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("run_udf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" runtime "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Python"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" udf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gsub"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NN"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" moving_average_window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" udf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" run"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),a("p",[t._v("A technical detail here is that we run the moving average as a Python UDF, which is custom Python code.\nWe don't have a pre-defined process in openEO yet that easily allows this and as such we fall back to a UDF.\nWe embed the Python code in a string in this example so that you can easily copy the code, but ideally\nyou'd store it in a file and load the UDF from there.")]),t._v(" "),a("p",[t._v("The Python UDF code (for all client languages!) itself is pretty simple:")]),t._v(" "),a("div",{staticClass:"language-py extra-class"},[a("pre",{pre:!0,attrs:{class:"language-py"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" pandas "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Series\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" numpy "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" np\n\nN "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_timeseries")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("dict")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" Series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" np"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("convolve"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("series"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" np"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ones"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("N"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("N"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mode"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'same'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("h3",{attrs:{id:"_4-what-do-you-want-to-know"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_4-what-do-you-want-to-know"}},[t._v("#")]),t._v(" 4. What do you want to know?")]),t._v(" "),a("p",[t._v("Now it's time to decide what we actually want to compute and get an insight into.")]),t._v(" "),a("p",[t._v("Currently, the data cube at still has 4 dimensions:\nThe spatial dimensions "),a("code",[t._v("x")]),t._v(" and "),a("code",[t._v("y")]),t._v(" covering the extent of Münster,\nthe temporal dimension "),a("code",[t._v("t")]),t._v(" covering usually about 365 values of the given year, and\nthe band dimension "),a("code",[t._v("bands")]),t._v(" with just a single label "),a("code",[t._v("NO2")]),t._v(".")]),t._v(" "),a("p",[t._v("As the "),a("code",[t._v("bands")]),t._v(" dimension only has a single label it gets dropped automatically during export,\nwhich means we now basically have a series of NO₂ maps, one for each day.\nWe have several options now:")]),t._v(" "),a("ol",[a("li",[t._v("Store the daily maps as netCDF file")]),t._v(" "),a("li",[t._v("Reduce the temporal dimension to get a single map for the year as GeoTIff")]),t._v(" "),a("li",[t._v("Reduce the spatial dimensions to get a timeseries as JSON")])]),t._v(" "),a("h4",{attrs:{id:"_4-1-netcdf-export"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_4-1-netcdf-export"}},[t._v("#")]),t._v(" 4.1 netCDF Export")]),t._v(" "),a("p",[t._v("To store daily maps in a netCDF file, we simply need to store the datacube:")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h4",{attrs:{id:"_4-2-map-for-a-year-as-geotiff"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_4-2-map-for-a-year-as-geotiff"}},[t._v("#")]),t._v(" 4.2 Map for a year as GeoTiff")]),t._v(" "),a("p",[t._v("To get a map with values for a year we need to reduce the temporal dimensions by reducing the values along the temporal dimension.\nYou can run different reducers such as "),a("code",[t._v("mean")]),t._v(" (in the example below), "),a("code",[t._v("max")]),t._v(" or "),a("code",[t._v("min")]),t._v(" so that\nwe get a single value for each pixel.")]),t._v(" "),a("p",[t._v("Lastly, you need to specify that you want to store the result as GeoTiff ("),a("code",[t._v("GTiff")]),t._v(" due to the naming in GDAL).")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("reducer")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" builder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h4",{attrs:{id:"_4-3-timeseries-as-json"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_4-3-timeseries-as-json"}},[t._v("#")]),t._v(" 4.3 Timeseries as JSON")]),t._v(" "),a("p",[t._v("To get a timeseries we need to reduce the spatial dimensions by aggregating them.\nYou can run different aggregation methods such as "),a("code",[t._v("mean")]),t._v(" (in the example below), "),a("code",[t._v("max")]),t._v(" or "),a("code",[t._v("min")]),t._v(" so that\nwe get a single value for each timestep.")]),t._v(" "),a("p",[t._v("Lastly, you need to specify that you want to store the result as JSON.")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("geometries "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("reducer")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" builder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("aggregate_spatial")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("aggregate_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" geometries "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"_5-execute-the-process"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_5-execute-the-process"}},[t._v("#")]),t._v(" 5. Execute the process")]),t._v(" "),a("p",[t._v("Regardless of which of the options you chose in chapter 4, you can now send the process\nto the backend and compute the result.\nFrom simplicity, we simply execute it synchronously and store the result in memory.\nFor the GeoTiff and netCDF files you may want to store them into files though.\nThe JSON output you could directly work with.")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{py:"Python",js:"JavaScript",r:"R"}},scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("results "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("computeResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[a("div",{staticClass:"language-r extra-class"},[a("pre",{pre:!0,attrs:{class:"language-r"}},[a("code",[t._v("result "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" compute_result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"result"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#result"}},[t._v("#")]),t._v(" Result")]),t._v(" "),a("p",[t._v("If you'd visualize the results of running the timeseries analysis for mean, min and max\ncould results in such a chart:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(364),alt:"min/max/mean NO2 chart"}})])],1)}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/65.2a1bff73.js b/assets/js/65.ee3dfe60.js similarity index 98% rename from assets/js/65.2a1bff73.js rename to assets/js/65.ee3dfe60.js index ebe6dbbaf..9bec28180 100644 --- a/assets/js/65.2a1bff73.js +++ b/assets/js/65.ee3dfe60.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{568:function(e,t,o){"use strict";o.r(t);var a=o(4),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"platform-credit-usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#platform-credit-usage"}},[e._v("#")]),e._v(" Platform credit usage")]),e._v(" "),t("p",[e._v("As a user of openEO platform, you require a subscription to get access. Various packages are "),t("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[e._v("available"),t("OutboundLink")],1),e._v(",\nbut they all come with a number of 'platform credits' that you can consume in various ways.")]),e._v(" "),t("p",[e._v("Currently, credits can be deducted based on:")]),e._v(" "),t("ul",[t("li",[e._v("CPU usage (cores/second)")]),e._v(" "),t("li",[e._v("Memory usage (GB/second)")]),e._v(" "),t("li",[e._v("Storage (GB/day)")]),e._v(" "),t("li",[e._v("Data access to specific layers (e.g. Sentinel Hub or commercial)")]),e._v(" "),t("li",[e._v("Usage of services contributed by third parties, through an 'added value' cost (e.g. per hectare)")])]),e._v(" "),t("p",[e._v("For example, let's say we compute a Sentinel-2 based NDWI for an area of 10 hectares to a series of GeoTiffs (one per observation).")]),e._v(" "),t("p",[e._v("When running this example, the batch job reports the usage, which can be seen in the\n"),t("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("Platform Editor"),t("OutboundLink")],1),e._v(' by clicking the "i" button for an individual batch job:')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/5937096/159861044-d758443f-9056-4474-909f-ebd8400de9dd.png",alt:"Usage Metrics shown in the Platform Editor"}}),e._v(" "),t("figcaption",[e._v("Usage Metrics shown in the Platform Editor for an example batch job.")])]),e._v(" "),t("p",[e._v("13,400,773 mb-seconds corresponds to 3.64 GB hours or 3.64 credits\n5099 CPU seconds corresponds to 1.4 CPU hour which translates to 2.12 credits")]),e._v(" "),t("p",[e._v("Summing this up, we arrive at 5.76 credits. In the current free tier, you receive 1000 credits, which amounts to quite a few of jobs like this!\nIt is important to note however that resource consumption (CPU and memory in this case) is not fixed over time because the\nperformance characteristics of a particular cloud tends to fluctuate depending on overall load.\nCloud providers do try to avoid this, but in general only manage to do so within the limits of a given SLA.")]),e._v(" "),t("h2",{attrs:{id:"platform-credit-rates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#platform-credit-rates"}},[e._v("#")]),e._v(" Platform credit rates")]),e._v(" "),t("p",[e._v("The example above also shows that conversion rates need to be applied to convert resource usage into credits.\nAs openEO platform consists of different software components that are operated on different clouds, these conversion rates are not set to a fixed value\nfor the platform as a whole. For instance, a backend running on more expensive but faster CPU's, might charge more for a CPU hour compared to a provider\nrunning on slower but cheaper CPU's.")]),e._v(" "),t("p",[e._v("While this might seem to make the costs unpredictable, we recommend users to also evaluate their own resource usage.\nIf the cost for a particular job appears relatively high, it might be worthwhile to try running it against a different backend if possible.")]),e._v(" "),t("p",[e._v("The platform will also notify users of changes to the conversion rate, especially if a resource would become more expensive.\nIf you do notice an unexpected increase in credit usage, we recommend contacting the platform through the helpdesk, to ensure that this is expected.")]),e._v(" "),t("h2",{attrs:{id:"estimating-resource-usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#estimating-resource-usage"}},[e._v("#")]),e._v(" Estimating resource usage")]),e._v(" "),t("p",[e._v("Often you want to know up front what kind of costs you will incur by using the platform, especially when generating larger results\nor running the same job at fixed times. For the platform however, this is not trivial to do without actually running your job, because the resource\nconsumption heavily depends on the exact combination of processes that you are using.")]),e._v(" "),t("p",[e._v("Hence, the way to estimate job usage is to start small. For instance, for a query on 10m resolution, you may want to start with a 10ha area,\nand simply run that job. As shown above, this will usually incur a cost of only a few cents. In the worst case, you might discover that this already\ncosts a few euros, but then you would also notice that your job is taking multiple hours to run.")]),e._v(" "),t("p",[e._v("In any case, once you've established an initial cost for a small area, you can extrapolate to a larger area. If simple linear extrapolation shows that\na larger job is affordable, then run the job on larger areas, like 50ha or up to 100x100km. This will show you how your job scales,\nand what kind of costs you will be incurring! If at any point the cost appears unreasonable, please contact the platform!")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{569:function(e,t,o){"use strict";o.r(t);var a=o(4),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"platform-credit-usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#platform-credit-usage"}},[e._v("#")]),e._v(" Platform credit usage")]),e._v(" "),t("p",[e._v("As a user of openEO platform, you require a subscription to get access. Various packages are "),t("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[e._v("available"),t("OutboundLink")],1),e._v(",\nbut they all come with a number of 'platform credits' that you can consume in various ways.")]),e._v(" "),t("p",[e._v("Currently, credits can be deducted based on:")]),e._v(" "),t("ul",[t("li",[e._v("CPU usage (cores/second)")]),e._v(" "),t("li",[e._v("Memory usage (GB/second)")]),e._v(" "),t("li",[e._v("Storage (GB/day)")]),e._v(" "),t("li",[e._v("Data access to specific layers (e.g. Sentinel Hub or commercial)")]),e._v(" "),t("li",[e._v("Usage of services contributed by third parties, through an 'added value' cost (e.g. per hectare)")])]),e._v(" "),t("p",[e._v("For example, let's say we compute a Sentinel-2 based NDWI for an area of 10 hectares to a series of GeoTiffs (one per observation).")]),e._v(" "),t("p",[e._v("When running this example, the batch job reports the usage, which can be seen in the\n"),t("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("Platform Editor"),t("OutboundLink")],1),e._v(' by clicking the "i" button for an individual batch job:')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/5937096/159861044-d758443f-9056-4474-909f-ebd8400de9dd.png",alt:"Usage Metrics shown in the Platform Editor"}}),e._v(" "),t("figcaption",[e._v("Usage Metrics shown in the Platform Editor for an example batch job.")])]),e._v(" "),t("p",[e._v("13,400,773 mb-seconds corresponds to 3.64 GB hours or 3.64 credits\n5099 CPU seconds corresponds to 1.4 CPU hour which translates to 2.12 credits")]),e._v(" "),t("p",[e._v("Summing this up, we arrive at 5.76 credits. In the current free tier, you receive 1000 credits, which amounts to quite a few of jobs like this!\nIt is important to note however that resource consumption (CPU and memory in this case) is not fixed over time because the\nperformance characteristics of a particular cloud tends to fluctuate depending on overall load.\nCloud providers do try to avoid this, but in general only manage to do so within the limits of a given SLA.")]),e._v(" "),t("h2",{attrs:{id:"platform-credit-rates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#platform-credit-rates"}},[e._v("#")]),e._v(" Platform credit rates")]),e._v(" "),t("p",[e._v("The example above also shows that conversion rates need to be applied to convert resource usage into credits.\nAs openEO platform consists of different software components that are operated on different clouds, these conversion rates are not set to a fixed value\nfor the platform as a whole. For instance, a backend running on more expensive but faster CPU's, might charge more for a CPU hour compared to a provider\nrunning on slower but cheaper CPU's.")]),e._v(" "),t("p",[e._v("While this might seem to make the costs unpredictable, we recommend users to also evaluate their own resource usage.\nIf the cost for a particular job appears relatively high, it might be worthwhile to try running it against a different backend if possible.")]),e._v(" "),t("p",[e._v("The platform will also notify users of changes to the conversion rate, especially if a resource would become more expensive.\nIf you do notice an unexpected increase in credit usage, we recommend contacting the platform through the helpdesk, to ensure that this is expected.")]),e._v(" "),t("h2",{attrs:{id:"estimating-resource-usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#estimating-resource-usage"}},[e._v("#")]),e._v(" Estimating resource usage")]),e._v(" "),t("p",[e._v("Often you want to know up front what kind of costs you will incur by using the platform, especially when generating larger results\nor running the same job at fixed times. For the platform however, this is not trivial to do without actually running your job, because the resource\nconsumption heavily depends on the exact combination of processes that you are using.")]),e._v(" "),t("p",[e._v("Hence, the way to estimate job usage is to start small. For instance, for a query on 10m resolution, you may want to start with a 10ha area,\nand simply run that job. As shown above, this will usually incur a cost of only a few cents. In the worst case, you might discover that this already\ncosts a few euros, but then you would also notice that your job is taking multiple hours to run.")]),e._v(" "),t("p",[e._v("In any case, once you've established an initial cost for a small area, you can extrapolate to a larger area. If simple linear extrapolation shows that\na larger job is affordable, then run the job on larger areas, like 50ha or up to 100x100km. This will show you how your job scales,\nand what kind of costs you will be incurring! If at any point the cost appears unreasonable, please contact the platform!")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/66.6cd67341.js b/assets/js/66.6282b2f4.js similarity index 99% rename from assets/js/66.6cd67341.js rename to assets/js/66.6282b2f4.js index f8a38c3e9..2b406e909 100644 --- a/assets/js/66.6cd67341.js +++ b/assets/js/66.6282b2f4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{570:function(e,t,o){"use strict";o.r(t);var a=o(4),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[e._v("#")]),e._v(" Collections")]),e._v(" "),t("p",[e._v("This page describes requirements on STAC collection metadata for backend providers in the openEO platform federation.\nThese requirements should be considered an addition to what is already required by the "),t("a",{attrs:{href:"https://api.openeo.org/#tag/EO-Data-Discovery/operation/describe-collection",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO API"),t("OutboundLink")],1),e._v(" and the "),t("RouterLink",{attrs:{to:"/federation/backends/api.html#profiles"}},[e._v("API profiles")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"collection-availability"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#collection-availability"}},[e._v("#")]),e._v(" Collection availability")]),e._v(" "),t("p",[e._v("The collections are a key asset of the platform, and users need to know what they can expect from a certain collection.\nThe federation relies on openEO collection metadata following the STAC specification to communicate this towards the user. Backend providers\nneed to comply with these requirements for their collection:")]),e._v(" "),t("p",[e._v("The 'experimental' flag from https://stac-extensions.github.io/version/v1.1.0/schema.json needs to be set on experimental collections.\nA collection can be experimental either because there are issues with the actual data or catalog, or because of backend specific issues that make the use of the collection unstable.\nA collection marked as experimental does not need to comply with further requirements.")]),e._v(" "),t("h3",{attrs:{id:"requirements-for-non-experimental-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements-for-non-experimental-collections"}},[e._v("#")]),e._v(" Requirements for non-experimental collections")]),e._v(" "),t("p",[e._v("The main goal for non-experimental features is to achieve high user satisfaction by providing stability & usability "),t("em",[e._v("and")]),e._v(" to comply with federation agreements that make it possible to offer a unified service.\nThe list below makes this more concrete, but is not expected to cover all aspects. It is therefore important that providers, who know their implementations and datasets best, properly judge if a specific collection can be\nconsidered non-experimental.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Collections need to indicate the key 'providers' that are responsible for ensuring access to the data and continuity in the case of active missions. The user may depend on the guarantees offered by these\nproviders with respect to the properties (timeliness, completeness,...) of a specific collection.\nThe providers with role 'host' and 'producer' are mandatory.")])]),e._v(" "),t("li",[t("p",[e._v("The collection description and extents needs to specify known limitations with respect to the original collection. For instance, if only a subset of the full archive is available, this should be indicated. Extents can be rough approximations to avoid requiring very detailed geometry in the metadata.")])]),e._v(" "),t("li",[t("p",[e._v("Collections without an end time are assumed to be active missions. By default, 99% of items in these collections should be available within 48 hours after being published by the producer. This gives users a basic guarantee with respect to timeliness of products.")])]),e._v(" "),t("li",[t("p",[e._v("Collection metadata should be valid STAC metadata and must include all extensions in "),t("code",[e._v("stac_extensions")]),e._v(". Tools such as "),t("a",{attrs:{href:"https://github.com/stac-utils/stac-validator",target:"_blank",rel:"noopener noreferrer"}},[e._v("STAC-validator"),t("OutboundLink")],1),e._v(" can indicate obvious issues.")])]),e._v(" "),t("li",[t("p",[e._v("FAIR principle R1: "),t("a",{attrs:{href:"https://www.go-fair.org/fair-principles/r1-metadata-richly-described-plurality-accurate-relevant-attributes/",target:"_blank",rel:"noopener noreferrer"}},[e._v("(Meta)data are richly described with a plurality of accurate and relevant attributes"),t("OutboundLink")],1)])]),e._v(" "),t("li",[t("p",[e._v("Collections have to follow harmonization guidelines specified below, if applicable.")])]),e._v(" "),t("li",[t("p",[e._v("Collections naming (id, dimensions, bands) should remain constant.")])]),e._v(" "),t("li",[t("p",[e._v("Backwards incompatible changes or removal need to be announced with a lead time of 6 months, together with a migration path.")])]),e._v(" "),t("li",[t("p",[e._v("Minimum availability of non-experimental collections is 98% on a monthly basis. The backend availability is used here if availability is not measured per collection.")])]),e._v(" "),t("li",[t("p",[e._v("Availability of a collection means that a simple process graph (e.g. using load_collection) returns a correct result. Collections may have special conditions to work, for instance in the case of commercial data.")])])]),e._v(" "),t("h2",{attrs:{id:"harmonization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#harmonization"}},[e._v("#")]),e._v(" Harmonization")]),e._v(" "),t("p",[e._v("When back-ends offer/mirror the same datasets, it is required to align names and metadata. For the following collections and metadata an agreement has been achieved. These are all Copernicus Missions, and the standard names refer to the archives prepared and distributed by ESA. If it is not possible/desirable to use this name as collection id, a 'common_name' can be added next to the 'id' property to identify the collection as a standard archive.")]),e._v(" "),t("ul",[t("li",[e._v("SENTINEL1_GRD")]),e._v(" "),t("li",[e._v("SENTINEL2_L1C")]),e._v(" "),t("li",[t("a",{attrs:{href:"#sentinel2-l2a"}},[e._v("SENTINEL2_L2A")])]),e._v(" "),t("li",[e._v("SENTINEL3_OLCI_L1B")])]),e._v(" "),t("h3",{attrs:{id:"common-naming-convention"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#common-naming-convention"}},[e._v("#")]),e._v(" Common naming convention")]),e._v(" "),t("p",[e._v("In order to achieve a uniform structure for all collections on the platform and thus make it easier for users to navigate between collections, it is recommended to follow the common naming convention*:")]),e._v(" "),t("ul",[t("li",[e._v('Names should be written in capital letters ("all caps")')]),e._v(" "),t("li",[e._v("Names should consist of a combination of different optional attributes (see table)")]),e._v(" "),t("li",[e._v("The different attributes should be separated by an underscore")])]),e._v(" "),t("p",[e._v("Very roughly speaking, collections can be divided into two groups (in reality it is more of a spectrum with all gradations in between):")]),e._v(" "),t("ul",[t("li",[e._v("collections containing raw data (or processing levels of that data) measured directly by a satellite (or an other measurement platform) and often distributed by the platform operator (e.g., ESA)")]),e._v(" "),t("li",[e._v("derived collections, which are based on (pre-processed) raw data that has been processed to create a collection with a specific purpose (e.g., a land cover map) and are often distributed by the institution (or a service of an institution) that created the collection")])]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Attribute")]),e._v(" "),t("th",[e._v("Type")]),e._v(" "),t("th",[e._v("Description")]),e._v(" "),t("th",[e._v("Examples")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Provider")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Often used for derived collections produced or order by the listed provider.")]),e._v(" "),t("td",[t("code",[e._v("ESA")]),e._v(", "),t("code",[e._v("CNSE")]),e._v(", "),t("code",[e._v("EMODNET")]),e._v(", "),t("code",[e._v("TERRASCOPE")]),e._v(". "),t("code",[e._v("CAMS")]),e._v(", "),t("code",[e._v("CGLS")])])]),e._v(" "),t("tr",[t("td",[e._v("Satellite/Platform")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Name of the satellite/platform that acquired the data in the collection.")]),e._v(" "),t("td",[t("code",[e._v("SENTINEL2")]),e._v(", "),t("code",[e._v("LANDSAT8")]),e._v(", "),t("code",[e._v("PALSAR2")])])]),e._v(" "),t("tr",[t("td",[e._v("Processing level")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Name of the level to which the data was processed (often processed raw data).")]),e._v(" "),t("td",[t("code",[e._v("L2A")]),e._v(", "),t("code",[e._v("L3")]),e._v(", "),t("code",[e._v("L2_1")])])]),e._v(" "),t("tr",[t("td",[e._v("Version")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Often used for derived collections that are produced in several versions.")]),e._v(" "),t("td",[t("code",[e._v("V1")]),e._v(", "),t("code",[e._v("V2")])])]),e._v(" "),t("tr",[t("td",[e._v("Resolution")]),e._v(" "),t("td",[e._v("string ("),t("code",[e._v("number + unit")]),e._v(" or "),t("code",[e._v("string")]),e._v(")")]),e._v(" "),t("td",[e._v("Usually added, if the resolution is of particular importance for the collection (e.g., novel product with this resolution) for the collection.")]),e._v(" "),t("td",[t("code",[e._v("10M")]),e._v(", "),t("code",[e._v("120M")]),e._v(", "),t("code",[e._v("EUROPE")]),e._v(", "),t("code",[e._v("GLOBAL")])])]),e._v(" "),t("tr",[t("td",[e._v("Product Description")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Human readable description of the data within the collection. Can also be an abbreviation or acronym.")]),e._v(" "),t("td",[t("code",[e._v("LAND_COVER_MAP")]),e._v(", "),t("code",[e._v("WORLDCOVER")]),e._v(", "),t("code",[e._v("NDVI")]),e._v(", "),t("code",[e._v("LAI")])])]),e._v(" "),t("tr",[t("td",[e._v("Year")]),e._v(" "),t("td",[e._v("number")]),e._v(" "),t("td",[e._v("Often used for derived products that where updated in the specified year or created based on data of the specified year.")]),e._v(" "),t("td",[t("code",[e._v("2022")])])])])]),e._v(" "),t("p",[e._v("Collections containing raw data or processing levels of that data often use a combination of satellite/platform and processing level (e.g., "),t("code",[e._v("SENTINEL2_L1C")]),e._v(" ). Derived collections often use a combination of provider and product description (e.g., CNES_LAND_COVER_MAP).")]),e._v(" "),t("p",[e._v("*Some existing collections may not strictly follow this naming convention as they were added to the platform prior to this agreement.")]),e._v(" "),t("h3",{attrs:{id:"sentinel2-l2a"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sentinel2-l2a"}},[e._v("#")]),e._v(" Sentinel2-L2A")]),e._v(" "),t("p",[e._v("The common name for this collection is 'SENTINEL2_L2A'. It refers to the L2A products generated by the Sen2Cor software, which can be configured to be compatible with the ESA generated products. Note that the products in the ESA archive were also processed with different versions of Sen2Cor, so it is not possible to specify a very specific version or configuration of the processing chain.")]),e._v(" "),t("h4",{attrs:{id:"bands"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bands"}},[e._v("#")]),e._v(" Bands")]),e._v(" "),t("p",[e._v("Band names for spectral bands follow the Bxx naming convention used by ESA. For example: B01, B02, B03, B08, B8A, B12")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("SCL")]),e._v(" = the Sen2Cor scene classification band")]),e._v(" "),t("li",[t("code",[e._v("approximateViewAzimuth")]),e._v(" = collective term for the mean and accurate viewing azimuth angle. Depending on which backend is processing the data, the mean angle (for Sentinel Hub) or the accurate angle (for Terrascope) is used. If the accurate angle ("),t("code",[e._v("viewAzimuthAngles")]),e._v(") or the mean angle ("),t("code",[e._v("viewAzimuthMean")]),e._v(") is explicitly specified, the data is processed on the backend that holds the specified band.")]),e._v(" "),t("li",[t("code",[e._v("viewZenithMean")]),e._v(" = collective term for the mean and accurate viewing zenith angle. Depending on which backend is processing the data, the mean angle (for Sentinel Hub) or the accurate angle (for Terrascope) is used. If the accurate angle ("),t("code",[e._v("viewZenithMean")]),e._v(") or the mean angle ("),t("code",[e._v("viewZenithAngles")]),e._v(") is explicitly specified, the data is processed on the backend that holds those bands.")]),e._v(" "),t("li",[t("code",[e._v("sunAzimuthAngles")]),e._v("/"),t("code",[e._v("sunZenithAngles")]),e._v(" = collective term for the exact sun azimuth and sun zenith angle.")])]),e._v(" "),t("h3",{attrs:{id:"common-properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#common-properties"}},[e._v("#")]),e._v(" Common Properties")]),e._v(" "),t("p",[e._v("We list here a set of common properties, that can be relevant for multiple collections. Collections are strongly encouraged to use these properties instead of using a different name for the same property.")]),e._v(" "),t("h4",{attrs:{id:"common"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#common"}},[e._v("#")]),e._v(" Common")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/stac-extensions/sat#satorbit_state",target:"_blank",rel:"noopener noreferrer"}},[e._v("sat:orbit_state"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/stac-extensions/sat#satrelative_orbit",target:"_blank",rel:"noopener noreferrer"}},[e._v("sat:relative_orbit"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"optical-instruments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#optical-instruments"}},[e._v("#")]),e._v(" Optical instruments")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/stac-extensions/eo#eocloud_cover",target:"_blank",rel:"noopener noreferrer"}},[e._v("eo:cloud_cover"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"sar-instruments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sar-instruments"}},[e._v("#")]),e._v(" SAR instruments")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/stac-extensions/sar#item-properties-or-asset-fields",target:"_blank",rel:"noopener noreferrer"}},[e._v("sar:instrument_mode"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{571:function(e,t,o){"use strict";o.r(t);var a=o(4),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[e._v("#")]),e._v(" Collections")]),e._v(" "),t("p",[e._v("This page describes requirements on STAC collection metadata for backend providers in the openEO platform federation.\nThese requirements should be considered an addition to what is already required by the "),t("a",{attrs:{href:"https://api.openeo.org/#tag/EO-Data-Discovery/operation/describe-collection",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO API"),t("OutboundLink")],1),e._v(" and the "),t("RouterLink",{attrs:{to:"/federation/backends/api.html#profiles"}},[e._v("API profiles")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"collection-availability"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#collection-availability"}},[e._v("#")]),e._v(" Collection availability")]),e._v(" "),t("p",[e._v("The collections are a key asset of the platform, and users need to know what they can expect from a certain collection.\nThe federation relies on openEO collection metadata following the STAC specification to communicate this towards the user. Backend providers\nneed to comply with these requirements for their collection:")]),e._v(" "),t("p",[e._v("The 'experimental' flag from https://stac-extensions.github.io/version/v1.1.0/schema.json needs to be set on experimental collections.\nA collection can be experimental either because there are issues with the actual data or catalog, or because of backend specific issues that make the use of the collection unstable.\nA collection marked as experimental does not need to comply with further requirements.")]),e._v(" "),t("h3",{attrs:{id:"requirements-for-non-experimental-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements-for-non-experimental-collections"}},[e._v("#")]),e._v(" Requirements for non-experimental collections")]),e._v(" "),t("p",[e._v("The main goal for non-experimental features is to achieve high user satisfaction by providing stability & usability "),t("em",[e._v("and")]),e._v(" to comply with federation agreements that make it possible to offer a unified service.\nThe list below makes this more concrete, but is not expected to cover all aspects. It is therefore important that providers, who know their implementations and datasets best, properly judge if a specific collection can be\nconsidered non-experimental.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Collections need to indicate the key 'providers' that are responsible for ensuring access to the data and continuity in the case of active missions. The user may depend on the guarantees offered by these\nproviders with respect to the properties (timeliness, completeness,...) of a specific collection.\nThe providers with role 'host' and 'producer' are mandatory.")])]),e._v(" "),t("li",[t("p",[e._v("The collection description and extents needs to specify known limitations with respect to the original collection. For instance, if only a subset of the full archive is available, this should be indicated. Extents can be rough approximations to avoid requiring very detailed geometry in the metadata.")])]),e._v(" "),t("li",[t("p",[e._v("Collections without an end time are assumed to be active missions. By default, 99% of items in these collections should be available within 48 hours after being published by the producer. This gives users a basic guarantee with respect to timeliness of products.")])]),e._v(" "),t("li",[t("p",[e._v("Collection metadata should be valid STAC metadata and must include all extensions in "),t("code",[e._v("stac_extensions")]),e._v(". Tools such as "),t("a",{attrs:{href:"https://github.com/stac-utils/stac-validator",target:"_blank",rel:"noopener noreferrer"}},[e._v("STAC-validator"),t("OutboundLink")],1),e._v(" can indicate obvious issues.")])]),e._v(" "),t("li",[t("p",[e._v("FAIR principle R1: "),t("a",{attrs:{href:"https://www.go-fair.org/fair-principles/r1-metadata-richly-described-plurality-accurate-relevant-attributes/",target:"_blank",rel:"noopener noreferrer"}},[e._v("(Meta)data are richly described with a plurality of accurate and relevant attributes"),t("OutboundLink")],1)])]),e._v(" "),t("li",[t("p",[e._v("Collections have to follow harmonization guidelines specified below, if applicable.")])]),e._v(" "),t("li",[t("p",[e._v("Collections naming (id, dimensions, bands) should remain constant.")])]),e._v(" "),t("li",[t("p",[e._v("Backwards incompatible changes or removal need to be announced with a lead time of 6 months, together with a migration path.")])]),e._v(" "),t("li",[t("p",[e._v("Minimum availability of non-experimental collections is 98% on a monthly basis. The backend availability is used here if availability is not measured per collection.")])]),e._v(" "),t("li",[t("p",[e._v("Availability of a collection means that a simple process graph (e.g. using load_collection) returns a correct result. Collections may have special conditions to work, for instance in the case of commercial data.")])])]),e._v(" "),t("h2",{attrs:{id:"harmonization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#harmonization"}},[e._v("#")]),e._v(" Harmonization")]),e._v(" "),t("p",[e._v("When back-ends offer/mirror the same datasets, it is required to align names and metadata. For the following collections and metadata an agreement has been achieved. These are all Copernicus Missions, and the standard names refer to the archives prepared and distributed by ESA. If it is not possible/desirable to use this name as collection id, a 'common_name' can be added next to the 'id' property to identify the collection as a standard archive.")]),e._v(" "),t("ul",[t("li",[e._v("SENTINEL1_GRD")]),e._v(" "),t("li",[e._v("SENTINEL2_L1C")]),e._v(" "),t("li",[t("a",{attrs:{href:"#sentinel2-l2a"}},[e._v("SENTINEL2_L2A")])]),e._v(" "),t("li",[e._v("SENTINEL3_OLCI_L1B")])]),e._v(" "),t("h3",{attrs:{id:"common-naming-convention"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#common-naming-convention"}},[e._v("#")]),e._v(" Common naming convention")]),e._v(" "),t("p",[e._v("In order to achieve a uniform structure for all collections on the platform and thus make it easier for users to navigate between collections, it is recommended to follow the common naming convention*:")]),e._v(" "),t("ul",[t("li",[e._v('Names should be written in capital letters ("all caps")')]),e._v(" "),t("li",[e._v("Names should consist of a combination of different optional attributes (see table)")]),e._v(" "),t("li",[e._v("The different attributes should be separated by an underscore")])]),e._v(" "),t("p",[e._v("Very roughly speaking, collections can be divided into two groups (in reality it is more of a spectrum with all gradations in between):")]),e._v(" "),t("ul",[t("li",[e._v("collections containing raw data (or processing levels of that data) measured directly by a satellite (or an other measurement platform) and often distributed by the platform operator (e.g., ESA)")]),e._v(" "),t("li",[e._v("derived collections, which are based on (pre-processed) raw data that has been processed to create a collection with a specific purpose (e.g., a land cover map) and are often distributed by the institution (or a service of an institution) that created the collection")])]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Attribute")]),e._v(" "),t("th",[e._v("Type")]),e._v(" "),t("th",[e._v("Description")]),e._v(" "),t("th",[e._v("Examples")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Provider")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Often used for derived collections produced or order by the listed provider.")]),e._v(" "),t("td",[t("code",[e._v("ESA")]),e._v(", "),t("code",[e._v("CNSE")]),e._v(", "),t("code",[e._v("EMODNET")]),e._v(", "),t("code",[e._v("TERRASCOPE")]),e._v(". "),t("code",[e._v("CAMS")]),e._v(", "),t("code",[e._v("CGLS")])])]),e._v(" "),t("tr",[t("td",[e._v("Satellite/Platform")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Name of the satellite/platform that acquired the data in the collection.")]),e._v(" "),t("td",[t("code",[e._v("SENTINEL2")]),e._v(", "),t("code",[e._v("LANDSAT8")]),e._v(", "),t("code",[e._v("PALSAR2")])])]),e._v(" "),t("tr",[t("td",[e._v("Processing level")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Name of the level to which the data was processed (often processed raw data).")]),e._v(" "),t("td",[t("code",[e._v("L2A")]),e._v(", "),t("code",[e._v("L3")]),e._v(", "),t("code",[e._v("L2_1")])])]),e._v(" "),t("tr",[t("td",[e._v("Version")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Often used for derived collections that are produced in several versions.")]),e._v(" "),t("td",[t("code",[e._v("V1")]),e._v(", "),t("code",[e._v("V2")])])]),e._v(" "),t("tr",[t("td",[e._v("Resolution")]),e._v(" "),t("td",[e._v("string ("),t("code",[e._v("number + unit")]),e._v(" or "),t("code",[e._v("string")]),e._v(")")]),e._v(" "),t("td",[e._v("Usually added, if the resolution is of particular importance for the collection (e.g., novel product with this resolution) for the collection.")]),e._v(" "),t("td",[t("code",[e._v("10M")]),e._v(", "),t("code",[e._v("120M")]),e._v(", "),t("code",[e._v("EUROPE")]),e._v(", "),t("code",[e._v("GLOBAL")])])]),e._v(" "),t("tr",[t("td",[e._v("Product Description")]),e._v(" "),t("td",[e._v("string")]),e._v(" "),t("td",[e._v("Human readable description of the data within the collection. Can also be an abbreviation or acronym.")]),e._v(" "),t("td",[t("code",[e._v("LAND_COVER_MAP")]),e._v(", "),t("code",[e._v("WORLDCOVER")]),e._v(", "),t("code",[e._v("NDVI")]),e._v(", "),t("code",[e._v("LAI")])])]),e._v(" "),t("tr",[t("td",[e._v("Year")]),e._v(" "),t("td",[e._v("number")]),e._v(" "),t("td",[e._v("Often used for derived products that where updated in the specified year or created based on data of the specified year.")]),e._v(" "),t("td",[t("code",[e._v("2022")])])])])]),e._v(" "),t("p",[e._v("Collections containing raw data or processing levels of that data often use a combination of satellite/platform and processing level (e.g., "),t("code",[e._v("SENTINEL2_L1C")]),e._v(" ). Derived collections often use a combination of provider and product description (e.g., CNES_LAND_COVER_MAP).")]),e._v(" "),t("p",[e._v("*Some existing collections may not strictly follow this naming convention as they were added to the platform prior to this agreement.")]),e._v(" "),t("h3",{attrs:{id:"sentinel2-l2a"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sentinel2-l2a"}},[e._v("#")]),e._v(" Sentinel2-L2A")]),e._v(" "),t("p",[e._v("The common name for this collection is 'SENTINEL2_L2A'. It refers to the L2A products generated by the Sen2Cor software, which can be configured to be compatible with the ESA generated products. Note that the products in the ESA archive were also processed with different versions of Sen2Cor, so it is not possible to specify a very specific version or configuration of the processing chain.")]),e._v(" "),t("h4",{attrs:{id:"bands"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bands"}},[e._v("#")]),e._v(" Bands")]),e._v(" "),t("p",[e._v("Band names for spectral bands follow the Bxx naming convention used by ESA. For example: B01, B02, B03, B08, B8A, B12")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("SCL")]),e._v(" = the Sen2Cor scene classification band")]),e._v(" "),t("li",[t("code",[e._v("approximateViewAzimuth")]),e._v(" = collective term for the mean and accurate viewing azimuth angle. Depending on which backend is processing the data, the mean angle (for Sentinel Hub) or the accurate angle (for Terrascope) is used. If the accurate angle ("),t("code",[e._v("viewAzimuthAngles")]),e._v(") or the mean angle ("),t("code",[e._v("viewAzimuthMean")]),e._v(") is explicitly specified, the data is processed on the backend that holds the specified band.")]),e._v(" "),t("li",[t("code",[e._v("viewZenithMean")]),e._v(" = collective term for the mean and accurate viewing zenith angle. Depending on which backend is processing the data, the mean angle (for Sentinel Hub) or the accurate angle (for Terrascope) is used. If the accurate angle ("),t("code",[e._v("viewZenithMean")]),e._v(") or the mean angle ("),t("code",[e._v("viewZenithAngles")]),e._v(") is explicitly specified, the data is processed on the backend that holds those bands.")]),e._v(" "),t("li",[t("code",[e._v("sunAzimuthAngles")]),e._v("/"),t("code",[e._v("sunZenithAngles")]),e._v(" = collective term for the exact sun azimuth and sun zenith angle.")])]),e._v(" "),t("h3",{attrs:{id:"common-properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#common-properties"}},[e._v("#")]),e._v(" Common Properties")]),e._v(" "),t("p",[e._v("We list here a set of common properties, that can be relevant for multiple collections. Collections are strongly encouraged to use these properties instead of using a different name for the same property.")]),e._v(" "),t("h4",{attrs:{id:"common"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#common"}},[e._v("#")]),e._v(" Common")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/stac-extensions/sat#satorbit_state",target:"_blank",rel:"noopener noreferrer"}},[e._v("sat:orbit_state"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/stac-extensions/sat#satrelative_orbit",target:"_blank",rel:"noopener noreferrer"}},[e._v("sat:relative_orbit"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"optical-instruments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#optical-instruments"}},[e._v("#")]),e._v(" Optical instruments")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/stac-extensions/eo#eocloud_cover",target:"_blank",rel:"noopener noreferrer"}},[e._v("eo:cloud_cover"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"sar-instruments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sar-instruments"}},[e._v("#")]),e._v(" SAR instruments")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/stac-extensions/sar#item-properties-or-asset-fields",target:"_blank",rel:"noopener noreferrer"}},[e._v("sar:instrument_mode"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/67.0bcdc608.js b/assets/js/67.2d5b26c8.js similarity index 98% rename from assets/js/67.0bcdc608.js rename to assets/js/67.2d5b26c8.js index b8480678a..836e9669f 100644 --- a/assets/js/67.0bcdc608.js +++ b/assets/js/67.2d5b26c8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{573:function(e,t,a){"use strict";a.r(t);var o=a(4),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[e._v("#")]),e._v(" File Formats")]),e._v(" "),t("p",[e._v("openEO Platform offers different file formats for importing and exporting of data.")]),e._v(" "),t("h2",{attrs:{id:"best-practices-file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#best-practices-file-formats"}},[e._v("#")]),e._v(" Best practices file formats")]),e._v(" "),t("p",[e._v("Depending on the data cube that your process graph creates and on your later use case, some file formats are more suitable to export your data ("),t("code",[e._v("save_result")]),e._v(") in than others. Following a brief overview of the most common use cases.")]),e._v(" "),t("h3",{attrs:{id:"raster-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#raster-formats"}},[e._v("#")]),e._v(" Raster Formats")]),e._v(" "),t("ul",[t("li",[e._v("JPEG/PNG: data formats that are well suited for use in media/printing\n"),t("ul",[t("li",[e._v("not georeferenced (therefore only of limited use for further analysis)")]),e._v(" "),t("li",[e._v("limited to 3 (JPEG) or 4 (PNG) output bands (image channels)")]),e._v(" "),t("li",[e._v("usually contains data from 1 timestamp")])])]),e._v(" "),t("li",[e._v("netCDF: ideal for time series data as it stores data in multi-dimensional arrays\n"),t("ul",[t("li",[e._v("georeferenced (x/y dimensions)")]),e._v(" "),t("li",[e._v("can store multiple bands (band dimension)")]),e._v(" "),t("li",[e._v("can store multiple timestamps (time dimension)")]),e._v(" "),t("li",[e._v("self-describing, portable and scalable")])])]),e._v(" "),t("li",[e._v("GeoTiff: ideal for storing several bands in one file in cloud optimized format\n"),t("ul",[t("li",[e._v("georeferenced")]),e._v(" "),t("li",[e._v("can store multiple bands")]),e._v(" "),t("li",[e._v("a single GeoTiff corresponds to one timestamp (in combination with STAC, multi-temporal collections can be supported)")]),e._v(" "),t("li",[e._v("cloud optimized")])])])]),e._v(" "),t("h2",{attrs:{id:"federation-agreement-file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#federation-agreement-file-formats"}},[e._v("#")]),e._v(" Federation agreement file formats")]),e._v(" "),t("p",[e._v("If back-ends offer/mirror the same file formats for both import and export, it is required to align them.")]),e._v(" "),t("p",[e._v("For file export through "),t("code",[e._v("save_result")]),e._v(" for example, the output parameters and the structure of the data that is written to storage needs to be defined.\nFor the following file formats an agreement has been achieved:")]),e._v(" "),t("ul",[t("li",[e._v("GeoTiff")]),e._v(" "),t("li",[e._v("netCDF")])]),e._v(" "),t("p",[e._v("The idea of these guidelines is to align with what the formats and corresponding toolchains support as much as possible.")]),e._v(" "),t("h3",{attrs:{id:"geotiff"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#geotiff"}},[e._v("#")]),e._v(" GeoTiff")]),e._v(" "),t("p",[e._v("Defaults:")]),e._v(" "),t("ul",[t("li",[e._v("a single GeoTiff corresponds to one timestamp (in combination with STAC, multi-temporal collections can be supported)")]),e._v(" "),t("li",[e._v("All datacube bands are stored in the same geotiff")]),e._v(" "),t("li",[e._v("The full spatial extent is written to the same geotiff")]),e._v(" "),t("li",[e._v("Cloud optimized")]),e._v(" "),t("li",[e._v("For ideal support in the Web Editor (and other tools), the following guide is recommended to be followed: "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-web-editor/blob/master/docs/geotiff.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/openeo-web-editor/blob/master/docs/geotiff.md"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"netcdf"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#netcdf"}},[e._v("#")]),e._v(" netCDF")]),e._v(" "),t("p",[e._v("Defaults:")]),e._v(" "),t("ul",[t("li",[e._v("The full datacube is written to a single netCDF.")]),e._v(" "),t("li",[e._v("The openEO dimension metadata is preserved in the netCDF file.")]),e._v(" "),t("li",[e._v("CF conventions (https://cfconventions.org/) are used where applicable.")]),e._v(" "),t("li",[e._v("Data is chunked and compressed")])]),e._v(" "),t("p",[e._v("More information on all supported file formats, can be found "),t("a",{attrs:{href:"../../file-formats"}},[e._v("here")]),e._v(".")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{570:function(e,t,a){"use strict";a.r(t);var o=a(4),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[e._v("#")]),e._v(" File Formats")]),e._v(" "),t("p",[e._v("openEO Platform offers different file formats for importing and exporting of data.")]),e._v(" "),t("h2",{attrs:{id:"best-practices-file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#best-practices-file-formats"}},[e._v("#")]),e._v(" Best practices file formats")]),e._v(" "),t("p",[e._v("Depending on the data cube that your process graph creates and on your later use case, some file formats are more suitable to export your data ("),t("code",[e._v("save_result")]),e._v(") in than others. Following a brief overview of the most common use cases.")]),e._v(" "),t("h3",{attrs:{id:"raster-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#raster-formats"}},[e._v("#")]),e._v(" Raster Formats")]),e._v(" "),t("ul",[t("li",[e._v("JPEG/PNG: data formats that are well suited for use in media/printing\n"),t("ul",[t("li",[e._v("not georeferenced (therefore only of limited use for further analysis)")]),e._v(" "),t("li",[e._v("limited to 3 (JPEG) or 4 (PNG) output bands (image channels)")]),e._v(" "),t("li",[e._v("usually contains data from 1 timestamp")])])]),e._v(" "),t("li",[e._v("netCDF: ideal for time series data as it stores data in multi-dimensional arrays\n"),t("ul",[t("li",[e._v("georeferenced (x/y dimensions)")]),e._v(" "),t("li",[e._v("can store multiple bands (band dimension)")]),e._v(" "),t("li",[e._v("can store multiple timestamps (time dimension)")]),e._v(" "),t("li",[e._v("self-describing, portable and scalable")])])]),e._v(" "),t("li",[e._v("GeoTiff: ideal for storing several bands in one file in cloud optimized format\n"),t("ul",[t("li",[e._v("georeferenced")]),e._v(" "),t("li",[e._v("can store multiple bands")]),e._v(" "),t("li",[e._v("a single GeoTiff corresponds to one timestamp (in combination with STAC, multi-temporal collections can be supported)")]),e._v(" "),t("li",[e._v("cloud optimized")])])])]),e._v(" "),t("h2",{attrs:{id:"federation-agreement-file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#federation-agreement-file-formats"}},[e._v("#")]),e._v(" Federation agreement file formats")]),e._v(" "),t("p",[e._v("If back-ends offer/mirror the same file formats for both import and export, it is required to align them.")]),e._v(" "),t("p",[e._v("For file export through "),t("code",[e._v("save_result")]),e._v(" for example, the output parameters and the structure of the data that is written to storage needs to be defined.\nFor the following file formats an agreement has been achieved:")]),e._v(" "),t("ul",[t("li",[e._v("GeoTiff")]),e._v(" "),t("li",[e._v("netCDF")])]),e._v(" "),t("p",[e._v("The idea of these guidelines is to align with what the formats and corresponding toolchains support as much as possible.")]),e._v(" "),t("h3",{attrs:{id:"geotiff"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#geotiff"}},[e._v("#")]),e._v(" GeoTiff")]),e._v(" "),t("p",[e._v("Defaults:")]),e._v(" "),t("ul",[t("li",[e._v("a single GeoTiff corresponds to one timestamp (in combination with STAC, multi-temporal collections can be supported)")]),e._v(" "),t("li",[e._v("All datacube bands are stored in the same geotiff")]),e._v(" "),t("li",[e._v("The full spatial extent is written to the same geotiff")]),e._v(" "),t("li",[e._v("Cloud optimized")]),e._v(" "),t("li",[e._v("For ideal support in the Web Editor (and other tools), the following guide is recommended to be followed: "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-web-editor/blob/master/docs/geotiff.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/openeo-web-editor/blob/master/docs/geotiff.md"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"netcdf"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#netcdf"}},[e._v("#")]),e._v(" netCDF")]),e._v(" "),t("p",[e._v("Defaults:")]),e._v(" "),t("ul",[t("li",[e._v("The full datacube is written to a single netCDF.")]),e._v(" "),t("li",[e._v("The openEO dimension metadata is preserved in the netCDF file.")]),e._v(" "),t("li",[e._v("CF conventions (https://cfconventions.org/) are used where applicable.")]),e._v(" "),t("li",[e._v("Data is chunked and compressed")])]),e._v(" "),t("p",[e._v("More information on all supported file formats, can be found "),t("a",{attrs:{href:"../../file-formats"}},[e._v("here")]),e._v(".")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/69.cc422707.js b/assets/js/69.09f05241.js similarity index 79% rename from assets/js/69.cc422707.js rename to assets/js/69.09f05241.js index 12674cdf4..26485efa0 100644 --- a/assets/js/69.cc422707.js +++ b/assets/js/69.09f05241.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{574:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("FileFormatsSpec")],1)}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{575:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("FileFormatsSpec")],1)}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/72.c90aabf1.js b/assets/js/72.0f5593b7.js similarity index 99% rename from assets/js/72.c90aabf1.js rename to assets/js/72.0f5593b7.js index c30ba6cb7..883754c23 100644 --- a/assets/js/72.c90aabf1.js +++ b/assets/js/72.0f5593b7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{578:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"get-started-with-the-openeo-javascript-client"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-javascript-client"}},[t._v("#")]),t._v(" Get started with the openEO JavaScript Client")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("To access the processing infrastructure you need an openEO Platform account. Read all about the service offering including our free trial offer "),s("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),s("p",[t._v("The openEO JavaScript Client can be used in all modern browsers (excludes Internet Explorer) and all maintained Node.js versions (>= 10.x).\nIt can also been used for mobile app development with the "),s("a",{attrs:{href:"https://ionicframework.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Ionic Framework"),s("OutboundLink")],1),t._v(", for example.")]),t._v(" "),s("p",[t._v("The easiest way to try out the client is using one of the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/tree/v2.0.0/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("examples"),s("OutboundLink")],1),t._v(".\nAlternatively, you can create an HTML file and include the client with the following HTML "),s("code",[t._v("script")]),t._v(" tags:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/axios@0.21/dist/axios.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/@openeo/js-client@2/openeo.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("This gives you a minified version for production environments. If you'd like a better development experience, use the following code:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/axios@0.21/dist/axios.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/@openeo/js-client@2/openeo.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("If you are working on a Node.js application or you are using a Node.js-based build tool for web development (e.g. Webpack), you can install the client via "),s("a",{attrs:{href:"https://npmjs.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("npm"),s("OutboundLink")],1),t._v(" by using the following command:")]),t._v(" "),s("div",{staticClass:"language-shell script extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" @openeo/js-client\n")])])]),s("p",[t._v("Afterwards you can load the library. Depending on whether you are directly working in Node.js or are just using a Node.js build tool, the import can be different. Please inform yourself which import is suited for your project.")]),t._v(" "),s("p",[t._v("This is usually used directly in Node.js:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("This may be used in build tools such as Webpack:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now that the installation was successfully finished, we can now connect to openEO compliant back-ends.\nIn the following chapters we quickly walk through the main features of the JavaScript client.")]),t._v(" "),s("p",[t._v("If you have trouble installing the client, feel ecouraged to leave an issue at the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub project"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"connecting-to-openeo-platform"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#connecting-to-openeo-platform"}},[t._v("#")]),t._v(" Connecting to openEO Platform")]),t._v(" "),s("p",[t._v("First we need to establish a connection to the openEO Platform back-end, which is available at "),s("code",[t._v("https://openeo.cloud")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.cloud"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("The JavaScript client uses "),s("a",{attrs:{href:"https://medium.com/jspoint/javascript-promises-and-async-await-as-fast-as-possible-d7c8c8ff0abc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Promises (async/await)"),s("OutboundLink")],1),t._v(". So there are two ways to express the code above:")]),t._v(" "),s("p",[t._v("Promises:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.cloud"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("con")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Success")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("async/await:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.cloud"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Success")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("To simplify the code here, we use async/await in all examples and don't catch errors. So we assume you run the code in an async function and also in a try/catch block.")])]),t._v(" "),s("p",[t._v("After establishing the connection to the back-end, it can be explored using the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Connection.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Connection object"),s("OutboundLink")],1),t._v(" returned. The basic service's metadata (capabilities) can be accessed via")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" info "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("This allows to request a couple of "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Capabilities.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("different information"),s("OutboundLink")],1),t._v(", like API version, description, related links or the billing plans. You can print some of these information to the console as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"API Version: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Description: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Billing plans:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ninfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listPlans")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("plan")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("plan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("plan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Related links:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ninfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("links")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("link")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("href"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"collections"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),s("p",[t._v("Collections represent the basic data the back-end provides (e.g. Sentinel 2 collection).\nCollections are used as input data for job executions ("),s("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#eo-data-collections",target:"_blank",rel:"noopener noreferrer"}},[t._v("more info on collections"),s("OutboundLink")],1),t._v(").\nWith the following code snippet you can print all 400+ available collection names and their summary.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Available Collections:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listCollections")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nresponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("collections"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("collection")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("summary"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("To get detailed information about a single collection, you can pass any of the collection IDs requested earlier to "),s("code",[t._v("describeCollection")]),t._v(" and get a full object of "),s("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/tree/v1.0.0/collection-spec/collection-spec.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("STAC compliant Collection metadata"),s("OutboundLink")],1),t._v(" back.\nIn this example we request information about the Sentinel-1 GRD data from Terrascope:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeCollection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The collections descriptions returned by "),s("code",[t._v("listCollections")]),t._v(" are usually not complete. To get the full set of metadata you should always use "),s("code",[t._v("describeCollection")]),t._v(".")]),t._v(" "),s("h3",{attrs:{id:"processes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),s("p",[t._v("Processes in openEO are small tasks that can be applied on (EO) data.\nThe input of a process might be the output of another process, so that several connected processes form a new (user-defined) process itself.\nTherefore, a process resembles the smallest unit of task descriptions in openEO ("),s("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("more details on processes"),s("OutboundLink")],1),t._v(").\nWith the following code snippet you can print all available process IDs and their summaries.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Available Collections:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listProcesses")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nresponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("process")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("summary"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("In contrast to the collections, the process descriptions returned by "),s("code",[t._v("listProcesses")]),t._v(" are complete.\nThere's no need to call "),s("code",[t._v("describeProcess")]),t._v(" to get the full set of metadata.\n"),s("code",[t._v("describeProcess")]),t._v(" is just a convenience function to get a single process from "),s("code",[t._v("listProcesses")]),t._v(".\nIn this example we request the process specification for the "),s("code",[t._v("apply")]),t._v(" process:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apply"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("For a graphical overview of the openEO processes, please see our "),s("RouterLink",{attrs:{to:"/processes/"}},[t._v("online documentation")])],1),t._v(" "),s("h2",{attrs:{id:"authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),s("p",[t._v("In the code snippets above, authentication is usually not necessary, since we only fetch general information about the back-end.\nTo run your own jobs at the back-end or to access job results, you need to authenticate at the back-end.")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect (OIDC)"),s("OutboundLink")],1),t._v(" authentication can be used to authenticate with openEO Platform.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Action required")]),t._v(" "),s("p",[s("strong",[t._v("Unfortunately, you need to request a "),s("em",[t._v("Client ID")]),t._v(" for this from the openEO Platform support due to technical reasons!")]),t._v("\nOnce you have received the "),s("em",[t._v("Client ID")]),t._v(", you can can continue with the instructions below.")])]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),s("p",[t._v("If you have included the library using HTML "),s("code",[t._v("script")]),t._v(" tags, then you need to include the following OIDC client before the openEO client:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/oidc-client@1/lib/oidc-client.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("No further action is required, if you have installed the client via npm.")])]),t._v(" "),s("p",[t._v("As OpenID Connect authentication is a bit more complex and depends on the environment your are using it in (e.g. Browser or Node), please refer to the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/OidcProvider.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaScript client documentation"),s("OutboundLink")],1),t._v(" and the documentation to join the "),s("RouterLink",{attrs:{to:"/join/free_trial.html"}},[t._v("Free Trial")]),t._v(".")],1),t._v(" "),s("h2",{attrs:{id:"creating-a-user-defined-process"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-defined-process"}},[t._v("#")]),t._v(" Creating a (user-defined) process")]),t._v(" "),s("p",[t._v("Now that we know how to discover the back-end and how to authenticate, lets continue by creating a new batch job to process some data.\nFirst we need to create a user-defined process and for that a process builder is the easiest method.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("With the builder, a "),s("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#spatial-datacubes",target:"_blank",rel:"noopener noreferrer"}},[t._v("datacube"),s("OutboundLink")],1),t._v(" can be initialized by selecting a collection from the back-end with the process "),s("code",[t._v("load_collection")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v('This results in a datacube containing the "SENTINEL1_GRD" data restricted to the given spatial extent, the given temporal extend and the given bands .')]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("You can also filter the datacube at a later stage by using the following filter methods:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bbox")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Still, it is recommended to always use the filters in "),s("code",[t._v("load_collection")]),t._v(" to avoid loading too much data upfront.")])]),t._v(" "),s("p",[t._v("Having the input data ready, we want to apply a process on the datacube, which returns a datacube with the process applied:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" min"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The datacube is now reduced by the time dimension named "),s("code",[t._v("t")]),t._v(', by taking the minimum value of the timeseries values.\nNow the datacube has no time dimension left.\nOther so called "reducer" processes exist, e.g. for computing maximum and mean values.')]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("Everything applied to the datacube at this point is neither executed locally on your machine nor executed on the back-end.\nIt just defines the input data and process chain the back-end needs to apply when it sends the datacube to the back-end and executes it there.\nHow this can be done is the topic of the next chapter.")])]),t._v(" "),s("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"batch-job-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-management"}},[t._v("#")]),t._v(" Batch Job Management")]),t._v(" "),s("p",[t._v("After you finished working on your (user-defined) process, we can now send it to the back-end and start the execution.\nIn openEO, an execution of a (user-defined) process (here defined using the process builder) is called a "),s("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#data-processing-modes",target:"_blank",rel:"noopener noreferrer"}},[t._v("(batch) job"),s("OutboundLink")],1),t._v(".\nTherefore, we need to create a job at the back-end using our datacube, giving it the title "),s("code",[t._v("Example Title")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Example Title"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("It can be annoying to manage and monitor batch jobs via code.\nIf you want to use an interface for your batch jobs (or other resources) that is easier to use, you can also open the "),s("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Platform Editor"),s("OutboundLink")],1),t._v('.\nAfter login, you\'ll be able to manage and monitor your batch jobs in a near-realtime interactive environment; Look out for the "Data Processing" tab.')])]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("createJob")]),t._v(" method sends all necessary information to the back-end and creates a new job, which gets returned.\nAfter this, the job is just created, but has not started the execution at the back-end yet.\nIt needs to be queued for processing explicitly:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("startJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now the execution of the job can be monitored by requesting the job status and the log files every once in a while (30 seconds in this example):")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stopFn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("monitorJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" logs")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n logs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("log")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("level"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The monitoring stops automatically once the job has finished, was canceled or errored out.\nBut with the return value of the "),s("code",[t._v("monitorJob")]),t._v(" function, you can also stop monitoring the job manually:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stopFn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("When the job is finished, calling "),s("code",[t._v("listResults")]),t._v(" gets you the URLs to the results.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" urls "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("This only works if the job execution has finished.\nWe recommend to use "),s("code",[t._v("listResults")]),t._v(" in combination with "),s("code",[t._v("monitorJob")]),t._v(", for example as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stopFn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("monitorJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" logs")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"finished"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" urls "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n urls"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("url")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Download from: ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("href"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("p",[t._v("There's also the method "),s("code",[t._v("downloadResults")]),t._v(" to download the results directly.\nUnfortunately, you can only download files from a Node.js environment where file access to your local drive is possible.\nIn a Browser environment, it is also an option to download the STAC Item or Collection for the results using the "),s("code",[t._v("getResultsAsStac")]),t._v(" method and point a "),s("a",{attrs:{href:"https://stacindex.org/ecosystem?category=Client",target:"_blank",rel:"noopener noreferrer"}},[t._v("STAC client"),s("OutboundLink")],1),t._v(" to it for downloading.")]),t._v(" "),s("h2",{attrs:{id:"additional-information"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Examples"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{580:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"get-started-with-the-openeo-javascript-client"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-javascript-client"}},[t._v("#")]),t._v(" Get started with the openEO JavaScript Client")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("To access the processing infrastructure you need an openEO Platform account. Read all about the service offering including our free trial offer "),s("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),s("p",[t._v("The openEO JavaScript Client can be used in all modern browsers (excludes Internet Explorer) and all maintained Node.js versions (>= 10.x).\nIt can also been used for mobile app development with the "),s("a",{attrs:{href:"https://ionicframework.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Ionic Framework"),s("OutboundLink")],1),t._v(", for example.")]),t._v(" "),s("p",[t._v("The easiest way to try out the client is using one of the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/tree/v2.0.0/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("examples"),s("OutboundLink")],1),t._v(".\nAlternatively, you can create an HTML file and include the client with the following HTML "),s("code",[t._v("script")]),t._v(" tags:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/axios@0.21/dist/axios.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/@openeo/js-client@2/openeo.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("This gives you a minified version for production environments. If you'd like a better development experience, use the following code:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/axios@0.21/dist/axios.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/@openeo/js-client@2/openeo.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("If you are working on a Node.js application or you are using a Node.js-based build tool for web development (e.g. Webpack), you can install the client via "),s("a",{attrs:{href:"https://npmjs.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("npm"),s("OutboundLink")],1),t._v(" by using the following command:")]),t._v(" "),s("div",{staticClass:"language-shell script extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" @openeo/js-client\n")])])]),s("p",[t._v("Afterwards you can load the library. Depending on whether you are directly working in Node.js or are just using a Node.js build tool, the import can be different. Please inform yourself which import is suited for your project.")]),t._v(" "),s("p",[t._v("This is usually used directly in Node.js:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("This may be used in build tools such as Webpack:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now that the installation was successfully finished, we can now connect to openEO compliant back-ends.\nIn the following chapters we quickly walk through the main features of the JavaScript client.")]),t._v(" "),s("p",[t._v("If you have trouble installing the client, feel ecouraged to leave an issue at the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub project"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"connecting-to-openeo-platform"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#connecting-to-openeo-platform"}},[t._v("#")]),t._v(" Connecting to openEO Platform")]),t._v(" "),s("p",[t._v("First we need to establish a connection to the openEO Platform back-end, which is available at "),s("code",[t._v("https://openeo.cloud")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.cloud"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("The JavaScript client uses "),s("a",{attrs:{href:"https://medium.com/jspoint/javascript-promises-and-async-await-as-fast-as-possible-d7c8c8ff0abc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Promises (async/await)"),s("OutboundLink")],1),t._v(". So there are two ways to express the code above:")]),t._v(" "),s("p",[t._v("Promises:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.cloud"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("con")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Success")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("async/await:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.cloud"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Success")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("To simplify the code here, we use async/await in all examples and don't catch errors. So we assume you run the code in an async function and also in a try/catch block.")])]),t._v(" "),s("p",[t._v("After establishing the connection to the back-end, it can be explored using the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Connection.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Connection object"),s("OutboundLink")],1),t._v(" returned. The basic service's metadata (capabilities) can be accessed via")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" info "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("This allows to request a couple of "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Capabilities.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("different information"),s("OutboundLink")],1),t._v(", like API version, description, related links or the billing plans. You can print some of these information to the console as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"API Version: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Description: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Billing plans:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ninfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listPlans")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("plan")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("plan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("plan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Related links:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ninfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("links")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("link")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("href"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"collections"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),s("p",[t._v("Collections represent the basic data the back-end provides (e.g. Sentinel 2 collection).\nCollections are used as input data for job executions ("),s("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#eo-data-collections",target:"_blank",rel:"noopener noreferrer"}},[t._v("more info on collections"),s("OutboundLink")],1),t._v(").\nWith the following code snippet you can print all 400+ available collection names and their summary.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Available Collections:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listCollections")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nresponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("collections"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("collection")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("summary"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("To get detailed information about a single collection, you can pass any of the collection IDs requested earlier to "),s("code",[t._v("describeCollection")]),t._v(" and get a full object of "),s("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/tree/v1.0.0/collection-spec/collection-spec.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("STAC compliant Collection metadata"),s("OutboundLink")],1),t._v(" back.\nIn this example we request information about the Sentinel-1 GRD data from Terrascope:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeCollection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The collections descriptions returned by "),s("code",[t._v("listCollections")]),t._v(" are usually not complete. To get the full set of metadata you should always use "),s("code",[t._v("describeCollection")]),t._v(".")]),t._v(" "),s("h3",{attrs:{id:"processes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),s("p",[t._v("Processes in openEO are small tasks that can be applied on (EO) data.\nThe input of a process might be the output of another process, so that several connected processes form a new (user-defined) process itself.\nTherefore, a process resembles the smallest unit of task descriptions in openEO ("),s("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("more details on processes"),s("OutboundLink")],1),t._v(").\nWith the following code snippet you can print all available process IDs and their summaries.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Available Collections:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listProcesses")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nresponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("process")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("summary"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("In contrast to the collections, the process descriptions returned by "),s("code",[t._v("listProcesses")]),t._v(" are complete.\nThere's no need to call "),s("code",[t._v("describeProcess")]),t._v(" to get the full set of metadata.\n"),s("code",[t._v("describeProcess")]),t._v(" is just a convenience function to get a single process from "),s("code",[t._v("listProcesses")]),t._v(".\nIn this example we request the process specification for the "),s("code",[t._v("apply")]),t._v(" process:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apply"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("For a graphical overview of the openEO processes, please see our "),s("RouterLink",{attrs:{to:"/processes/"}},[t._v("online documentation")])],1),t._v(" "),s("h2",{attrs:{id:"authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),s("p",[t._v("In the code snippets above, authentication is usually not necessary, since we only fetch general information about the back-end.\nTo run your own jobs at the back-end or to access job results, you need to authenticate at the back-end.")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect (OIDC)"),s("OutboundLink")],1),t._v(" authentication can be used to authenticate with openEO Platform.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Action required")]),t._v(" "),s("p",[s("strong",[t._v("Unfortunately, you need to request a "),s("em",[t._v("Client ID")]),t._v(" for this from the openEO Platform support due to technical reasons!")]),t._v("\nOnce you have received the "),s("em",[t._v("Client ID")]),t._v(", you can can continue with the instructions below.")])]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),s("p",[t._v("If you have included the library using HTML "),s("code",[t._v("script")]),t._v(" tags, then you need to include the following OIDC client before the openEO client:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/oidc-client@1/lib/oidc-client.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("No further action is required, if you have installed the client via npm.")])]),t._v(" "),s("p",[t._v("As OpenID Connect authentication is a bit more complex and depends on the environment your are using it in (e.g. Browser or Node), please refer to the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/OidcProvider.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaScript client documentation"),s("OutboundLink")],1),t._v(" and the documentation to join the "),s("RouterLink",{attrs:{to:"/join/free_trial.html"}},[t._v("Free Trial")]),t._v(".")],1),t._v(" "),s("h2",{attrs:{id:"creating-a-user-defined-process"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-defined-process"}},[t._v("#")]),t._v(" Creating a (user-defined) process")]),t._v(" "),s("p",[t._v("Now that we know how to discover the back-end and how to authenticate, lets continue by creating a new batch job to process some data.\nFirst we need to create a user-defined process and for that a process builder is the easiest method.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("With the builder, a "),s("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#spatial-datacubes",target:"_blank",rel:"noopener noreferrer"}},[t._v("datacube"),s("OutboundLink")],1),t._v(" can be initialized by selecting a collection from the back-end with the process "),s("code",[t._v("load_collection")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v('This results in a datacube containing the "SENTINEL1_GRD" data restricted to the given spatial extent, the given temporal extend and the given bands .')]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("You can also filter the datacube at a later stage by using the following filter methods:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bbox")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Still, it is recommended to always use the filters in "),s("code",[t._v("load_collection")]),t._v(" to avoid loading too much data upfront.")])]),t._v(" "),s("p",[t._v("Having the input data ready, we want to apply a process on the datacube, which returns a datacube with the process applied:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" min"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The datacube is now reduced by the time dimension named "),s("code",[t._v("t")]),t._v(', by taking the minimum value of the timeseries values.\nNow the datacube has no time dimension left.\nOther so called "reducer" processes exist, e.g. for computing maximum and mean values.')]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("Everything applied to the datacube at this point is neither executed locally on your machine nor executed on the back-end.\nIt just defines the input data and process chain the back-end needs to apply when it sends the datacube to the back-end and executes it there.\nHow this can be done is the topic of the next chapter.")])]),t._v(" "),s("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"batch-job-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-management"}},[t._v("#")]),t._v(" Batch Job Management")]),t._v(" "),s("p",[t._v("After you finished working on your (user-defined) process, we can now send it to the back-end and start the execution.\nIn openEO, an execution of a (user-defined) process (here defined using the process builder) is called a "),s("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#data-processing-modes",target:"_blank",rel:"noopener noreferrer"}},[t._v("(batch) job"),s("OutboundLink")],1),t._v(".\nTherefore, we need to create a job at the back-end using our datacube, giving it the title "),s("code",[t._v("Example Title")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Example Title"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("It can be annoying to manage and monitor batch jobs via code.\nIf you want to use an interface for your batch jobs (or other resources) that is easier to use, you can also open the "),s("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Platform Editor"),s("OutboundLink")],1),t._v('.\nAfter login, you\'ll be able to manage and monitor your batch jobs in a near-realtime interactive environment; Look out for the "Data Processing" tab.')])]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("createJob")]),t._v(" method sends all necessary information to the back-end and creates a new job, which gets returned.\nAfter this, the job is just created, but has not started the execution at the back-end yet.\nIt needs to be queued for processing explicitly:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("startJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now the execution of the job can be monitored by requesting the job status and the log files every once in a while (30 seconds in this example):")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stopFn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("monitorJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" logs")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n logs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("log")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("level"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The monitoring stops automatically once the job has finished, was canceled or errored out.\nBut with the return value of the "),s("code",[t._v("monitorJob")]),t._v(" function, you can also stop monitoring the job manually:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stopFn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("When the job is finished, calling "),s("code",[t._v("listResults")]),t._v(" gets you the URLs to the results.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" urls "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("This only works if the job execution has finished.\nWe recommend to use "),s("code",[t._v("listResults")]),t._v(" in combination with "),s("code",[t._v("monitorJob")]),t._v(", for example as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stopFn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("monitorJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" logs")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"finished"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" urls "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n urls"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("url")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Download from: ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("href"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("p",[t._v("There's also the method "),s("code",[t._v("downloadResults")]),t._v(" to download the results directly.\nUnfortunately, you can only download files from a Node.js environment where file access to your local drive is possible.\nIn a Browser environment, it is also an option to download the STAC Item or Collection for the results using the "),s("code",[t._v("getResultsAsStac")]),t._v(" method and point a "),s("a",{attrs:{href:"https://stacindex.org/ecosystem?category=Client",target:"_blank",rel:"noopener noreferrer"}},[t._v("STAC client"),s("OutboundLink")],1),t._v(" to it for downloading.")]),t._v(" "),s("h2",{attrs:{id:"additional-information"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Examples"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/73.adc7b05b.js b/assets/js/73.1badaee0.js similarity index 98% rename from assets/js/73.adc7b05b.js rename to assets/js/73.1badaee0.js index ae8c69062..32856f1b6 100644 --- a/assets/js/73.adc7b05b.js +++ b/assets/js/73.1badaee0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{579:function(t,e,o){"use strict";o.r(e);var n=o(4),a=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"get-started-with-openeo-platform-in-jupyterlab-python"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-openeo-platform-in-jupyterlab-python"}},[t._v("#")]),t._v(" Get started with openEO Platform in JupyterLab (Python)")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),e("p",[t._v("You need to "),e("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("get an openEO Platform account"),e("OutboundLink")],1),t._v(" to access the processing infrastructure.")])]),t._v(" "),e("p",[t._v("A hosted JupyterLab environment for openEO Platform is available at "),e("strong",[e("a",{attrs:{href:"https://lab.openeo.cloud/",target:"_blank",rel:"noopener noreferrer"}},[t._v("lab.openeo.cloud"),e("OutboundLink")],1)]),t._v(".")]),t._v(" "),e("p",[t._v("It has the openEO Python client pre-installed, but it does not support running the R or JavaScript clients.")]),t._v(" "),e("p",[t._v("You need to authenticate before you can use it:")]),t._v(" "),e("ol",[e("li",[t._v('Select from the "Sign in" dropdown menu the "openEO Platform" option')]),t._v(" "),e("li",[t._v("It will start the EGI Authentication workflow for openEO Platform. If you haven't you need to "),e("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("get an openEO Platform account"),e("OutboundLink")],1),t._v(" before you proceed.")]),t._v(" "),e("li",[t._v('After you have logged in via EGI, the "Server Options" appear and you are requested to "Select your desired stack". Please choose "openEO Platform Lab" and click "Start".')]),t._v(" "),e("li",[t._v("You are logged in, now. The JupyterLab should be usable like a normal JupyterLab instance that has the openEO Python client and some other tools pre-installed.")]),t._v(" "),e("li",[t._v("You can now open a new Python 3 Notebook and, for example, start to follow the general "),e("RouterLink",{attrs:{to:"/getting-started/python/"}},[t._v("Python Getting Started Guide")]),t._v("."),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v('You can skip the "Installation" section in the Getting Started Guide, but unfortunately you need to authenticate with the Python client again! We\'ll try to remove this annoyance in the future.')])])],1)]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("You may shut down your device or log out during the job runs on the backend. You can retrieve the status and results later and from any client.")]),t._v(" "),e("p",[t._v("If you require any additional packages to be installed into your JupyterLab environment please refrain from installing them via pip and install them via conda.\n"),e("a",{attrs:{href:"https://docs.anaconda.com/anaconda/user-guide/tasks/install-packages/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Anaconda documentation"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("Please also refer to the the official documentation for the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Python Client"),e("OutboundLink")],1),t._v(" and "),e("a",{attrs:{href:"https://jupyterlab.readthedocs.io/en/stable/getting_started/overview.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("JupyterLab"),e("OutboundLink")],1),t._v(" for more details.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{578:function(t,e,o){"use strict";o.r(e);var n=o(4),a=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"get-started-with-openeo-platform-in-jupyterlab-python"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-openeo-platform-in-jupyterlab-python"}},[t._v("#")]),t._v(" Get started with openEO Platform in JupyterLab (Python)")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),e("p",[t._v("You need to "),e("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("get an openEO Platform account"),e("OutboundLink")],1),t._v(" to access the processing infrastructure.")])]),t._v(" "),e("p",[t._v("A hosted JupyterLab environment for openEO Platform is available at "),e("strong",[e("a",{attrs:{href:"https://lab.openeo.cloud/",target:"_blank",rel:"noopener noreferrer"}},[t._v("lab.openeo.cloud"),e("OutboundLink")],1)]),t._v(".")]),t._v(" "),e("p",[t._v("It has the openEO Python client pre-installed, but it does not support running the R or JavaScript clients.")]),t._v(" "),e("p",[t._v("You need to authenticate before you can use it:")]),t._v(" "),e("ol",[e("li",[t._v('Select from the "Sign in" dropdown menu the "openEO Platform" option')]),t._v(" "),e("li",[t._v("It will start the EGI Authentication workflow for openEO Platform. If you haven't you need to "),e("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("get an openEO Platform account"),e("OutboundLink")],1),t._v(" before you proceed.")]),t._v(" "),e("li",[t._v('After you have logged in via EGI, the "Server Options" appear and you are requested to "Select your desired stack". Please choose "openEO Platform Lab" and click "Start".')]),t._v(" "),e("li",[t._v("You are logged in, now. The JupyterLab should be usable like a normal JupyterLab instance that has the openEO Python client and some other tools pre-installed.")]),t._v(" "),e("li",[t._v("You can now open a new Python 3 Notebook and, for example, start to follow the general "),e("RouterLink",{attrs:{to:"/getting-started/python/"}},[t._v("Python Getting Started Guide")]),t._v("."),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v('You can skip the "Installation" section in the Getting Started Guide, but unfortunately you need to authenticate with the Python client again! We\'ll try to remove this annoyance in the future.')])])],1)]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("You may shut down your device or log out during the job runs on the backend. You can retrieve the status and results later and from any client.")]),t._v(" "),e("p",[t._v("If you require any additional packages to be installed into your JupyterLab environment please refrain from installing them via pip and install them via conda.\n"),e("a",{attrs:{href:"https://docs.anaconda.com/anaconda/user-guide/tasks/install-packages/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Anaconda documentation"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("Please also refer to the the official documentation for the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Python Client"),e("OutboundLink")],1),t._v(" and "),e("a",{attrs:{href:"https://jupyterlab.readthedocs.io/en/stable/getting_started/overview.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("JupyterLab"),e("OutboundLink")],1),t._v(" for more details.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/74.adb4fe08.js b/assets/js/74.58091771.js similarity index 99% rename from assets/js/74.adb4fe08.js rename to assets/js/74.58091771.js index 5544c69ea..bff07ceb7 100644 --- a/assets/js/74.adb4fe08.js +++ b/assets/js/74.58091771.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{581:function(t,e,n){"use strict";n.r(e);var a=n(4),o=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"get-started-with-the-openeo-python-client"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-python-client"}},[t._v("#")]),t._v(" Get started with the openEO Python Client")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),e("p",[t._v("You need to "),e("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("get an openEO Platform account"),e("OutboundLink")],1),t._v(" to access the processing infrastructure.")]),t._v(" "),e("p",[t._v("This Getting Started guide will simply give you an overview of the capabilities of the openEO Python client library.\nMore in-depth information and documentation can be found on the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation"),e("OutboundLink")],1),t._v(" website.")]),t._v(" "),e("p",[t._v("The "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("High level Interface"),e("OutboundLink")],1),t._v(" of the Python client is designed to provide an opinionated, Pythonic, API to interact with openEO Platform.")])]),t._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("The openEO Python client library can easily be installed with a tool like "),e("code",[t._v("pip")]),t._v(", for example:")]),t._v(" "),e("div",{staticClass:"language-shell script extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[t._v("pip "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openeo\n")])])]),e("p",[t._v("The client library is also available on "),e("a",{attrs:{href:"https://anaconda.org/conda-forge/openeo",target:"_blank",rel:"noopener noreferrer"}},[t._v("Conda Forge"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("It's recommended to work in a virtual environment of some kind ("),e("code",[t._v("venv")]),t._v(", "),e("code",[t._v("conda")]),t._v(", ...),\ncontaining Python 3.6 or higher.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("For more details, alternative installation procedures or troubleshooting tips:\nsee the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/installation.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official "),e("code",[t._v("openeo")]),t._v(" package installation documentation"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h2",{attrs:{id:"connect-to-openeo-platform-and-explore"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-to-openeo-platform-and-explore"}},[t._v("#")]),t._v(" Connect to openEO Platform and explore")]),t._v(" "),e("p",[t._v("First, establish a connection to the openEO Platform back-end:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\nconnection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo.cloud"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#module-openeo.rest.connection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Connection")]),t._v(" object"),e("OutboundLink")],1),t._v("\nis your central gateway to")]),t._v(" "),e("ul",[e("li",[t._v("list data collections, available processes, file formats and other capabilities of the back-end")]),t._v(" "),e("li",[t._v("start building your openEO algorithm from the desired data on the back-end")]),t._v(" "),e("li",[t._v("execute and monitor (batch) jobs on the back-end")]),t._v(" "),e("li",[t._v("etc.")])]),t._v(" "),e("h3",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("p",[t._v('The Earth observation data (the input of your openEO jobs) is organised in so-called collections,\ne.g. fundamental satellite collections like "Sentinel 1" or "Sentinel 2",\nor preprocessed collections like "NDVI".')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v('More information on how openEO "collections" relate to terminology used in other systems can be found in\n'),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#eo-data-collections",target:"_blank",rel:"noopener noreferrer"}},[t._v("the openEO glossary"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("p",[t._v("While it's recommended to browse the available EO collections on the"),e("br"),t._v(" "),e("RouterLink",{attrs:{to:"/data-collections/"}},[t._v("openEO Platform collections overview webpage")]),t._v(",\nit's possible to list and inspect them programmatically.\nAs a very simple usage example of openEO Python client,\nlet's use the\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.list_collection_ids",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("list_collection_ids")]),e("OutboundLink")],1),t._v("\nand "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.describe_collection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("describe_collection")]),e("OutboundLink")],1),t._v("\nmethods on the "),e("code",[t._v("connection")]),t._v(" object we just created:")],1),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v(">>> # Get all collection ids\n>>> print(connection.list_collection_ids())\n['AGERA5', 'SENTINEL1_GRD', 'SENTINEL2_L2A', ...\n\n>>> # Get metadata of a single collection\n>>> print(connection.describe_collection(\"SENTINEL2_L2A\"))\n{'id': 'SENTINEL2_L2A', 'title': 'Sentinel-2 top of canopy ...', 'stac_version': '0.9.0', ...\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The openEO Python client library comes with Jupyter (notebook) integration in a couple of places.\nFor example, put "),e("code",[t._v('connection.describe_collection("SENTINEL2_L2A")')]),t._v(" (without "),e("code",[t._v("print()")]),t._v(")\nas last statement in a notebook cell\nand you'll get a nice graphical rendering of the collection metadata.")])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Find out more about data discovery, loading and filtering in the\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/data_access.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official openEO Python client documentation"),e("OutboundLink")],1)])]),t._v(" "),e("h3",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("p",[t._v('Processes in openEO are operations that can be applied on (EO) data\n(e.g. calculate the mean of an array, or mask out observations outside a given polygon).\nThe output of one process can be used as the input of another process,\nand by doing so, multiple processes can be connected that way in a larger "process graph"\nthat implements a certain algorithm.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Check "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("the openEO glossary"),e("OutboundLink")],1),t._v("\nfor more details on pre-defined, user-defined processes and process graphs.")])]),t._v(" "),e("p",[t._v("Let's list the available pre-defined processes\nwith "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.list_processes",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("list_processes")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v(">>> print(connection.list_processes())\n[{'id': 'absolute', 'summary': 'Absolute value', 'description': 'Computes the absolute value of ... \n {'id': 'mean', 'summary': 'Arithmetic mean(average)', ...\n ...\n")])])]),e("p",[t._v("Like with collections, instead of programmatic exploration you'll probably prefer a\nmore graphical, interactive interface.\nUse the Jupyter notebook integration (put "),e("code",[t._v("connection.list_processes()")]),t._v(" without "),e("code",[t._v("print()")]),t._v(" as last statement in a notebook cell)\nor visit a "),e("RouterLink",{attrs:{to:"/processes/"}},[t._v("web-based overview of the available processes on openEO Platform")]),t._v(".")],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Find out more about process discovery and usage\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/processes.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official openEO Python client documentation"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("p",[t._v("In the code snippets above we did not need to log in as a user\nsince we just queried publicly available back-end information.\nHowever, to run non-trivial processing queries one has to authenticate\nso that permissions, resource usage, etc. can be managed properly.")]),t._v(" "),e("p",[t._v("To handle authentication, openEO leverages "),e("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect (OIDC)"),e("OutboundLink")],1),t._v(".\nIt offers some interesting features (e.g., a user can securely reuse an existing account),\nbut is a fairly complex topic, discussed in more depth on the "),e("RouterLink",{attrs:{to:"/join/free_trial.html"}},[t._v("Free Trial")]),t._v(" page.")],1),t._v(" "),e("p",[t._v("The openEO Python client library tries to make authentication as streamlined as possible.\nIn most cases for example, the following snippet is enough to obtain an authenticated connection:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\nconnection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo.cloud"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This statement will automatically reuse a previously authenticated session, when available.\nOtherwise, e.g. the first time you do this, some user interaction is required\nand it will print a web link and a short "),e("em",[t._v("user code")]),t._v(".\nVisit this web page in a browser, log in there with an existing account and enter the user code.\nIf everything goes well, the "),e("code",[t._v("connection")]),t._v(" object in the script will be authenticated\nand the back-end will be able to identify you in subsequent requests.")]),t._v(" "),e("p",[t._v("More detailed information on authentication can be found\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/auth.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("in the openEO Python client documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"working-with-datacubes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#working-with-datacubes"}},[t._v("#")]),t._v(" Working with Datacubes")]),t._v(" "),e("p",[t._v("Now that we know how to discover the capabilities of the back-end and how to authenticate,\nlet's do some real work and process some EO data in a batch job.\nWe'll first build the desired algorithm by working on so-called \"Datacubes\",\nwhich is the central concept in openEO to represent EO data,\nas "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/datacubes.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("discussed in great detail here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"creating-a-datacube"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-datacube"}},[t._v("#")]),t._v(" Creating a Datacube")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Please note that the following code only creates a process graph representation of your EO analysis and does not take major processing power from you device.")])]),t._v(" "),e("p",[t._v("The first step is loading the desired slice of a data collection\nwith "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.load_collection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Connection.load_collection")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This results in a "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("DataCube")]),t._v(" object"),e("OutboundLink")],1),t._v('\ncontaining the "SENTINEL1_GRD" data restricted to the given spatial extent, temporal extent and bands.')]),t._v(" "),e("h3",{attrs:{id:"applying-processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#applying-processes"}},[t._v("#")]),t._v(" Applying processes")]),t._v(" "),e("p",[t._v("By applying an openEO process on a datacube, we create a new datacube object that represents the manipulated data.\nThe openEO Python client allows to do this by calling "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("DataCube")]),t._v(" object methods"),e("OutboundLink")],1),t._v(".\nThe most common or popular openEO processes have a dedicated "),e("code",[t._v("DataCube")]),t._v(" method (e.g. "),e("code",[t._v("mask")]),t._v(", "),e("code",[t._v("aggregate_spatial")]),t._v(", "),e("code",[t._v("filter_bbox")]),t._v(", ...).")]),t._v(" "),e("p",[t._v("There are also some convenience methods that implement\nmore complex openEO processes constructs is a compact, Pythonic interface.\nFor example, the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.min_time",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("DataCube.min_time")]),e("OutboundLink")],1),t._v(" method\nimplements a "),e("code",[t._v("reduce_dimension")]),t._v(" process along the temporal dimension, using the "),e("code",[t._v("min")]),t._v(" process as reducer function:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("min_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This creates a new datacube (we overwrite the existing variable),\nwhere the time dimension is eliminated and for each pixel we just have\nthe minimum value of the corresponding timeseries in the original datacube.")]),t._v(" "),e("p",[t._v("See the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client's "),e("code",[t._v("DataCube")]),t._v(" API documentation"),e("OutboundLink")],1),t._v("\nfor a more complete listing of methods that implement openEO processes.")]),t._v(" "),e("p",[t._v("openEO processes that are not supported by a dedicated "),e("code",[t._v("DataCube")]),t._v(" method\ncan be applied in a generic way with the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.process",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("process")]),t._v(" method"),e("OutboundLink")],1),t._v(", e.g.:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n process_id"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ndvi"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n arguments"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nir"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This applies the "),e("RouterLink",{attrs:{to:"/processes/#ndvi"}},[e("code",[t._v("ndvi")]),t._v(" process")]),t._v(' to the datacube with the arguments of "data", "nir" and "red" (This example assumes a datacube with bands '),e("code",[t._v("B8")]),t._v(" and "),e("code",[t._v("B4")]),t._v(").")],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Still unsure on how to make use of processes with the Python client?\nVisit the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/processes.html#working-with-processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation on working with processes"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"defining-output-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#defining-output-format"}},[t._v("#")]),t._v(" Defining output format")]),t._v(" "),e("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("result "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You can list the available file formats using:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_file_formats"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),e("h2",{attrs:{id:"execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#execution"}},[t._v("#")]),t._v(" Execution")]),t._v(" "),e("p",[t._v("It's important to note that all the datacube processes we applied up to this point\nare not actually executed yet, neither locally nor remotely on the back-end.\nWe just built an abstract representation of the algorithm (input data and processing chain),\nencapsulated in a local "),e("code",[t._v("DataCube")]),t._v(" object (e.g. the "),e("code",[t._v("result")]),t._v(" variable above).\nTo trigger actual execution on the back-end we have to explicitly send this representation\nto the back-end.")]),t._v(" "),e("p",[t._v("openEO defines "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#data-processing-modes",target:"_blank",rel:"noopener noreferrer"}},[t._v("several processing modes"),e("OutboundLink")],1),t._v(",\nbut for this introduction we'll focus on batch jobs, which is a good default choice.")]),t._v(" "),e("h3",{attrs:{id:"batch-job-execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-execution"}},[t._v("#")]),t._v(" Batch job execution")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("result")]),t._v(" datacube object we built above describes the desired input collections, processing steps and output format.\nWe can now just send this description to the back-end to create a batch job with the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.create_job",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("create_job")]),t._v(" method"),e("OutboundLink")],1),t._v(" like this:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Creating a new job at the back-end by sending the datacube information.")]),t._v("\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("It can be annoying to manage and monitor batch jobs via code.\nIf you want to use an interface for your batch jobs (or other resources) that is easier to use, you can also open the "),e("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Platform Editor"),e("OutboundLink")],1),t._v('.\nAfter login, you\'ll be able to manage and monitor your batch jobs in a near-realtime interactive environment; Look out for the "Data Processing" tab.')])]),t._v(" "),e("p",[t._v("The batch job, which is referenced by the returned "),e("code",[t._v("job")]),t._v(" object, is only "),e("em",[t._v("created")]),t._v(" at the back-end,\nit is not started yet.\nTo start the job and let your Python script wait until the job has finished then\ndownload it automatically, you can use the "),e("code",[t._v("start_and_wait")]),t._v(" method.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Starts the job and waits until it finished to download the result.")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_and_wait"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v('When everything completes successfully, the processing result will be downloaded as a GeoTIFF file\nin a folder "output".')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You may shut down your device or log out during the job runs on the backend. You can retrieve the status and results later and from any client.")]),t._v(" "),e("p",[t._v("The official openEO Python Client documentation has more information\non "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/batch_jobs.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("batch job management and downloading results"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"additional-information"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),e("p",[t._v("Additional information and resources about the openEO Python Client Library:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official openEO Python Client Library Documentation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official openeo.cloud sample notebooks"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Python scripts"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/notebooks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Jupyter Notebooks"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository on GitHub"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/getting-started/python/shiny.html"}},[t._v("Run openEO processes in a Python Shiny App")])],1)])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{579:function(t,e,n){"use strict";n.r(e);var a=n(4),o=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"get-started-with-the-openeo-python-client"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-python-client"}},[t._v("#")]),t._v(" Get started with the openEO Python Client")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),e("p",[t._v("You need to "),e("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("get an openEO Platform account"),e("OutboundLink")],1),t._v(" to access the processing infrastructure.")]),t._v(" "),e("p",[t._v("This Getting Started guide will simply give you an overview of the capabilities of the openEO Python client library.\nMore in-depth information and documentation can be found on the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation"),e("OutboundLink")],1),t._v(" website.")]),t._v(" "),e("p",[t._v("The "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("High level Interface"),e("OutboundLink")],1),t._v(" of the Python client is designed to provide an opinionated, Pythonic, API to interact with openEO Platform.")])]),t._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("The openEO Python client library can easily be installed with a tool like "),e("code",[t._v("pip")]),t._v(", for example:")]),t._v(" "),e("div",{staticClass:"language-shell script extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[t._v("pip "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openeo\n")])])]),e("p",[t._v("The client library is also available on "),e("a",{attrs:{href:"https://anaconda.org/conda-forge/openeo",target:"_blank",rel:"noopener noreferrer"}},[t._v("Conda Forge"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("It's recommended to work in a virtual environment of some kind ("),e("code",[t._v("venv")]),t._v(", "),e("code",[t._v("conda")]),t._v(", ...),\ncontaining Python 3.6 or higher.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("For more details, alternative installation procedures or troubleshooting tips:\nsee the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/installation.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official "),e("code",[t._v("openeo")]),t._v(" package installation documentation"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h2",{attrs:{id:"connect-to-openeo-platform-and-explore"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-to-openeo-platform-and-explore"}},[t._v("#")]),t._v(" Connect to openEO Platform and explore")]),t._v(" "),e("p",[t._v("First, establish a connection to the openEO Platform back-end:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\nconnection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo.cloud"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#module-openeo.rest.connection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Connection")]),t._v(" object"),e("OutboundLink")],1),t._v("\nis your central gateway to")]),t._v(" "),e("ul",[e("li",[t._v("list data collections, available processes, file formats and other capabilities of the back-end")]),t._v(" "),e("li",[t._v("start building your openEO algorithm from the desired data on the back-end")]),t._v(" "),e("li",[t._v("execute and monitor (batch) jobs on the back-end")]),t._v(" "),e("li",[t._v("etc.")])]),t._v(" "),e("h3",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("p",[t._v('The Earth observation data (the input of your openEO jobs) is organised in so-called collections,\ne.g. fundamental satellite collections like "Sentinel 1" or "Sentinel 2",\nor preprocessed collections like "NDVI".')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v('More information on how openEO "collections" relate to terminology used in other systems can be found in\n'),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#eo-data-collections",target:"_blank",rel:"noopener noreferrer"}},[t._v("the openEO glossary"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("p",[t._v("While it's recommended to browse the available EO collections on the"),e("br"),t._v(" "),e("RouterLink",{attrs:{to:"/data-collections/"}},[t._v("openEO Platform collections overview webpage")]),t._v(",\nit's possible to list and inspect them programmatically.\nAs a very simple usage example of openEO Python client,\nlet's use the\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.list_collection_ids",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("list_collection_ids")]),e("OutboundLink")],1),t._v("\nand "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.describe_collection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("describe_collection")]),e("OutboundLink")],1),t._v("\nmethods on the "),e("code",[t._v("connection")]),t._v(" object we just created:")],1),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v(">>> # Get all collection ids\n>>> print(connection.list_collection_ids())\n['AGERA5', 'SENTINEL1_GRD', 'SENTINEL2_L2A', ...\n\n>>> # Get metadata of a single collection\n>>> print(connection.describe_collection(\"SENTINEL2_L2A\"))\n{'id': 'SENTINEL2_L2A', 'title': 'Sentinel-2 top of canopy ...', 'stac_version': '0.9.0', ...\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The openEO Python client library comes with Jupyter (notebook) integration in a couple of places.\nFor example, put "),e("code",[t._v('connection.describe_collection("SENTINEL2_L2A")')]),t._v(" (without "),e("code",[t._v("print()")]),t._v(")\nas last statement in a notebook cell\nand you'll get a nice graphical rendering of the collection metadata.")])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Find out more about data discovery, loading and filtering in the\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/data_access.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official openEO Python client documentation"),e("OutboundLink")],1)])]),t._v(" "),e("h3",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("p",[t._v('Processes in openEO are operations that can be applied on (EO) data\n(e.g. calculate the mean of an array, or mask out observations outside a given polygon).\nThe output of one process can be used as the input of another process,\nand by doing so, multiple processes can be connected that way in a larger "process graph"\nthat implements a certain algorithm.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Check "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("the openEO glossary"),e("OutboundLink")],1),t._v("\nfor more details on pre-defined, user-defined processes and process graphs.")])]),t._v(" "),e("p",[t._v("Let's list the available pre-defined processes\nwith "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.list_processes",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("list_processes")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v(">>> print(connection.list_processes())\n[{'id': 'absolute', 'summary': 'Absolute value', 'description': 'Computes the absolute value of ... \n {'id': 'mean', 'summary': 'Arithmetic mean(average)', ...\n ...\n")])])]),e("p",[t._v("Like with collections, instead of programmatic exploration you'll probably prefer a\nmore graphical, interactive interface.\nUse the Jupyter notebook integration (put "),e("code",[t._v("connection.list_processes()")]),t._v(" without "),e("code",[t._v("print()")]),t._v(" as last statement in a notebook cell)\nor visit a "),e("RouterLink",{attrs:{to:"/processes/"}},[t._v("web-based overview of the available processes on openEO Platform")]),t._v(".")],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Find out more about process discovery and usage\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/processes.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official openEO Python client documentation"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("p",[t._v("In the code snippets above we did not need to log in as a user\nsince we just queried publicly available back-end information.\nHowever, to run non-trivial processing queries one has to authenticate\nso that permissions, resource usage, etc. can be managed properly.")]),t._v(" "),e("p",[t._v("To handle authentication, openEO leverages "),e("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect (OIDC)"),e("OutboundLink")],1),t._v(".\nIt offers some interesting features (e.g., a user can securely reuse an existing account),\nbut is a fairly complex topic, discussed in more depth on the "),e("RouterLink",{attrs:{to:"/join/free_trial.html"}},[t._v("Free Trial")]),t._v(" page.")],1),t._v(" "),e("p",[t._v("The openEO Python client library tries to make authentication as streamlined as possible.\nIn most cases for example, the following snippet is enough to obtain an authenticated connection:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\nconnection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo.cloud"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This statement will automatically reuse a previously authenticated session, when available.\nOtherwise, e.g. the first time you do this, some user interaction is required\nand it will print a web link and a short "),e("em",[t._v("user code")]),t._v(".\nVisit this web page in a browser, log in there with an existing account and enter the user code.\nIf everything goes well, the "),e("code",[t._v("connection")]),t._v(" object in the script will be authenticated\nand the back-end will be able to identify you in subsequent requests.")]),t._v(" "),e("p",[t._v("More detailed information on authentication can be found\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/auth.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("in the openEO Python client documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"working-with-datacubes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#working-with-datacubes"}},[t._v("#")]),t._v(" Working with Datacubes")]),t._v(" "),e("p",[t._v("Now that we know how to discover the capabilities of the back-end and how to authenticate,\nlet's do some real work and process some EO data in a batch job.\nWe'll first build the desired algorithm by working on so-called \"Datacubes\",\nwhich is the central concept in openEO to represent EO data,\nas "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/datacubes.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("discussed in great detail here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"creating-a-datacube"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-datacube"}},[t._v("#")]),t._v(" Creating a Datacube")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Please note that the following code only creates a process graph representation of your EO analysis and does not take major processing power from you device.")])]),t._v(" "),e("p",[t._v("The first step is loading the desired slice of a data collection\nwith "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.load_collection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Connection.load_collection")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This results in a "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("DataCube")]),t._v(" object"),e("OutboundLink")],1),t._v('\ncontaining the "SENTINEL1_GRD" data restricted to the given spatial extent, temporal extent and bands.')]),t._v(" "),e("h3",{attrs:{id:"applying-processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#applying-processes"}},[t._v("#")]),t._v(" Applying processes")]),t._v(" "),e("p",[t._v("By applying an openEO process on a datacube, we create a new datacube object that represents the manipulated data.\nThe openEO Python client allows to do this by calling "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("DataCube")]),t._v(" object methods"),e("OutboundLink")],1),t._v(".\nThe most common or popular openEO processes have a dedicated "),e("code",[t._v("DataCube")]),t._v(" method (e.g. "),e("code",[t._v("mask")]),t._v(", "),e("code",[t._v("aggregate_spatial")]),t._v(", "),e("code",[t._v("filter_bbox")]),t._v(", ...).")]),t._v(" "),e("p",[t._v("There are also some convenience methods that implement\nmore complex openEO processes constructs is a compact, Pythonic interface.\nFor example, the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.min_time",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("DataCube.min_time")]),e("OutboundLink")],1),t._v(" method\nimplements a "),e("code",[t._v("reduce_dimension")]),t._v(" process along the temporal dimension, using the "),e("code",[t._v("min")]),t._v(" process as reducer function:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("min_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This creates a new datacube (we overwrite the existing variable),\nwhere the time dimension is eliminated and for each pixel we just have\nthe minimum value of the corresponding timeseries in the original datacube.")]),t._v(" "),e("p",[t._v("See the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client's "),e("code",[t._v("DataCube")]),t._v(" API documentation"),e("OutboundLink")],1),t._v("\nfor a more complete listing of methods that implement openEO processes.")]),t._v(" "),e("p",[t._v("openEO processes that are not supported by a dedicated "),e("code",[t._v("DataCube")]),t._v(" method\ncan be applied in a generic way with the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.process",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("process")]),t._v(" method"),e("OutboundLink")],1),t._v(", e.g.:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n process_id"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ndvi"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n arguments"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nir"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This applies the "),e("RouterLink",{attrs:{to:"/processes/#ndvi"}},[e("code",[t._v("ndvi")]),t._v(" process")]),t._v(' to the datacube with the arguments of "data", "nir" and "red" (This example assumes a datacube with bands '),e("code",[t._v("B8")]),t._v(" and "),e("code",[t._v("B4")]),t._v(").")],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Still unsure on how to make use of processes with the Python client?\nVisit the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/processes.html#working-with-processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation on working with processes"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"defining-output-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#defining-output-format"}},[t._v("#")]),t._v(" Defining output format")]),t._v(" "),e("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("result "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You can list the available file formats using:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_file_formats"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),e("h2",{attrs:{id:"execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#execution"}},[t._v("#")]),t._v(" Execution")]),t._v(" "),e("p",[t._v("It's important to note that all the datacube processes we applied up to this point\nare not actually executed yet, neither locally nor remotely on the back-end.\nWe just built an abstract representation of the algorithm (input data and processing chain),\nencapsulated in a local "),e("code",[t._v("DataCube")]),t._v(" object (e.g. the "),e("code",[t._v("result")]),t._v(" variable above).\nTo trigger actual execution on the back-end we have to explicitly send this representation\nto the back-end.")]),t._v(" "),e("p",[t._v("openEO defines "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#data-processing-modes",target:"_blank",rel:"noopener noreferrer"}},[t._v("several processing modes"),e("OutboundLink")],1),t._v(",\nbut for this introduction we'll focus on batch jobs, which is a good default choice.")]),t._v(" "),e("h3",{attrs:{id:"batch-job-execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-execution"}},[t._v("#")]),t._v(" Batch job execution")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("result")]),t._v(" datacube object we built above describes the desired input collections, processing steps and output format.\nWe can now just send this description to the back-end to create a batch job with the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.create_job",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("create_job")]),t._v(" method"),e("OutboundLink")],1),t._v(" like this:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Creating a new job at the back-end by sending the datacube information.")]),t._v("\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("It can be annoying to manage and monitor batch jobs via code.\nIf you want to use an interface for your batch jobs (or other resources) that is easier to use, you can also open the "),e("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Platform Editor"),e("OutboundLink")],1),t._v('.\nAfter login, you\'ll be able to manage and monitor your batch jobs in a near-realtime interactive environment; Look out for the "Data Processing" tab.')])]),t._v(" "),e("p",[t._v("The batch job, which is referenced by the returned "),e("code",[t._v("job")]),t._v(" object, is only "),e("em",[t._v("created")]),t._v(" at the back-end,\nit is not started yet.\nTo start the job and let your Python script wait until the job has finished then\ndownload it automatically, you can use the "),e("code",[t._v("start_and_wait")]),t._v(" method.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Starts the job and waits until it finished to download the result.")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_and_wait"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v('When everything completes successfully, the processing result will be downloaded as a GeoTIFF file\nin a folder "output".')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You may shut down your device or log out during the job runs on the backend. You can retrieve the status and results later and from any client.")]),t._v(" "),e("p",[t._v("The official openEO Python Client documentation has more information\non "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/batch_jobs.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("batch job management and downloading results"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"additional-information"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),e("p",[t._v("Additional information and resources about the openEO Python Client Library:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official openEO Python Client Library Documentation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official openeo.cloud sample notebooks"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Python scripts"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/notebooks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Jupyter Notebooks"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository on GitHub"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/getting-started/python/shiny.html"}},[t._v("Run openEO processes in a Python Shiny App")])],1)])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/75.2176bc79.js b/assets/js/75.fdc034f6.js similarity index 99% rename from assets/js/75.2176bc79.js rename to assets/js/75.fdc034f6.js index b276ca18f..9213fd52c 100644 --- a/assets/js/75.2176bc79.js +++ b/assets/js/75.fdc034f6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{580:function(t,s,n){"use strict";n.r(s);var a=n(4),e=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"run-openeo-processes-in-shiny-apps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#run-openeo-processes-in-shiny-apps"}},[t._v("#")]),t._v(" Run openEO processes in Shiny apps")]),t._v(" "),s("p",[t._v("If one is new to Shiny in Python, a really good documentation can be found "),s("a",{attrs:{href:"https://shiny.rstudio.com/py/docs/get-started.html",target:"_blank",rel:"noopener noreferrer"}},[s("strong",[t._v("here")]),s("OutboundLink")],1),t._v(". This documentation is the source for all main interaction in the Shiny app built here.")]),t._v(" "),s("p",[t._v('As any other Shiny app, there will always be an UI and a Server side. Both can be coded in the same script, but they are quite differently set. The UI defines the interface of the application, and therefore one needs to define data inputs, buttons and tabs here. Below, one can see how the "Time Series Analyser" interface has been built.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Tab2 : Time Series Analyser")]),t._v("\nui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nav"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Time-Series Analyser"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n \n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# This tab has both a sidebar and panel")]),t._v("\nui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("layout_sidebar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Define Sidebar Inputs")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("panel_sidebar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Bounding Box")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"w"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"xmin (EPSG:4326)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".01")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"s"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ymin (EPSG:4326)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".01")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"e"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"xmax (EPSG:4326)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.55")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".01")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"n"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ymax (EPSG:4326)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.13")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".01")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Temporal Filter")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_date_range"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"date1date2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Select timeframe"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n start "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-01-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" end "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-12-31"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-01-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("max")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("date"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("today"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" startview "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"year"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" weekstart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Map with bbox")]),t._v("\n output_widget"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"map_ts"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Cloud Cover ")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cloud1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cloud cover to be considered? (0 to 1 - 0.5 is recommended)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("max")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Submit Button")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_action_button"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Submit"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("output_text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"compute"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Time Series Plot")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("panel_main"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("output_plot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"plot_ts"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),s("p",[t._v("Everything in the UI start with defining sidebars, tabs and everything that refers to the layout. This is what is seen by the method "),s("em",[t._v("ui.panel_sidebar")]),t._v('. In the following all inputs (data) are defined for the "Time Series Analyser". Here, the most important is to pay attention to different data types and that each and everyone of them will require a different method. In this dashboard tab, for instance, the '),s("em",[t._v("input_numeric")]),t._v(", "),s("em",[t._v("input_date_range")]),t._v(" and "),s("em",[t._v("input_action_button")]),t._v(" are used. The other part is then the output items. Here the leaflet interactive map ("),s("em",[t._v("output_widget")]),t._v(") and the "),s("em",[t._v("output_plot")]),t._v(" are used. The last one is the one seen before. It refers to the time series plot.")]),t._v(" "),s("p",[t._v("Once some idea is given on how to work with Python's Shiny UI, a lot of questions may come into the mind about how to make these inputs and outputs actually turn into some result. This is where the Server comes into play. The server is again another function, where in this case, the first output to be defined is the leaflet map.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("server")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" output"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" session"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Leaft Map for Time Series")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@output")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@render_widget")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map_ts")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n center_y "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n center_x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n m "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" L"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Map"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("center"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("center_y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" center_x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" zoom"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n rectangle "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" L"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Rectangle"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bounds"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n m"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("add_layer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rectangle"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" m\n")])])]),s("p",[t._v("The function here used for plotting the nice bounding box on an interactive map is "),s("em",[t._v("L.Rectangle()")]),t._v(", being L the name through the "),s("em",[t._v("ipyleaflet")]),t._v(" package was imported. It is important to mentioned that a leaflet map has to be defined for each tab, as the coordinates for the bounding box are different for each tab.")]),t._v(" "),s("p",[t._v("After that, the interactions from the first input start being defined. An extent is first defined for the openeo processes:")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@output")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@render"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("plot")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@reactive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("event")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("plot_ts")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("with")]),t._v(" ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Progress"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("max")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Define the Spatial Extent")]),t._v("\n extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n p"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" message"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Local Wrangling"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n")])])]),s("p",[t._v("The output is here defined with a "),s("em",[t._v("@reactive.event")]),t._v(" tag, which allows for the inputs to be brought to the server only when the Submit button is hit. A progress bar is also defined, which helps by the fact that the whole process takes a while, and shiny does not naturally give the idea something is running without a progress bar.")]),t._v(" "),s("p",[t._v("After that, the collections are loaded, including the NO2 and the Cloud Cover bands, and the processes above mentioned are run, such as the mask for cloud cover, the interpolation, and the udf. Once the job is sent to backend, the script will wait for it to complete and one can call the files into memory and the rest is standard python and "),s("em",[t._v("matplotlib")]),t._v(" usage. The most relevant thing to remember here is that the specific server function one is manipulating, like here, the "),s("em",[t._v("def map_ts()")]),t._v(" function, is must have a "),s("em",[t._v("return")]),t._v(" call in its end, otherwise no plots will be retrieved from it, obviously enough. Below, one can see how the time series plot is defined, considering the "),s("em",[t._v("ts_df")]),t._v(" as a data frame built from the JSONs read as a dictionary in python.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("fig"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ax "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" plt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("subplots"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nts_df"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("plot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ax"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("ax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_xlabel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Time'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_ylabel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Value'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_title"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'NO2 Time Series from SENTINEL 5P'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# plt.show()")]),t._v("\n \np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" message"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Done"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" fig \n")])])]),s("p",[t._v("As in a dashboard, one will probably work with rendering plots mainly, that should be resourceful enough to let anyone start playing with openEO and Shiny in python together. If there are any doubts, do not hesitate to reach the developers and consider even creating an issue in this repository. Please be aware of openEO backend related issues that do not concern this dashboard developers.")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{581:function(t,s,n){"use strict";n.r(s);var a=n(4),e=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"run-openeo-processes-in-shiny-apps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#run-openeo-processes-in-shiny-apps"}},[t._v("#")]),t._v(" Run openEO processes in Shiny apps")]),t._v(" "),s("p",[t._v("If one is new to Shiny in Python, a really good documentation can be found "),s("a",{attrs:{href:"https://shiny.rstudio.com/py/docs/get-started.html",target:"_blank",rel:"noopener noreferrer"}},[s("strong",[t._v("here")]),s("OutboundLink")],1),t._v(". This documentation is the source for all main interaction in the Shiny app built here.")]),t._v(" "),s("p",[t._v('As any other Shiny app, there will always be an UI and a Server side. Both can be coded in the same script, but they are quite differently set. The UI defines the interface of the application, and therefore one needs to define data inputs, buttons and tabs here. Below, one can see how the "Time Series Analyser" interface has been built.')]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Tab2 : Time Series Analyser")]),t._v("\nui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nav"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Time-Series Analyser"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n \n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# This tab has both a sidebar and panel")]),t._v("\nui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("layout_sidebar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Define Sidebar Inputs")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("panel_sidebar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Bounding Box")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"w"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"xmin (EPSG:4326)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".01")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"s"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ymin (EPSG:4326)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".01")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"e"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"xmax (EPSG:4326)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.55")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".01")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"n"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ymax (EPSG:4326)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.13")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".01")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Temporal Filter")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_date_range"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"date1date2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Select timeframe"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n start "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-01-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" end "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-12-31"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-01-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("max")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("date"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("today"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" startview "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"year"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" weekstart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Map with bbox")]),t._v("\n output_widget"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"map_ts"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Cloud Cover ")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_numeric"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cloud1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cloud cover to be considered? (0 to 1 - 0.5 is recommended)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("max")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" step "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Submit Button")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input_action_button"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Submit"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("output_text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"compute"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Time Series Plot")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("panel_main"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("output_plot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"plot_ts"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),s("p",[t._v("Everything in the UI start with defining sidebars, tabs and everything that refers to the layout. This is what is seen by the method "),s("em",[t._v("ui.panel_sidebar")]),t._v('. In the following all inputs (data) are defined for the "Time Series Analyser". Here, the most important is to pay attention to different data types and that each and everyone of them will require a different method. In this dashboard tab, for instance, the '),s("em",[t._v("input_numeric")]),t._v(", "),s("em",[t._v("input_date_range")]),t._v(" and "),s("em",[t._v("input_action_button")]),t._v(" are used. The other part is then the output items. Here the leaflet interactive map ("),s("em",[t._v("output_widget")]),t._v(") and the "),s("em",[t._v("output_plot")]),t._v(" are used. The last one is the one seen before. It refers to the time series plot.")]),t._v(" "),s("p",[t._v("Once some idea is given on how to work with Python's Shiny UI, a lot of questions may come into the mind about how to make these inputs and outputs actually turn into some result. This is where the Server comes into play. The server is again another function, where in this case, the first output to be defined is the leaflet map.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("server")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" output"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" session"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Leaft Map for Time Series")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@output")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@render_widget")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map_ts")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n center_y "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n center_x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n m "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" L"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Map"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("center"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("center_y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" center_x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" zoom"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n rectangle "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" L"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Rectangle"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bounds"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n m"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("add_layer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rectangle"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" m\n")])])]),s("p",[t._v("The function here used for plotting the nice bounding box on an interactive map is "),s("em",[t._v("L.Rectangle()")]),t._v(", being L the name through the "),s("em",[t._v("ipyleaflet")]),t._v(" package was imported. It is important to mentioned that a leaflet map has to be defined for each tab, as the coordinates for the bounding box are different for each tab.")]),t._v(" "),s("p",[t._v("After that, the interactions from the first input start being defined. An extent is first defined for the openeo processes:")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@output")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@render"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("plot")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token decorator annotation punctuation"}},[t._v("@reactive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("event")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("plot_ts")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("with")]),t._v(" ui"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Progress"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("min")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("max")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Define the Spatial Extent")]),t._v("\n extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("w"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("input")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n p"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" message"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Local Wrangling"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n")])])]),s("p",[t._v("The output is here defined with a "),s("em",[t._v("@reactive.event")]),t._v(" tag, which allows for the inputs to be brought to the server only when the Submit button is hit. A progress bar is also defined, which helps by the fact that the whole process takes a while, and shiny does not naturally give the idea something is running without a progress bar.")]),t._v(" "),s("p",[t._v("After that, the collections are loaded, including the NO2 and the Cloud Cover bands, and the processes above mentioned are run, such as the mask for cloud cover, the interpolation, and the udf. Once the job is sent to backend, the script will wait for it to complete and one can call the files into memory and the rest is standard python and "),s("em",[t._v("matplotlib")]),t._v(" usage. The most relevant thing to remember here is that the specific server function one is manipulating, like here, the "),s("em",[t._v("def map_ts()")]),t._v(" function, is must have a "),s("em",[t._v("return")]),t._v(" call in its end, otherwise no plots will be retrieved from it, obviously enough. Below, one can see how the time series plot is defined, considering the "),s("em",[t._v("ts_df")]),t._v(" as a data frame built from the JSONs read as a dictionary in python.")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("fig"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ax "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" plt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("subplots"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("figsize"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nts_df"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("plot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ax"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("ax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_xlabel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Time'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_ylabel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Value'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_title"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'NO2 Time Series from SENTINEL 5P'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# plt.show()")]),t._v("\n \np"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" message"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Done"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" fig \n")])])]),s("p",[t._v("As in a dashboard, one will probably work with rendering plots mainly, that should be resourceful enough to let anyone start playing with openEO and Shiny in python together. If there are any doubts, do not hesitate to reach the developers and consider even creating an issue in this repository. Please be aware of openEO backend related issues that do not concern this dashboard developers.")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/76.06f15b5c.js b/assets/js/76.d273a27d.js similarity index 99% rename from assets/js/76.06f15b5c.js rename to assets/js/76.d273a27d.js index 624787b67..3a8e279ab 100644 --- a/assets/js/76.06f15b5c.js +++ b/assets/js/76.d273a27d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{583:function(t,e,a){"use strict";a.r(e);var s=a(4),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"get-started-with-the-openeo-r-client"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-r-client"}},[t._v("#")]),t._v(" Get started with the openEO R Client")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("You need to "),e("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("get an openEO Platform account"),e("OutboundLink")],1),t._v(" to access the processing infrastructure.")])]),t._v(" "),e("h2",{attrs:{id:"useful-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#useful-links"}},[t._v("#")]),t._v(" Useful links")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Vignettes"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Code Repository"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("for function documentation, use R's "),e("code",[t._v("?")]),t._v(" function or see the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("online documentation"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("Before you install the R client module into your R environment, please make sure that you have at least R version 3.6. Older versions might also work, but were not tested.")]),t._v(" "),e("p",[t._v("Stable releases can be installed from CRAN:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("install.packages"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Installing the development version")]),t._v(" "),e("p",[t._v("If you want to install the development version, you can install from GitHub. It may contain more features, but may also be unstable.")]),t._v(" "),e("p",[t._v("You need to have the package 'devtools' installed. If it is not installed use "),e("code",[t._v('install.packages("devtools")')]),t._v(".")]),t._v(" "),e("p",[t._v("Now you can use "),e("code",[t._v("install_github")]),t._v(" from the devtools package to install the development version:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("devtools"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("install_github"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("repo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Open-EO/openeo-r-client"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dependencies"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ref"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"develop"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("If this gives you an error, something went wrong with the installation so please check the requirements again.")])]),t._v(" "),e("p",[t._v("If you have still troubles installing the package, feel free to leave an issue at the "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub project"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Now that the installation was successfully finished, we can load the package and connect to openEO Platform.\nIn the following chapters we quickly walk through the main features of the R client.")]),t._v(" "),e("h2",{attrs:{id:"connect-to-openeo-platform-and-explore"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-to-openeo-platform-and-explore"}},[t._v("#")]),t._v(" Connect to openEO Platform and explore")]),t._v(" "),e("p",[t._v("First we need to establish a connection to the openEO Platform back-end,\nwhich is available at connection URL "),e("code",[t._v("https://openeo.cloud")]),t._v(", or just in short:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("library"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncon "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("host "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.cloud"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The object stored as variable "),e("code",[t._v("con")]),t._v(" is a connection and resembles the "),e("code",[t._v("OpenEOClient")]),t._v(" - an object, that bundles all information and functions to interact with the back-end. It can be used explicitly in all of the functions to determine which connection has to be used (usually parameter "),e("code",[t._v("con")]),t._v("). If only one connection is active, then you can omit the parameter, because the last active connection is always stored in a package environment and used if no specific connection was present (see "),e("code",[t._v("?active_connection")]),t._v(" in the package documentation).")]),t._v(" "),e("p",[t._v("The capabilities of the back-end and the collections are generally publicly available, unless the data collections are proprietary and licensing issues prevent the back-end provider from publishing the collection. For the publicly available information you do not need to have an account on the back-end for reading them.")]),t._v(" "),e("h3",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("p",[t._v('The EO data available at a back-end is organised in so-called collections.\nFor example, a back-end might provide fundamental satellite collections like "Sentinel 1" or "Sentinel 2",\nor preprocessed collections like "NDVI".\nCollections are used as input data for your openEO jobs.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v('More information on how openEO "collections" relate to terminology used in other systems can be found in\n'),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#eo-data-collections",target:"_blank",rel:"noopener noreferrer"}},[t._v("the openEO glossary"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("p",[t._v("To get the collection list can be indexed by the collections ID to get the more details about the overview information. With the "),e("code",[t._v("describe_collection")]),t._v(" function you can get an even more detailed information about the collection.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("collections "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# print an overview of the available collections (printed as data.frame or tibble)")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# to print more of the reduced overview metadata")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collections"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("SENTINEL1_GRD"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# Dictionary of the full metadata of the "SENTINEL1_GRD" collection (dict)')]),t._v("\ns2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" describe_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or use the collection entry from the list, e.g. collections$SENTINEL1_GRD")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s2"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("In general all metadata objects are based on lists, so you can use "),e("code",[t._v("str()")]),t._v(" to get the structure of the list and address fields by the "),e("code",[t._v("$")]),t._v(" operator.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If the package is used with RStudio the metadata can also be nicely rendered as a web page in the viewer panel by running "),e("code",[t._v('collection_viewer(x="SENTINEL1_GRD")')]),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Please note that the any of this code only creates a process graph representation of your EO analysis and does not take major processing power from you device.")])]),t._v(" "),e("p",[t._v('Processes in openEO are operations that can be applied on (EO) data\n(e.g. calculate the mean of an array, or mask out observations outside a given polygon).\nThe output of one process can be used as the input of another process,\nand by doing so, multiple processes can be connected that way in a larger "process graph":\na new (user-defined) processes that implements a certain algorithm.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Check "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("the openEO glossary"),e("OutboundLink")],1),t._v("\nfor more details on pre-defined, user-defined processes and process graphs.")])]),t._v(" "),e("p",[t._v("The following code snippet shows how to get the available processes:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# List of available openEO processes with full metadata")]),t._v("\nprocesses "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# List of available openEO processes by identifiers (string)")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("names"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# print metadata of the process with ID "load_collection"')]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processes"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("code",[t._v("list_processes()")]),t._v(" method returns a list of process metadata objects that the back-end provides.\nEach process list entry is a more complex list object (called 'ProcessInfo') and contains the process identifier and additional metadata about the process, such as expected arguments and return types.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("As for the collection, processes can also be rendered as a web page in the viewer panel, if RStudio is used. In order to open the viewer use "),e("code",[t._v("process_viewer()")]),t._v(" with either a particular process ("),e("code",[t._v('process_viewer("load_collection")')]),t._v(") or you can pass on all processes ("),e("code",[t._v("process_viewer(processes)")]),t._v("). When all processes are chosen, there is also a search bar and a category tree.")])]),t._v(" "),e("h2",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("p",[t._v("In the code snippets above we did not need to log in\nsince we just queried publicly available back-end information.\nHowever, to run non-trivial processing queries one has to authenticate\nso that permissions, resource usage, etc. can be managed properly.")]),t._v(" "),e("p",[t._v("To handle authentication, openEO leverages "),e("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect (OIDC)"),e("OutboundLink")],1),t._v(".\nIt offers some interesting features (e.g., a user can securely reuse an existing account),\nbut is a fairly complex topic, discussed in more depth on the "),e("RouterLink",{attrs:{to:"/join/free_trial.html"}},[t._v("Free Trial")]),t._v(" page.")],1),t._v(" "),e("p",[t._v("The following code snippet shows how to log in via OIDC authentication:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("login"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method opens your system web browser, with which you can authenticate yourself on the back-end authentication system.\nAfter that the website will give you the instructions to go back to the R client, where your connection has logged your account in.\nThis means, that every call that comes after that via the connection variable is executed by your user account.")]),t._v(" "),e("h2",{attrs:{id:"creating-a-user-defined-process"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-defined-process"}},[t._v("#")]),t._v(" Creating a (user-defined) process")]),t._v(" "),e("p",[t._v("Now that we know how to discover the back-end and how to authenticate, lets continue by creating a new batch job to process some data.")]),t._v(" "),e("p",[t._v("First we need to create a process builder object that carries all the available predefined openEO processes of the connected back-end as attached R functions with the parameters stated in the process metadata.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("p "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The functions of the builder return process nodes, which represent a particular result in the workflow. As one of the first steps we need to select the source data collection.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This results in a process node that represents a "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#spatial-datacubes",target:"_blank",rel:"noopener noreferrer"}},[t._v("datacube"),e("OutboundLink")],1),t._v(' and contains the "SENTINEL1_GRD" data restricted to the given spatial extent, the given temporal extent and the given bands .')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Sample Data Retrieval")]),t._v(" "),e("p",[t._v("In order to get a better understanding about the processing mechanisms and the data structures used in openEO Platform, it helps to check the actual data from time to time.\nThe function "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/reference/get_sample.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("get_sample")]),e("OutboundLink")],1),t._v(" aids the user in downloading data for a very small spatial extent. It is automatically loaded into R so that you can directly inspect it with "),e("code",[t._v("stars")]),t._v('.\nRead the vignette on "'),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-02-sample_data.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sample Data Retrieval"),e("OutboundLink")],1),t._v('" for more details.')])]),t._v(" "),e("p",[t._v("Having the input data ready, we want to apply a process on the datacube.\nTherefore, we can call the process directly on the datacube object, which then returns a datacube with the process applied.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("min_reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("context"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n return"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("min"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nreduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" min_reducer"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The datacube is now reduced by the time dimension named "),e("code",[t._v("t")]),t._v(', by taking the minimum value of the timeseries values. Now the datacube has no time dimension left. Other so called "reducer" processes exist, e.g. for computing maximum and mean values.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Everything applied to the datacube at this point is neither executed locally on your machine nor executed on the back-end.\nIt just defines the input data and process chain the back-end needs to apply when it sends the datacube to the back-end and executes it there.\nHow this can be done is the topic of the next chapter.")])]),t._v(" "),e("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("formats "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_file_formats"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("GTIFF"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The first line retrieves the back-ends offered input and output formats. The second line creates the result node, which stores the data as a zipped GeoTiff.")]),t._v(" "),e("h2",{attrs:{id:"batch-job-management"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-management"}},[t._v("#")]),t._v(" Batch Job Management")]),t._v(" "),e("p",[t._v("After you have finished working on your (user-defined) process, we can now send it to the back-end and start the execution.\nIn openEO, an execution of a (user-defined) process is called a "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#data-processing-modes",target:"_blank",rel:"noopener noreferrer"}},[t._v("(batch) job"),e("OutboundLink")],1),t._v(".\nTherefore, we need to create a job at the back-end using our datacube, giving it the title "),e("code",[t._v("Example Title")]),t._v(".")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Example Title"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("code",[t._v("create_job")]),t._v(" method sends all necessary information to the back-end and creates a new job, which gets returned.\nAfter this, the job is just created, but has not started the execution at the back-end yet.\nIt needs to be queued for processing explicitly:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("start_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("It can be annoying to manage and monitor batch jobs via code.\nIf you want to use an interface for your batch jobs (or other resources) that is easier to use, you can also open the "),e("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Platform Editor"),e("OutboundLink")],1),t._v('.\nAfter login, you\'ll be able to manage and monitor your batch jobs in a near-realtime interactive environment; Look out for the "Data Processing" tab.\nYou may shut down your device or log out during the job runs on the backend. You can retrieve the status and results later and from any client.')])]),t._v(" "),e("p",[t._v("After the job was executed, status updates can be fetched by using the "),e("code",[t._v("list_jobs()")]),t._v(" function. This function returns a list of job descriptions, which can be indexed with the jobs ID to limit the search results. But remember that only "),e("code",[t._v("list_jobs()")]),t._v(" refreshes this list. So, to monitor a job you have to iteratively call the job ("),e("code",[t._v("describe_job()")]),t._v(") or the job list "),e("code",[t._v("list_jobs()")]),t._v(".")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("jobs "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_jobs"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njobs "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# printed as a tibble or data.frame, but the object is a list")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or use the job id (in this example 'cZ2ND0Z5nhBFNQFq') as index to get a particular job overview")]),t._v("\njobs"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("cZ2ND0Z5nhBFNQFq\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# alternatively request detailed information about the job")]),t._v("\ndescribe_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("When the job is finished, calling "),e("code",[t._v("download_results()")]),t._v(" will download the results of a job. Using "),e("code",[t._v("list_results()")]),t._v(" will return an overview about the created files and their download link or it states the error message, in case of an error.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# list the processed results")]),t._v("\nlist_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# download all the files into a folder on the file system")]),t._v("\ndownload_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" folder "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/some/folder/on/filesystem"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("The printing behavior and the actual data structure might differ!")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{582:function(t,e,a){"use strict";a.r(e);var s=a(4),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"get-started-with-the-openeo-r-client"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-r-client"}},[t._v("#")]),t._v(" Get started with the openEO R Client")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("You need to "),e("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[t._v("get an openEO Platform account"),e("OutboundLink")],1),t._v(" to access the processing infrastructure.")])]),t._v(" "),e("h2",{attrs:{id:"useful-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#useful-links"}},[t._v("#")]),t._v(" Useful links")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Vignettes"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Code Repository"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("for function documentation, use R's "),e("code",[t._v("?")]),t._v(" function or see the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("online documentation"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("Before you install the R client module into your R environment, please make sure that you have at least R version 3.6. Older versions might also work, but were not tested.")]),t._v(" "),e("p",[t._v("Stable releases can be installed from CRAN:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("install.packages"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Installing the development version")]),t._v(" "),e("p",[t._v("If you want to install the development version, you can install from GitHub. It may contain more features, but may also be unstable.")]),t._v(" "),e("p",[t._v("You need to have the package 'devtools' installed. If it is not installed use "),e("code",[t._v('install.packages("devtools")')]),t._v(".")]),t._v(" "),e("p",[t._v("Now you can use "),e("code",[t._v("install_github")]),t._v(" from the devtools package to install the development version:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("devtools"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("install_github"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("repo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Open-EO/openeo-r-client"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dependencies"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ref"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"develop"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("If this gives you an error, something went wrong with the installation so please check the requirements again.")])]),t._v(" "),e("p",[t._v("If you have still troubles installing the package, feel free to leave an issue at the "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub project"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Now that the installation was successfully finished, we can load the package and connect to openEO Platform.\nIn the following chapters we quickly walk through the main features of the R client.")]),t._v(" "),e("h2",{attrs:{id:"connect-to-openeo-platform-and-explore"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-to-openeo-platform-and-explore"}},[t._v("#")]),t._v(" Connect to openEO Platform and explore")]),t._v(" "),e("p",[t._v("First we need to establish a connection to the openEO Platform back-end,\nwhich is available at connection URL "),e("code",[t._v("https://openeo.cloud")]),t._v(", or just in short:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("library"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncon "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("host "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.cloud"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The object stored as variable "),e("code",[t._v("con")]),t._v(" is a connection and resembles the "),e("code",[t._v("OpenEOClient")]),t._v(" - an object, that bundles all information and functions to interact with the back-end. It can be used explicitly in all of the functions to determine which connection has to be used (usually parameter "),e("code",[t._v("con")]),t._v("). If only one connection is active, then you can omit the parameter, because the last active connection is always stored in a package environment and used if no specific connection was present (see "),e("code",[t._v("?active_connection")]),t._v(" in the package documentation).")]),t._v(" "),e("p",[t._v("The capabilities of the back-end and the collections are generally publicly available, unless the data collections are proprietary and licensing issues prevent the back-end provider from publishing the collection. For the publicly available information you do not need to have an account on the back-end for reading them.")]),t._v(" "),e("h3",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("p",[t._v('The EO data available at a back-end is organised in so-called collections.\nFor example, a back-end might provide fundamental satellite collections like "Sentinel 1" or "Sentinel 2",\nor preprocessed collections like "NDVI".\nCollections are used as input data for your openEO jobs.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v('More information on how openEO "collections" relate to terminology used in other systems can be found in\n'),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#eo-data-collections",target:"_blank",rel:"noopener noreferrer"}},[t._v("the openEO glossary"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("p",[t._v("To get the collection list can be indexed by the collections ID to get the more details about the overview information. With the "),e("code",[t._v("describe_collection")]),t._v(" function you can get an even more detailed information about the collection.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("collections "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# print an overview of the available collections (printed as data.frame or tibble)")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# to print more of the reduced overview metadata")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collections"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("SENTINEL1_GRD"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# Dictionary of the full metadata of the "SENTINEL1_GRD" collection (dict)')]),t._v("\ns2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" describe_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or use the collection entry from the list, e.g. collections$SENTINEL1_GRD")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s2"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("In general all metadata objects are based on lists, so you can use "),e("code",[t._v("str()")]),t._v(" to get the structure of the list and address fields by the "),e("code",[t._v("$")]),t._v(" operator.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If the package is used with RStudio the metadata can also be nicely rendered as a web page in the viewer panel by running "),e("code",[t._v('collection_viewer(x="SENTINEL1_GRD")')]),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Please note that the any of this code only creates a process graph representation of your EO analysis and does not take major processing power from you device.")])]),t._v(" "),e("p",[t._v('Processes in openEO are operations that can be applied on (EO) data\n(e.g. calculate the mean of an array, or mask out observations outside a given polygon).\nThe output of one process can be used as the input of another process,\nand by doing so, multiple processes can be connected that way in a larger "process graph":\na new (user-defined) processes that implements a certain algorithm.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Check "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("the openEO glossary"),e("OutboundLink")],1),t._v("\nfor more details on pre-defined, user-defined processes and process graphs.")])]),t._v(" "),e("p",[t._v("The following code snippet shows how to get the available processes:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# List of available openEO processes with full metadata")]),t._v("\nprocesses "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# List of available openEO processes by identifiers (string)")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("names"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# print metadata of the process with ID "load_collection"')]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processes"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("code",[t._v("list_processes()")]),t._v(" method returns a list of process metadata objects that the back-end provides.\nEach process list entry is a more complex list object (called 'ProcessInfo') and contains the process identifier and additional metadata about the process, such as expected arguments and return types.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("As for the collection, processes can also be rendered as a web page in the viewer panel, if RStudio is used. In order to open the viewer use "),e("code",[t._v("process_viewer()")]),t._v(" with either a particular process ("),e("code",[t._v('process_viewer("load_collection")')]),t._v(") or you can pass on all processes ("),e("code",[t._v("process_viewer(processes)")]),t._v("). When all processes are chosen, there is also a search bar and a category tree.")])]),t._v(" "),e("h2",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("p",[t._v("In the code snippets above we did not need to log in\nsince we just queried publicly available back-end information.\nHowever, to run non-trivial processing queries one has to authenticate\nso that permissions, resource usage, etc. can be managed properly.")]),t._v(" "),e("p",[t._v("To handle authentication, openEO leverages "),e("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect (OIDC)"),e("OutboundLink")],1),t._v(".\nIt offers some interesting features (e.g., a user can securely reuse an existing account),\nbut is a fairly complex topic, discussed in more depth on the "),e("RouterLink",{attrs:{to:"/join/free_trial.html"}},[t._v("Free Trial")]),t._v(" page.")],1),t._v(" "),e("p",[t._v("The following code snippet shows how to log in via OIDC authentication:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("login"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method opens your system web browser, with which you can authenticate yourself on the back-end authentication system.\nAfter that the website will give you the instructions to go back to the R client, where your connection has logged your account in.\nThis means, that every call that comes after that via the connection variable is executed by your user account.")]),t._v(" "),e("h2",{attrs:{id:"creating-a-user-defined-process"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-defined-process"}},[t._v("#")]),t._v(" Creating a (user-defined) process")]),t._v(" "),e("p",[t._v("Now that we know how to discover the back-end and how to authenticate, lets continue by creating a new batch job to process some data.")]),t._v(" "),e("p",[t._v("First we need to create a process builder object that carries all the available predefined openEO processes of the connected back-end as attached R functions with the parameters stated in the process metadata.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("p "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The functions of the builder return process nodes, which represent a particular result in the workflow. As one of the first steps we need to select the source data collection.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This results in a process node that represents a "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#spatial-datacubes",target:"_blank",rel:"noopener noreferrer"}},[t._v("datacube"),e("OutboundLink")],1),t._v(' and contains the "SENTINEL1_GRD" data restricted to the given spatial extent, the given temporal extent and the given bands .')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Sample Data Retrieval")]),t._v(" "),e("p",[t._v("In order to get a better understanding about the processing mechanisms and the data structures used in openEO Platform, it helps to check the actual data from time to time.\nThe function "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/reference/get_sample.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("get_sample")]),e("OutboundLink")],1),t._v(" aids the user in downloading data for a very small spatial extent. It is automatically loaded into R so that you can directly inspect it with "),e("code",[t._v("stars")]),t._v('.\nRead the vignette on "'),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-02-sample_data.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sample Data Retrieval"),e("OutboundLink")],1),t._v('" for more details.')])]),t._v(" "),e("p",[t._v("Having the input data ready, we want to apply a process on the datacube.\nTherefore, we can call the process directly on the datacube object, which then returns a datacube with the process applied.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("min_reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("context"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n return"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("min"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nreduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" min_reducer"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The datacube is now reduced by the time dimension named "),e("code",[t._v("t")]),t._v(', by taking the minimum value of the timeseries values. Now the datacube has no time dimension left. Other so called "reducer" processes exist, e.g. for computing maximum and mean values.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Everything applied to the datacube at this point is neither executed locally on your machine nor executed on the back-end.\nIt just defines the input data and process chain the back-end needs to apply when it sends the datacube to the back-end and executes it there.\nHow this can be done is the topic of the next chapter.")])]),t._v(" "),e("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("formats "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_file_formats"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("GTIFF"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The first line retrieves the back-ends offered input and output formats. The second line creates the result node, which stores the data as a zipped GeoTiff.")]),t._v(" "),e("h2",{attrs:{id:"batch-job-management"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-management"}},[t._v("#")]),t._v(" Batch Job Management")]),t._v(" "),e("p",[t._v("After you have finished working on your (user-defined) process, we can now send it to the back-end and start the execution.\nIn openEO, an execution of a (user-defined) process is called a "),e("a",{attrs:{href:"https://openeo.org/documentation/1.0/glossary.html#data-processing-modes",target:"_blank",rel:"noopener noreferrer"}},[t._v("(batch) job"),e("OutboundLink")],1),t._v(".\nTherefore, we need to create a job at the back-end using our datacube, giving it the title "),e("code",[t._v("Example Title")]),t._v(".")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Example Title"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("code",[t._v("create_job")]),t._v(" method sends all necessary information to the back-end and creates a new job, which gets returned.\nAfter this, the job is just created, but has not started the execution at the back-end yet.\nIt needs to be queued for processing explicitly:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("start_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("It can be annoying to manage and monitor batch jobs via code.\nIf you want to use an interface for your batch jobs (or other resources) that is easier to use, you can also open the "),e("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Platform Editor"),e("OutboundLink")],1),t._v('.\nAfter login, you\'ll be able to manage and monitor your batch jobs in a near-realtime interactive environment; Look out for the "Data Processing" tab.\nYou may shut down your device or log out during the job runs on the backend. You can retrieve the status and results later and from any client.')])]),t._v(" "),e("p",[t._v("After the job was executed, status updates can be fetched by using the "),e("code",[t._v("list_jobs()")]),t._v(" function. This function returns a list of job descriptions, which can be indexed with the jobs ID to limit the search results. But remember that only "),e("code",[t._v("list_jobs()")]),t._v(" refreshes this list. So, to monitor a job you have to iteratively call the job ("),e("code",[t._v("describe_job()")]),t._v(") or the job list "),e("code",[t._v("list_jobs()")]),t._v(".")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("jobs "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_jobs"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njobs "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# printed as a tibble or data.frame, but the object is a list")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or use the job id (in this example 'cZ2ND0Z5nhBFNQFq') as index to get a particular job overview")]),t._v("\njobs"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("cZ2ND0Z5nhBFNQFq\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# alternatively request detailed information about the job")]),t._v("\ndescribe_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("When the job is finished, calling "),e("code",[t._v("download_results()")]),t._v(" will download the results of a job. Using "),e("code",[t._v("list_results()")]),t._v(" will return an overview about the created files and their download link or it states the error message, in case of an error.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# list the processed results")]),t._v("\nlist_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# download all the files into a folder on the file system")]),t._v("\ndownload_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" folder "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/some/folder/on/filesystem"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("The printing behavior and the actual data structure might differ!")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/77.330e2a52.js b/assets/js/77.3203cab1.js similarity index 79% rename from assets/js/77.330e2a52.js rename to assets/js/77.3203cab1.js index 7f056e907..684e8fd88 100644 --- a/assets/js/77.330e2a52.js +++ b/assets/js/77.3203cab1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{585:function(t,s,e){"use strict";e.r(s);var n=e(4),o=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ProcessesSpec")],1)}),[],!1,null,null,null);s.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{584:function(t,s,e){"use strict";e.r(s);var n=e(4),o=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ProcessesSpec")],1)}),[],!1,null,null,null);s.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/78.75f0e529.js b/assets/js/78.f460f193.js similarity index 96% rename from assets/js/78.75f0e529.js rename to assets/js/78.f460f193.js index 121f189ed..307e9600c 100644 --- a/assets/js/78.75f0e529.js +++ b/assets/js/78.f460f193.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{584:function(e,a,t){"use strict";t.r(a);var s=t(4),r=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"analysis-ready-data-ard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#analysis-ready-data-ard"}},[e._v("#")]),e._v(" Analysis-Ready Data (ARD)")]),e._v(" "),a("p",[e._v("For certain use cases, the readily available preprocessed data collections in the openEO back-ends\nare not sufficient or inappropriately preprocessed.\nopenEO supports some processes to address very common preprocessing scenarios:")]),e._v(" "),a("ul",[a("li",[e._v("Atmospheric correction of optical data")]),e._v(" "),a("li",[e._v("SAR backscatter computation")])]),e._v(" "),a("p",[e._v("These processes also offer a number of parameters to customize the processing.\nThere are also variants with a default\nparametrization that results in data that is compliant with "),a("a",{attrs:{href:"https://ceos.org/ard/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CEOS CARD4L specifications"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("We should note that these operations can be computationally expensive, so certainly affect overall processing time and\ncost of your final algorithm. Hence, make sure to make an informed decision when you decide to use these methods.")]),e._v(" "),a("p",[a("strong",[e._v("Examples:")])]),e._v(" "),a("ul",[a("li",[a("RouterLink",{attrs:{to:"/usecases/ard/sar/"}},[e._v("SAR")])],1),e._v(" "),a("li",[a("RouterLink",{attrs:{to:"/usecases/ard/msi/"}},[e._v("Multi-Spectral Imagery")])],1)])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{587:function(e,a,t){"use strict";t.r(a);var s=t(4),r=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"analysis-ready-data-ard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#analysis-ready-data-ard"}},[e._v("#")]),e._v(" Analysis-Ready Data (ARD)")]),e._v(" "),a("p",[e._v("For certain use cases, the readily available preprocessed data collections in the openEO back-ends\nare not sufficient or inappropriately preprocessed.\nopenEO supports some processes to address very common preprocessing scenarios:")]),e._v(" "),a("ul",[a("li",[e._v("Atmospheric correction of optical data")]),e._v(" "),a("li",[e._v("SAR backscatter computation")])]),e._v(" "),a("p",[e._v("These processes also offer a number of parameters to customize the processing.\nThere are also variants with a default\nparametrization that results in data that is compliant with "),a("a",{attrs:{href:"https://ceos.org/ard/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CEOS CARD4L specifications"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("We should note that these operations can be computationally expensive, so certainly affect overall processing time and\ncost of your final algorithm. Hence, make sure to make an informed decision when you decide to use these methods.")]),e._v(" "),a("p",[a("strong",[e._v("Examples:")])]),e._v(" "),a("ul",[a("li",[a("RouterLink",{attrs:{to:"/usecases/ard/sar/"}},[e._v("SAR")])],1),e._v(" "),a("li",[a("RouterLink",{attrs:{to:"/usecases/ard/msi/"}},[e._v("Multi-Spectral Imagery")])],1)])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/79.cbb0e1a6.js b/assets/js/79.99ecef1d.js similarity index 99% rename from assets/js/79.cbb0e1a6.js rename to assets/js/79.99ecef1d.js index 526fee8a7..e2d0fa71f 100644 --- a/assets/js/79.cbb0e1a6.js +++ b/assets/js/79.99ecef1d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{588:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"analysis-ready-data-for-multi-spectral-imagery-sentinel-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#analysis-ready-data-for-multi-spectral-imagery-sentinel-2"}},[t._v("#")]),t._v(" Analysis-Ready Data for Multi-Spectral Imagery (Sentinel-2)")]),t._v(" "),s("p",[t._v("Executable code for this guide can be found in a "),s("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/openEO%20Platform%20-%20Optical%20ARD.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("dedicated notebook"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"atmospheric-correction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#atmospheric-correction"}},[t._v("#")]),t._v(" Atmospheric correction")]),t._v(" "),s("p",[t._v("The "),s("RouterLink",{attrs:{to:"/processes/#atmospheric_correction"}},[t._v("atmospheric correction")]),t._v(" process can apply a chosen\nmethod on raw 'L1C' data. The supported methods and input datasets depend on the back-end, because not every method is\nvalidated or works on any dataset, and different back-ends try to offer a variety of options. This gives you as a user\nmore options to run and compare different methods, and select the most suitable one for your case.")],1),t._v(" "),s("p",[t._v("To perform an "),s("RouterLink",{attrs:{to:"/processes/#atmospheric_correction"}},[t._v("atmospheric correction")]),t._v(", the user has to load an\n"),s("a",{attrs:{href:"/data-collections/?q=L1C"}},[t._v("uncorrected L1C optical dataset")]),t._v(" with the "),s("code",[t._v("load_collection")]),t._v(" process\nand immediately apply the "),s("code",[t._v("atmospheric_correction")]),t._v(" process to it.")],1),t._v(" "),s("p",[t._v("The CARD4L variant of this process is "),s("code",[t._v("ard_surface_reflectance")]),t._v(".\nThis process generates Analysis-Ready Data (ARD) following the "),s("a",{attrs:{href:"https://ceos.org/ard/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("CEOS CARD4L specifications"),s("OutboundLink")],1),t._v(",\nand thus can perform additional processing steps, like a BRDF correction, that are not yet available as a separate process.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Load the data. You have to specify a collection ID, spatial_extent and temporal_extent")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Either apply")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("atmospheric_correction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or ")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ard_surface_reflectance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("atmospheric_correction_method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'...'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cloud_detection_method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'...'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("For more details see the Python client documentation for the respective methods:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.atmospheric_correction",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("DataCube.atmospheric_correction")]),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.ard_surface_reflectance",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("DataCube.ard_surface_reflectance")]),s("OutboundLink")],1)])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Load the data. You have to specify a collection ID, spatial_extent and temporal_extent")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Either apply")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("atmospheric_correction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or ")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ard_surface_reflectance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'...'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// atmospheric_correction_method")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'...'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// cloud_detection_method")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("These correction algorithms are typically tightly coupled with the raw data,\nso it is important they are applied immediately after the "),s("code",[t._v("load_collection")]),t._v(" process.\nIt is recommended to avoid any other operations in between.")])]),t._v(" "),s("h3",{attrs:{id:"reference-implementations"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#reference-implementations"}},[t._v("#")]),t._v(" Reference implementations")]),t._v(" "),s("p",[t._v("This section shows a few working examples for these processes.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("Please note that you need to connect and authenticate to openEO Platform first before you\ncan execute any of the code snippets below.\nDetails can be found in the corresponding Getting Started guides.")])]),t._v(" "),s("h4",{attrs:{id:"force-toolbox-provided-by-eodc"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#force-toolbox-provided-by-eodc"}},[t._v("#")]),t._v(" FORCE toolbox (provided by EODC)")]),t._v(" "),s("p",[t._v("EODC supports the "),s("code",[t._v("ard_surface_reflectance")]),t._v(" process, which internally uses the "),s("a",{attrs:{href:"https://github.com/davidfrantz/force",target:"_blank",rel:"noopener noreferrer"}},[t._v("FORCE toolbox"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("This is an example of applying FORCE:")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.29")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.39")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ard_surface_reflectance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("atmospheric_correction_method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'FORCE'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cloud_detection_method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Fmask'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'force.tif'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.29")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.39")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ard_surface_reflectance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'FORCE'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Fmask'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'ARD for Sentinel-2 MSI'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h4",{attrs:{id:"icor-smac-provided-by-vito-terrascope"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#icor-smac-provided-by-vito-terrascope"}},[t._v("#")]),t._v(" iCor / SMAC (provided by VITO / TerraScope)")]),t._v(" "),s("p",[t._v("The Terrascope back-end implements "),s("code",[t._v("atmospheric_correction")]),t._v(" with iCor and SMAC as methods.\nThe version of "),s("a",{attrs:{href:"https://remotesensing.vito.be/case/icor",target:"_blank",rel:"noopener noreferrer"}},[t._v("iCor"),s("OutboundLink")],1),t._v(" only offers basic atmoshperic correction features,\nwithout special options for water products.\nSMAC is implemented based on: "),s("a",{attrs:{href:"https://github.com/olivierhagolle/SMAC",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/olivierhagolle/SMAC"),s("OutboundLink")],1),t._v("\nBoth methods have been tested with Sentinel-2 as input.\nThe viewing and sun angles need to be selected by the user to make them available for the algorithm.")]),t._v(" "),s("p",[t._v("This is an example of applying iCor:")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C_SENTINELHUB'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.29")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.39")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B04'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B03'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B02'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B09'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B8A'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B11'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sunAzimuthAngles'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sunZenithAngles'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'viewAzimuthMean'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'viewZenithMean'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("atmospheric_correction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'iCor'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'rgb-icor.geotiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C_SENTINELHUB'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.29")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.39")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B04'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B03'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B02'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B09'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B8A'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B11'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sunAzimuthAngles'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sunZenithAngles'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'viewAzimuthMean'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'viewZenithMean'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("atmospheric_correction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'iCor'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Atmospherically corrected Sentinel-2 MSI'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])})],1)}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{586:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"analysis-ready-data-for-multi-spectral-imagery-sentinel-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#analysis-ready-data-for-multi-spectral-imagery-sentinel-2"}},[t._v("#")]),t._v(" Analysis-Ready Data for Multi-Spectral Imagery (Sentinel-2)")]),t._v(" "),s("p",[t._v("Executable code for this guide can be found in a "),s("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/openEO%20Platform%20-%20Optical%20ARD.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("dedicated notebook"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"atmospheric-correction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#atmospheric-correction"}},[t._v("#")]),t._v(" Atmospheric correction")]),t._v(" "),s("p",[t._v("The "),s("RouterLink",{attrs:{to:"/processes/#atmospheric_correction"}},[t._v("atmospheric correction")]),t._v(" process can apply a chosen\nmethod on raw 'L1C' data. The supported methods and input datasets depend on the back-end, because not every method is\nvalidated or works on any dataset, and different back-ends try to offer a variety of options. This gives you as a user\nmore options to run and compare different methods, and select the most suitable one for your case.")],1),t._v(" "),s("p",[t._v("To perform an "),s("RouterLink",{attrs:{to:"/processes/#atmospheric_correction"}},[t._v("atmospheric correction")]),t._v(", the user has to load an\n"),s("a",{attrs:{href:"/data-collections/?q=L1C"}},[t._v("uncorrected L1C optical dataset")]),t._v(" with the "),s("code",[t._v("load_collection")]),t._v(" process\nand immediately apply the "),s("code",[t._v("atmospheric_correction")]),t._v(" process to it.")],1),t._v(" "),s("p",[t._v("The CARD4L variant of this process is "),s("code",[t._v("ard_surface_reflectance")]),t._v(".\nThis process generates Analysis-Ready Data (ARD) following the "),s("a",{attrs:{href:"https://ceos.org/ard/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("CEOS CARD4L specifications"),s("OutboundLink")],1),t._v(",\nand thus can perform additional processing steps, like a BRDF correction, that are not yet available as a separate process.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Load the data. You have to specify a collection ID, spatial_extent and temporal_extent")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Either apply")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("atmospheric_correction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or ")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ard_surface_reflectance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("atmospheric_correction_method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'...'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cloud_detection_method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'...'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("For more details see the Python client documentation for the respective methods:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.atmospheric_correction",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("DataCube.atmospheric_correction")]),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.ard_surface_reflectance",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("DataCube.ard_surface_reflectance")]),s("OutboundLink")],1)])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Load the data. You have to specify a collection ID, spatial_extent and temporal_extent")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Either apply")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("atmospheric_correction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or ")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ard_surface_reflectance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'...'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// atmospheric_correction_method")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'...'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// cloud_detection_method")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("These correction algorithms are typically tightly coupled with the raw data,\nso it is important they are applied immediately after the "),s("code",[t._v("load_collection")]),t._v(" process.\nIt is recommended to avoid any other operations in between.")])]),t._v(" "),s("h3",{attrs:{id:"reference-implementations"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#reference-implementations"}},[t._v("#")]),t._v(" Reference implementations")]),t._v(" "),s("p",[t._v("This section shows a few working examples for these processes.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("Please note that you need to connect and authenticate to openEO Platform first before you\ncan execute any of the code snippets below.\nDetails can be found in the corresponding Getting Started guides.")])]),t._v(" "),s("h4",{attrs:{id:"force-toolbox-provided-by-eodc"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#force-toolbox-provided-by-eodc"}},[t._v("#")]),t._v(" FORCE toolbox (provided by EODC)")]),t._v(" "),s("p",[t._v("EODC supports the "),s("code",[t._v("ard_surface_reflectance")]),t._v(" process, which internally uses the "),s("a",{attrs:{href:"https://github.com/davidfrantz/force",target:"_blank",rel:"noopener noreferrer"}},[t._v("FORCE toolbox"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("This is an example of applying FORCE:")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.29")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.39")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ard_surface_reflectance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("atmospheric_correction_method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'FORCE'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cloud_detection_method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Fmask'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'force.tif'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.29")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.39")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ard_surface_reflectance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'FORCE'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Fmask'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'ARD for Sentinel-2 MSI'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h4",{attrs:{id:"icor-smac-provided-by-vito-terrascope"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#icor-smac-provided-by-vito-terrascope"}},[t._v("#")]),t._v(" iCor / SMAC (provided by VITO / TerraScope)")]),t._v(" "),s("p",[t._v("The Terrascope back-end implements "),s("code",[t._v("atmospheric_correction")]),t._v(" with iCor and SMAC as methods.\nThe version of "),s("a",{attrs:{href:"https://remotesensing.vito.be/case/icor",target:"_blank",rel:"noopener noreferrer"}},[t._v("iCor"),s("OutboundLink")],1),t._v(" only offers basic atmoshperic correction features,\nwithout special options for water products.\nSMAC is implemented based on: "),s("a",{attrs:{href:"https://github.com/olivierhagolle/SMAC",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/olivierhagolle/SMAC"),s("OutboundLink")],1),t._v("\nBoth methods have been tested with Sentinel-2 as input.\nThe viewing and sun angles need to be selected by the user to make them available for the algorithm.")]),t._v(" "),s("p",[t._v("This is an example of applying iCor:")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C_SENTINELHUB'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.29")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.39")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B04'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B03'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B02'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B09'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B8A'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B11'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sunAzimuthAngles'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sunZenithAngles'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'viewAzimuthMean'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'viewZenithMean'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("atmospheric_correction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("method "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'iCor'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'rgb-icor.geotiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL2_L1C_SENTINELHUB'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.29")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.39")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2017-03-07'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B04'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B03'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B02'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B09'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B8A'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B11'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sunAzimuthAngles'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sunZenithAngles'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'viewAzimuthMean'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'viewZenithMean'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("atmospheric_correction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'iCor'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Atmospherically corrected Sentinel-2 MSI'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])})],1)}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/80.e8e29e8b.js b/assets/js/80.6ee10739.js similarity index 99% rename from assets/js/80.e8e29e8b.js rename to assets/js/80.6ee10739.js index 1aed968e5..5751c9b98 100644 --- a/assets/js/80.e8e29e8b.js +++ b/assets/js/80.6ee10739.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{587:function(t,a,s){"use strict";s.r(a);var n=s(4),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"analysis-ready-data-for-sar-sentinel-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#analysis-ready-data-for-sar-sentinel-1"}},[t._v("#")]),t._v(" Analysis-Ready Data for SAR (Sentinel-1)")]),t._v(" "),a("p",[t._v("Executable code for this guide can be found in a "),a("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/openEO%20Platform%20-%20Radar%20ARD.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("dedicated notebook"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"backscatter-computation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#backscatter-computation"}},[t._v("#")]),t._v(" Backscatter computation")]),t._v(" "),a("p",[t._v("Data from synthetic aperture radar (SAR) sensors requires significant preprocessing to be calibrated and normalized for terrain.\nThis is referred to as backscatter computation, and provider in openEO Platform by")]),t._v(" "),a("ul",[a("li",[t._v("the "),a("RouterLink",{attrs:{to:"/processes/#sar_backscatter"}},[a("code",[t._v("sar_backscatter")]),t._v(" process")])],1),t._v(" "),a("li",[t._v("and its CARD4L compliant variant, the\n"),a("RouterLink",{attrs:{to:"/processes/#ard_normalized_radar_backscatter"}},[a("code",[t._v("ard_normalized_radar_backscatter")]),t._v(" process")])],1)]),t._v(" "),a("p",[t._v("To perform a backscatter computation, the user has to load an\n"),a("a",{attrs:{href:"/data-collections/?q=GRD"}},[t._v("raw SAR data")]),t._v(" with the "),a("code",[t._v("load_collection")]),t._v(" process\nand immediately apply ône of the processes to it.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Load the data. You have to specify a collection ID, spatial_extent and temporal_extent")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Either apply")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sar_backscatter"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or ")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ard_normalized_radar_backscatter"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("For more details see the Python client documentation for the respective methods:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.sar_backscatter",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DataCube.sar_backscatter")]),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.ard_normalized_radar_backscatter",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DataCube.ard_normalized_radar_backscatter")]),a("OutboundLink")],1)])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Load the data. You have to specify a collection ID, spatial_extent and temporal_extent")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Either apply")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sar_backscatter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or ")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ard_normalized_radar_backscatter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("These correction algorithms are typically tightly coupled with the raw data,\nso it is important they are applied immediately after the "),a("code",[t._v("load_collection")]),t._v(" process.\nIt is recommended to avoid any other operations in between.")])]),t._v(" "),a("h2",{attrs:{id:"reference-implementations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reference-implementations"}},[t._v("#")]),t._v(" Reference implementations")]),t._v(" "),a("p",[t._v("This section shows a few working examples for these processes.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),a("p",[t._v("Please note that you need to connect and authenticate to openEO Platform first before you\ncan execute any of the code snippets below.\nDetails can be found in the corresponding Getting Started guides.")])]),t._v(" "),a("h3",{attrs:{id:"card4l-nrb-for-sentinel1-grd-collection-provided-by-sentinel-hub"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#card4l-nrb-for-sentinel1-grd-collection-provided-by-sentinel-hub"}},[t._v("#")]),t._v(" CARD4L NRB for "),a("code",[t._v("SENTINEL1_GRD")]),t._v(" collection (provided by Sentinel Hub)")]),t._v(" "),a("p",[t._v("When working with the Sentinel Hub based "),a("a",{attrs:{href:"/data-collections/?q=SENTINEL1_GRD"}},[a("code",[t._v("SENTINEL1_GRD")]),t._v(" collection")]),t._v(", both SAR backscatter processes can be used.\nThe underlying implementation is provided by\n"),a("a",{attrs:{href:"https://docs.sentinel-hub.com/api/latest/data/sentinel-1-grd/#processing-options",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinel Hub"),a("OutboundLink")],1),t._v(", and offers full CARD4L compliant processing options.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL1_GRD'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.59003")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.8949")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.069")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.2206")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2019-10-10'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2019-10-10'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'VH'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'VV'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ard_normalized_radar_backscatter"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute_batch"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sar-nrb"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL1_GRD'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.59003")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.8949")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.069")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.2206")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2019-10-10'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2019-10-10'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'VH'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'VV'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ard_normalized_radar_backscatter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Backscatter for Sentinel-1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"orfeo-for-other-grd-collections-provided-by-vito-terrascope"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#orfeo-for-other-grd-collections-provided-by-vito-terrascope"}},[t._v("#")]),t._v(" Orfeo for other GRD collections (provided by VITO / TerraScope)")]),t._v(" "),a("p",[t._v("When working with other GRD data, an "),a("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-driver/blob/master/openeogeotrellis/collections/s1backscatter_orfeo.py",target:"_blank",rel:"noopener noreferrer"}},[t._v("implementation"),a("OutboundLink")],1),t._v(" based on "),a("a",{attrs:{href:"https://www.orfeo-toolbox.org/CookBook/Applications/app_SARCalibration.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Orfeo Toolbox"),a("OutboundLink")],1),t._v(" is used.")]),t._v(" "),a("p",[t._v("The Orfeo implementation currently only supports sigma0 computation, and is "),a("strong",[t._v("not CARD4L compliant")]),t._v(".")])],1)}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{590:function(t,a,s){"use strict";s.r(a);var n=s(4),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"analysis-ready-data-for-sar-sentinel-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#analysis-ready-data-for-sar-sentinel-1"}},[t._v("#")]),t._v(" Analysis-Ready Data for SAR (Sentinel-1)")]),t._v(" "),a("p",[t._v("Executable code for this guide can be found in a "),a("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/openEO%20Platform%20-%20Radar%20ARD.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("dedicated notebook"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"backscatter-computation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#backscatter-computation"}},[t._v("#")]),t._v(" Backscatter computation")]),t._v(" "),a("p",[t._v("Data from synthetic aperture radar (SAR) sensors requires significant preprocessing to be calibrated and normalized for terrain.\nThis is referred to as backscatter computation, and provider in openEO Platform by")]),t._v(" "),a("ul",[a("li",[t._v("the "),a("RouterLink",{attrs:{to:"/processes/#sar_backscatter"}},[a("code",[t._v("sar_backscatter")]),t._v(" process")])],1),t._v(" "),a("li",[t._v("and its CARD4L compliant variant, the\n"),a("RouterLink",{attrs:{to:"/processes/#ard_normalized_radar_backscatter"}},[a("code",[t._v("ard_normalized_radar_backscatter")]),t._v(" process")])],1)]),t._v(" "),a("p",[t._v("To perform a backscatter computation, the user has to load an\n"),a("a",{attrs:{href:"/data-collections/?q=GRD"}},[t._v("raw SAR data")]),t._v(" with the "),a("code",[t._v("load_collection")]),t._v(" process\nand immediately apply ône of the processes to it.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Load the data. You have to specify a collection ID, spatial_extent and temporal_extent")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Either apply")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sar_backscatter"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or ")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ard_normalized_radar_backscatter"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("For more details see the Python client documentation for the respective methods:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.sar_backscatter",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DataCube.sar_backscatter")]),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.ard_normalized_radar_backscatter",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DataCube.ard_normalized_radar_backscatter")]),a("OutboundLink")],1)])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Load the data. You have to specify a collection ID, spatial_extent and temporal_extent")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Either apply")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sar_backscatter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or ")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ard_normalized_radar_backscatter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("These correction algorithms are typically tightly coupled with the raw data,\nso it is important they are applied immediately after the "),a("code",[t._v("load_collection")]),t._v(" process.\nIt is recommended to avoid any other operations in between.")])]),t._v(" "),a("h2",{attrs:{id:"reference-implementations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reference-implementations"}},[t._v("#")]),t._v(" Reference implementations")]),t._v(" "),a("p",[t._v("This section shows a few working examples for these processes.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),a("p",[t._v("Please note that you need to connect and authenticate to openEO Platform first before you\ncan execute any of the code snippets below.\nDetails can be found in the corresponding Getting Started guides.")])]),t._v(" "),a("h3",{attrs:{id:"card4l-nrb-for-sentinel1-grd-collection-provided-by-sentinel-hub"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#card4l-nrb-for-sentinel1-grd-collection-provided-by-sentinel-hub"}},[t._v("#")]),t._v(" CARD4L NRB for "),a("code",[t._v("SENTINEL1_GRD")]),t._v(" collection (provided by Sentinel Hub)")]),t._v(" "),a("p",[t._v("When working with the Sentinel Hub based "),a("a",{attrs:{href:"/data-collections/?q=SENTINEL1_GRD"}},[a("code",[t._v("SENTINEL1_GRD")]),t._v(" collection")]),t._v(", both SAR backscatter processes can be used.\nThe underlying implementation is provided by\n"),a("a",{attrs:{href:"https://docs.sentinel-hub.com/api/latest/data/sentinel-1-grd/#processing-options",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sentinel Hub"),a("OutboundLink")],1),t._v(", and offers full CARD4L compliant processing options.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL1_GRD'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.59003")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.8949")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.069")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.2206")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2019-10-10'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2019-10-10'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'VH'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'VV'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ard_normalized_radar_backscatter"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute_batch"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sar-nrb"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SENTINEL1_GRD'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.59003")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.8949")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.069")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.2206")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2019-10-10'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2019-10-10'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'VH'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'VV'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ard_normalized_radar_backscatter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTiff'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" connection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Backscatter for Sentinel-1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"orfeo-for-other-grd-collections-provided-by-vito-terrascope"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#orfeo-for-other-grd-collections-provided-by-vito-terrascope"}},[t._v("#")]),t._v(" Orfeo for other GRD collections (provided by VITO / TerraScope)")]),t._v(" "),a("p",[t._v("When working with other GRD data, an "),a("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-driver/blob/master/openeogeotrellis/collections/s1backscatter_orfeo.py",target:"_blank",rel:"noopener noreferrer"}},[t._v("implementation"),a("OutboundLink")],1),t._v(" based on "),a("a",{attrs:{href:"https://www.orfeo-toolbox.org/CookBook/Applications/app_SARCalibration.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Orfeo Toolbox"),a("OutboundLink")],1),t._v(" is used.")]),t._v(" "),a("p",[t._v("The Orfeo implementation currently only supports sigma0 computation, and is "),a("strong",[t._v("not CARD4L compliant")]),t._v(".")])],1)}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/81.8cb7b02b.js b/assets/js/81.40cacd79.js similarity index 99% rename from assets/js/81.8cb7b02b.js rename to assets/js/81.40cacd79.js index 72a0895ef..ea3c1f85d 100644 --- a/assets/js/81.8cb7b02b.js +++ b/assets/js/81.40cacd79.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{590:function(t,a,s){"use strict";s.r(a);var n=s(4),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"crop-classification"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#crop-classification"}},[t._v("#")]),t._v(" Crop Classification")]),t._v(" "),a("p",[t._v("The goal of this section is to show how openEO functionality can be integrated into a basic feature engineering pipeline. We will do this using crop classification as an example.")]),t._v(" "),a("p",[t._v("The constantly increasing demand of food has resulted in a highly intensified agricultural production. This intensification on the one hand requires more planning and management, and on the other, threatens ecosystem services that need to be monitored by scientists and decision makers who rely on detailed spatial information of crop cover in agricultural areas.")]),t._v(" "),a("p",[t._v("Crop classification on a large scale is a challenging task, but with the recent advances in satellite sensor technology and the push of a.o. the ESA for higher resolution open satellite data with a frequent revisit time this task has become possible.")]),t._v(" "),a("p",[t._v("There are various approaches to crop classification. One can use basic rule-based classification, or use more sophisticated methods such as one of various machine learning models. In this example, we will show both of these approaches.")]),t._v(" "),a("p",[t._v("Generally, any classification task will contain the following steps:")]),t._v(" "),a("ul",[a("li",[t._v("(1) Preprocessing & feature engineering")]),t._v(" "),a("li",[t._v("(2) Training")]),t._v(" "),a("li",[t._v("(3) Classification & model evaluation")])]),t._v(" "),a("p",[t._v("We will have a more detailed look at all three of these steps, and provide code examples along the way.")]),t._v(" "),a("p",[t._v("To see a fully working example, you can check out "),a("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC3%20-%20Crop%20type%20feature%20engineering%20(rule-based).ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("this Python notebook on rule-based classification"),a("OutboundLink")],1),t._v(" or "),a("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC3%20-%20Crop%20type%20feature%20engineering%20using%20random%20forest.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("this Python notebook on classification using Random Forest"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://user-images.githubusercontent.com/10434651/138343588-951f9b24-e039-4598-bd31-2d771ce5a615.png",alt:"cropcover_closeup"}})]),t._v(" "),a("h2",{attrs:{id:"preprocessing-feature-engineering"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#preprocessing-feature-engineering"}},[t._v("#")]),t._v(" Preprocessing & feature engineering")]),t._v(" "),a("p",[t._v("Feature engineering refers to extracting a number of discriminative features from a single pixel timeseries or even a time series of EO data tiles. These features can in turn be used for any type of classification, ranging from an expert rule-based decision approach to regular machine learning techniques such as random forest or deep learning techniques based on neural networks.")]),t._v(" "),a("p",[t._v("Concrete examples of such features include basic statistics such as the percentiles or standard deviation of a vegetation index or the mean band value for given month, but can also be more complex such as derivatives of phenology or texture.")]),t._v(" "),a("p",[t._v("In general, data scientists like to explore the usefulness of a given feature set for a use case, or may even define new features. In some cases, the openEO processes will allow computing them, and in others, a 'user defined function' may be used to compute features that are not directly supported in openEO.")]),t._v(" "),a("h3",{attrs:{id:"data-preparation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#data-preparation"}},[t._v("#")]),t._v(" Data preparation")]),t._v(" "),a("p",[t._v('To correctly compute and use statistics over a timeseries, we need gap-free composites at fixed timesteps. The goal of temporal aggregation is to create these gap-free composites at equidistant temporal intervals. This is especially true in the case of optical data, which is often cloudmasked before this step, introducing a lot of gaps ("no-data" values).')]),t._v(" "),a("p",[t._v("Example:")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Create monthly composite")]),t._v("\ncomposite "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sentinel2_cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_temporal_period"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n period "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"month"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Fill gaps with linear interpolation")]),t._v("\ninterpolated "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" composite"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array_interpolate_linear"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create monthly composite")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("mean")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" composite "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("aggregate_temporal_period")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sentinel2_cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"month"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fill gaps with linear interpolation")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" interpolated "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("composite"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array_interpolate_linear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"computing-temporal-features"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#computing-temporal-features"}},[t._v("#")]),t._v(" Computing temporal features")]),t._v(" "),a("p",[t._v("For this use case, we will fully reduce the temporal dimension per band by calculating a number of stastics. These stastics are three quantiles, the mean and the standard deviation for each band. After computing the actual features, we have to make sure to rename the bands to reflect what has been calculated.")]),t._v(" "),a("p",[t._v("The effect of setting "),a("code",[t._v("target_dimension")]),t._v(" to "),a("code",[t._v("bands")]),t._v(" is that the 'time' dimension is removed, and replaced by the 'bands' dimension. We will use this same procedure to do band math on temporal features in the chapter "),a("a",{attrs:{href:"#rule-based-classification"}},[t._v('"Rule-based classification"')]),t._v(".")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ProcessBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" array_concat\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compute_features")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("input_timeseries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" ProcessBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" array_concat"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n input_timeseries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("quantiles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("probabilities"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("input_timeseries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" input_timeseries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nfeatures "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" interpolated"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n process"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("compute_features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n target_dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nnew_band_names "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n band "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"_"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" stat\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" band "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" interpolated"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("metadata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band_names\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" stat "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p10"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p50"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p90"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sd"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nfeatures "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" new_band_names"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create monthly composite")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("computeFeatures")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_concat")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("quantiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sd")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" features "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("interpolated"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" computeFeatures"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" collectionBands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B2'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fill this with the bands you've available in the data cube")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" stats "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p10"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p50"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p90"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sd"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" newBandNames "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" band "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" collectionBands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stat "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" stats"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n newBandNames"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("band "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"_"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" stat"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nfeatures "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("rename_labels")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" newBandNames"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Now, a complete datacube with features is available for further usage.")]),t._v(" "),a("h2",{attrs:{id:"model-training"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#model-training"}},[t._v("#")]),t._v(" Model training")]),t._v(" "),a("p",[t._v("Crop classification is generally tackled using a form of supervised learning, which requires a set of features with their respective labels. These labels often come in the form of labeled field polygons, however these polygons do not contain any of the features that your model might require. They need to be extracted from the DataCube that you created in the previous section.")]),t._v(" "),a("p",[t._v("In OpenEO, we can perform feature point/polygon extraction using the parameter "),a("code",[t._v("sample_by_feature=True")]),t._v(".")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("barley_points"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute_batch"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n title"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Point feature extraction"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n description"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature extraction for p10,p50,p90,sd and tsteps"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n out_format"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n sample_by_feature"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n job_options"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("job_options"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresults "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresults"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./data/barley_features"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("This will write the features of DataCube "),a("em",[t._v("features")]),t._v(" of every point in "),a("em",[t._v("barley_points")]),t._v(" to a separate netCDF file. Next we can read in all of these features with their respective label in a pandas dataframe, which can subsequently used for training. Training a model happens outside of openEO and will therefore not be explained in detail here,\nbut you can have a look at the random forest notebook if that is something you need help with.")]),t._v(" "),a("h2",{attrs:{id:"classification"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#classification"}},[t._v("#")]),t._v(" Classification")]),t._v(" "),a("h3",{attrs:{id:"rule-based-classification"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rule-based-classification"}},[t._v("#")]),t._v(" Rule-based classification")]),t._v(" "),a("p",[t._v("A simple approach is to define rules based on your features to classify crops. For example, when looking at temporal profiles of corn, we can see that the NDVI of may is smaller than the NDVI of june. By creating and iteratively refining rules for each of these crop types, we can get a first classification result.")]),t._v(" "),a("p",[t._v("However, to do this, we need to be able to do band math on the temporal dimension. Remember "),a("code",[t._v('target_dimension="bands"')]),t._v(" that we used before to calculate the statistics over the temporal dimension? We can use this again to stack the temporal dimension onto the band dimension.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("all_bands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target_dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("lambda")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nbandnames "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("band "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"_"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" stat "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" band "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("metadata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band_names "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" stat "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jan"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"feb"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apr"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"may"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jun"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jul"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"aug"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sep"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oct"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nov"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dec"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nall_bands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bandnames"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Next, we can do boolean comparison of features and see whether any given pixel matches the rules you determined.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("ndvi_may "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI_may"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_jun "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI_jun"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_jul "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI_jul"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_aug "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI_aug"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncorn "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi_may "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" ndvi_jun"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nbarley "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi_apr "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" ndvi_may"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi_jun "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" ndvi_jul"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Each of these rules results in a boolean that can be combined using geometric progression, to obtain a final cube containing all crop type predictions.")]),t._v(" "),a("h3",{attrs:{id:"supervised-classification-using-random-forest"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#supervised-classification-using-random-forest"}},[t._v("#")]),t._v(" Supervised classification using Random Forest")]),t._v(" "),a("p",[t._v("A more sophisticated approach is to use a machine learning model such as Random Forest. As mentioned before, training is done after feature extraction outside of openEO, and you can then pickle your model and store it on a repository.\nNext, you define a UDF that unpickles your model, predicts, and returns a new DataCube instance that contains the predicted values instead of the features.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("udf_rf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token triple-quoted-string string"}},[t._v('"""\nfrom openeo_udf.api.datacube import DataCube\nimport pickle\nimport urllib.request\nimport xarray\nfrom openeo.udf.xarraydatacube import XarrayDataCube\n\ndef apply_datacube(cube: XarrayDataCube, context: dict) -> XarrayDataCube:\n array = cube.get_array()\n stacked_array = array.stack(pixel=("x","y"))\n stacked_array = stacked_array.transpose()\n clf = pickle.load(urllib.request.urlopen("https://artifactory.vgt.vito.be:443/auxdata-public/openeo/rf_model.pkl"))\n pred_array = clf.predict(stacked_array)\n return DataCube(xarray.DataArray(pred_array.reshape(1,*array.shape[1:]), dims=["bands","y","x"]))\n"""')]),t._v("\n\nclf_results "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("code"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("udf_rf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" runtime"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Python"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pixel"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Note that if your labels are strings, you will have to map them to integers.\nYou can then download the classification results and plot it. Congratulations!")]),t._v(" "),a("p",[t._v("To see a fully working example, you can check out "),a("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC3%20-%20Crop%20type%20feature%20engineering%20(rule-based).ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("this Python notebook on rule-based classification"),a("OutboundLink")],1),t._v(" or "),a("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC3%20-%20Crop%20type%20feature%20engineering%20using%20random%20forest.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("this Python notebook on classification using Random Forest"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("We ran the code in that notebook for ~120 MGRS tiles to end up with a crop cover map for 5 countries in Europe, which looks like this:")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://user-images.githubusercontent.com/10434651/138342824-32d38fbe-7931-497c-8da3-47bbab7a3870.png",alt:"cropcover_5_countries"}})])],1)}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{592:function(t,a,s){"use strict";s.r(a);var n=s(4),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"crop-classification"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#crop-classification"}},[t._v("#")]),t._v(" Crop Classification")]),t._v(" "),a("p",[t._v("The goal of this section is to show how openEO functionality can be integrated into a basic feature engineering pipeline. We will do this using crop classification as an example.")]),t._v(" "),a("p",[t._v("The constantly increasing demand of food has resulted in a highly intensified agricultural production. This intensification on the one hand requires more planning and management, and on the other, threatens ecosystem services that need to be monitored by scientists and decision makers who rely on detailed spatial information of crop cover in agricultural areas.")]),t._v(" "),a("p",[t._v("Crop classification on a large scale is a challenging task, but with the recent advances in satellite sensor technology and the push of a.o. the ESA for higher resolution open satellite data with a frequent revisit time this task has become possible.")]),t._v(" "),a("p",[t._v("There are various approaches to crop classification. One can use basic rule-based classification, or use more sophisticated methods such as one of various machine learning models. In this example, we will show both of these approaches.")]),t._v(" "),a("p",[t._v("Generally, any classification task will contain the following steps:")]),t._v(" "),a("ul",[a("li",[t._v("(1) Preprocessing & feature engineering")]),t._v(" "),a("li",[t._v("(2) Training")]),t._v(" "),a("li",[t._v("(3) Classification & model evaluation")])]),t._v(" "),a("p",[t._v("We will have a more detailed look at all three of these steps, and provide code examples along the way.")]),t._v(" "),a("p",[t._v("To see a fully working example, you can check out "),a("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC3%20-%20Crop%20type%20feature%20engineering%20(rule-based).ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("this Python notebook on rule-based classification"),a("OutboundLink")],1),t._v(" or "),a("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC3%20-%20Crop%20type%20feature%20engineering%20using%20random%20forest.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("this Python notebook on classification using Random Forest"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://user-images.githubusercontent.com/10434651/138343588-951f9b24-e039-4598-bd31-2d771ce5a615.png",alt:"cropcover_closeup"}})]),t._v(" "),a("h2",{attrs:{id:"preprocessing-feature-engineering"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#preprocessing-feature-engineering"}},[t._v("#")]),t._v(" Preprocessing & feature engineering")]),t._v(" "),a("p",[t._v("Feature engineering refers to extracting a number of discriminative features from a single pixel timeseries or even a time series of EO data tiles. These features can in turn be used for any type of classification, ranging from an expert rule-based decision approach to regular machine learning techniques such as random forest or deep learning techniques based on neural networks.")]),t._v(" "),a("p",[t._v("Concrete examples of such features include basic statistics such as the percentiles or standard deviation of a vegetation index or the mean band value for given month, but can also be more complex such as derivatives of phenology or texture.")]),t._v(" "),a("p",[t._v("In general, data scientists like to explore the usefulness of a given feature set for a use case, or may even define new features. In some cases, the openEO processes will allow computing them, and in others, a 'user defined function' may be used to compute features that are not directly supported in openEO.")]),t._v(" "),a("h3",{attrs:{id:"data-preparation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#data-preparation"}},[t._v("#")]),t._v(" Data preparation")]),t._v(" "),a("p",[t._v('To correctly compute and use statistics over a timeseries, we need gap-free composites at fixed timesteps. The goal of temporal aggregation is to create these gap-free composites at equidistant temporal intervals. This is especially true in the case of optical data, which is often cloudmasked before this step, introducing a lot of gaps ("no-data" values).')]),t._v(" "),a("p",[t._v("Example:")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Create monthly composite")]),t._v("\ncomposite "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sentinel2_cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_temporal_period"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n period "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"month"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n reducer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Fill gaps with linear interpolation")]),t._v("\ninterpolated "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" composite"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n dimension "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n process "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array_interpolate_linear"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create monthly composite")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("mean")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" composite "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("aggregate_temporal_period")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sentinel2_cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"month"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fill gaps with linear interpolation")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" interpolated "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("composite"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array_interpolate_linear"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("h3",{attrs:{id:"computing-temporal-features"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#computing-temporal-features"}},[t._v("#")]),t._v(" Computing temporal features")]),t._v(" "),a("p",[t._v("For this use case, we will fully reduce the temporal dimension per band by calculating a number of stastics. These stastics are three quantiles, the mean and the standard deviation for each band. After computing the actual features, we have to make sure to rename the bands to reflect what has been calculated.")]),t._v(" "),a("p",[t._v("The effect of setting "),a("code",[t._v("target_dimension")]),t._v(" to "),a("code",[t._v("bands")]),t._v(" is that the 'time' dimension is removed, and replaced by the 'bands' dimension. We will use this same procedure to do band math on temporal features in the chapter "),a("a",{attrs:{href:"#rule-based-classification"}},[t._v('"Rule-based classification"')]),t._v(".")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ProcessBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" array_concat\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compute_features")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("input_timeseries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" ProcessBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" array_concat"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n input_timeseries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("quantiles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("probabilities"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("input_timeseries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" input_timeseries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nfeatures "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" interpolated"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n process"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("compute_features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n target_dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nnew_band_names "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n band "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"_"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" stat\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" band "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" interpolated"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("metadata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band_names\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" stat "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p10"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p50"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p90"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sd"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nfeatures "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" new_band_names"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create monthly composite")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("computeFeatures")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_concat")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("quantiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sd")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" features "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_dimension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("interpolated"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" computeFeatures"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" collectionBands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B2'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fill this with the bands you've available in the data cube")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" stats "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p10"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p50"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p90"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sd"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" newBandNames "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" band "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" collectionBands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stat "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" stats"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n newBandNames"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("band "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"_"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" stat"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nfeatures "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("rename_labels")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" newBandNames"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Now, a complete datacube with features is available for further usage.")]),t._v(" "),a("h2",{attrs:{id:"model-training"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#model-training"}},[t._v("#")]),t._v(" Model training")]),t._v(" "),a("p",[t._v("Crop classification is generally tackled using a form of supervised learning, which requires a set of features with their respective labels. These labels often come in the form of labeled field polygons, however these polygons do not contain any of the features that your model might require. They need to be extracted from the DataCube that you created in the previous section.")]),t._v(" "),a("p",[t._v("In OpenEO, we can perform feature point/polygon extraction using the parameter "),a("code",[t._v("sample_by_feature=True")]),t._v(".")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("barley_points"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute_batch"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n title"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Point feature extraction"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n description"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature extraction for p10,p50,p90,sd and tsteps"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n out_format"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n sample_by_feature"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n job_options"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("job_options"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresults "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresults"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./data/barley_features"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("This will write the features of DataCube "),a("em",[t._v("features")]),t._v(" of every point in "),a("em",[t._v("barley_points")]),t._v(" to a separate netCDF file. Next we can read in all of these features with their respective label in a pandas dataframe, which can subsequently used for training. Training a model happens outside of openEO and will therefore not be explained in detail here,\nbut you can have a look at the random forest notebook if that is something you need help with.")]),t._v(" "),a("h2",{attrs:{id:"classification"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#classification"}},[t._v("#")]),t._v(" Classification")]),t._v(" "),a("h3",{attrs:{id:"rule-based-classification"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rule-based-classification"}},[t._v("#")]),t._v(" Rule-based classification")]),t._v(" "),a("p",[t._v("A simple approach is to define rules based on your features to classify crops. For example, when looking at temporal profiles of corn, we can see that the NDVI of may is smaller than the NDVI of june. By creating and iteratively refining rules for each of these crop types, we can get a first classification result.")]),t._v(" "),a("p",[t._v("However, to do this, we need to be able to do band math on the temporal dimension. Remember "),a("code",[t._v('target_dimension="bands"')]),t._v(" that we used before to calculate the statistics over the temporal dimension? We can use this again to stack the temporal dimension onto the band dimension.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("all_bands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'t'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target_dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("lambda")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nbandnames "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("band "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"_"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" stat "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" band "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("metadata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band_names "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" stat "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jan"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"feb"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apr"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"may"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jun"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jul"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"aug"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sep"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oct"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nov"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dec"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nall_bands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bands'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bandnames"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Next, we can do boolean comparison of features and see whether any given pixel matches the rules you determined.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("ndvi_may "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI_may"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_jun "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI_jun"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_jul "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI_jul"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_aug "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" all_bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NDVI_aug"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncorn "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi_may "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" ndvi_jun"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nbarley "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi_apr "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" ndvi_may"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi_jun "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" ndvi_jul"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Each of these rules results in a boolean that can be combined using geometric progression, to obtain a final cube containing all crop type predictions.")]),t._v(" "),a("h3",{attrs:{id:"supervised-classification-using-random-forest"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#supervised-classification-using-random-forest"}},[t._v("#")]),t._v(" Supervised classification using Random Forest")]),t._v(" "),a("p",[t._v("A more sophisticated approach is to use a machine learning model such as Random Forest. As mentioned before, training is done after feature extraction outside of openEO, and you can then pickle your model and store it on a repository.\nNext, you define a UDF that unpickles your model, predicts, and returns a new DataCube instance that contains the predicted values instead of the features.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("udf_rf "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token triple-quoted-string string"}},[t._v('"""\nfrom openeo_udf.api.datacube import DataCube\nimport pickle\nimport urllib.request\nimport xarray\nfrom openeo.udf.xarraydatacube import XarrayDataCube\n\ndef apply_datacube(cube: XarrayDataCube, context: dict) -> XarrayDataCube:\n array = cube.get_array()\n stacked_array = array.stack(pixel=("x","y"))\n stacked_array = stacked_array.transpose()\n clf = pickle.load(urllib.request.urlopen("https://artifactory.vgt.vito.be:443/auxdata-public/openeo/rf_model.pkl"))\n pred_array = clf.predict(stacked_array)\n return DataCube(xarray.DataArray(pred_array.reshape(1,*array.shape[1:]), dims=["bands","y","x"]))\n"""')]),t._v("\n\nclf_results "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("code"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("udf_rf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" runtime"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Python"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pixel"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Note that if your labels are strings, you will have to map them to integers.\nYou can then download the classification results and plot it. Congratulations!")]),t._v(" "),a("p",[t._v("To see a fully working example, you can check out "),a("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC3%20-%20Crop%20type%20feature%20engineering%20(rule-based).ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("this Python notebook on rule-based classification"),a("OutboundLink")],1),t._v(" or "),a("a",{attrs:{href:"https://github.com/openEOPlatform/SRR2_notebooks/blob/main/UC3%20-%20Crop%20type%20feature%20engineering%20using%20random%20forest.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("this Python notebook on classification using Random Forest"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("We ran the code in that notebook for ~120 MGRS tiles to end up with a crop cover map for 5 countries in Europe, which looks like this:")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://user-images.githubusercontent.com/10434651/138342824-32d38fbe-7931-497c-8da3-47bbab7a3870.png",alt:"cropcover_5_countries"}})])],1)}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/82.570ab4a9.js b/assets/js/82.d5071b1f.js similarity index 99% rename from assets/js/82.570ab4a9.js rename to assets/js/82.d5071b1f.js index ffd489a43..189ed5940 100644 --- a/assets/js/82.570ab4a9.js +++ b/assets/js/82.d5071b1f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{594:function(t,a,s){"use strict";s.r(a);var e=s(4),n=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"dynamic-land-cover-service"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-land-cover-service"}},[t._v("#")]),t._v(" Dynamic land cover service")]),t._v(" "),a("p",[t._v("In this notebook we will be studying land cover mapping. Land cover mapping has been done since the onset of remote sensing, and LC products have been identified as a fundamental variable needed for studying the functional and morphological changes occurring in the Earth's ecosystems and the environment, and plays therefore an important role in studying climate change and carbon circulation (Congalton et al., 2014; Feddema et al., 2005; Sellers et al., 1997). In addition to that, it provides valuable information for policy development and a wide range of applications within natural sciences and life sciences, making it one of the most widely studied applications within remote sensing (Yu et al., 2014, Tucker et al., 1985; Running, 2008; Yang et al., 2013).")]),t._v(" "),a("p",[t._v("With this variety in application fields comes a variety of user needs. Depending on the use case, there may be large differences in the target labels desired, the target year(s) requested, the output resolution needed, the featureset used, the stratification strategy employed, and more. The goal of this use case is to show that OpenEO as a platform can deal with this variability, and we will do so through creating a userfriendly interface in which the user can set a variety of parameters that will tailor the pipeline from -reference set & L2A+GRD > to model > to inference- to the users needs.")]),t._v(" "),a("p",[t._v("In this notebook, helper functionality from "),a("a",{attrs:{href:"https://github.com/openEOPlatform/openeo-classification",target:"_blank",rel:"noopener noreferrer"}},[t._v("this repository"),a("OutboundLink")],1),t._v(" is used. It contains amongst others the entire feature building engineering workflow, so if you are interested in knowing how to do that or if you want to make more customizations towards your own use case, have a look at it. Note that the repository is not finalized, as it is a general repository also used for other purposes.")]),t._v(" "),a("p",[t._v("A full notebook for this use case can be found "),a("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/Dynamic%20land%20cover%20mapping.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://user-images.githubusercontent.com/10434651/162210357-48389c4a-d58c-46da-972d-14f6ade2312e.png",alt:"heelbelgie"}})]),t._v(" "),a("h2",{attrs:{id:"methodology"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#methodology"}},[t._v("#")]),t._v(" Methodology")]),t._v(" "),a("h3",{attrs:{id:"reference-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reference-data"}},[t._v("#")]),t._v(" Reference data")]),t._v(" "),a("p",[t._v("The reference dataset used in this section is the Land Use/Cover Area frame Survey (LUCAS) Copernicus dataset of 2018. LUCAS is an evenly spaced in-situ land use and land cover ground survey exercise that extends over the entire of the European Union. The Copernicus module extends up to 51m in four cardinal directions to delineate polygons for each of these points. The final product contains about 60,000 polygons, from which subsequent points can be sampled (d'Andrimont et al., 2021). You as a user can specify how many points to sample from these polygons to train your model. In addition, the user can upload extra target data to improve performance.")]),t._v(" "),a("h3",{attrs:{id:"input-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#input-data"}},[t._v("#")]),t._v(" Input data")]),t._v(" "),a("p",[t._v("The service created runs on features constructed from GRD sigma0 and L2A data. This data will be accessed through OpenEO platform from Terrascope and Sentinel Hub. You, as a user, can determine a time range, though the year should be kept to 2018, as that is the year in which the LUCAS Copernicus dataset was assembled. Data from other years can be extracted for prediction, provided that the user uploads their own reference set.")]),t._v(" "),a("h3",{attrs:{id:"preprocessing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#preprocessing"}},[t._v("#")]),t._v(" Preprocessing")]),t._v(" "),a("p",[t._v("The L2A data has been masked using the sen2cor sceneclassification, with a buffering approach developed at VITO and made available as a process called mask_scl_dilation. From the Sentinel-1 GRD collection, backscatter is calculated.")]),t._v(" "),a("h3",{attrs:{id:"feature-engineering"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#feature-engineering"}},[t._v("#")]),t._v(" Feature engineering")]),t._v(" "),a("p",[t._v("We select and calculate the following products from our input collections:")]),t._v(" "),a("ul",[a("li",[t._v("7 indices (NDVI, NDMI, NDGI, ANIR, NDRE1, NDRE2, NDRE5) and 2 bands (B06, B12) from the L2A collection")]),t._v(" "),a("li",[t._v("VV, VH and VV/VH (ratio) from the GRD sigma0 collection")])]),t._v(" "),a("p",[t._v("All layers are rescaled to 0 to 30000 for computational efficiency. The indices/bands are then aggregated temporally (for Sentinel-2 data: 10-day window using the median. For Sentinel-1 data: 12 day window using the mean. The median was used for the S2 collection instead of the mean to prevent possible artifacts caused by cloud shadows). The output is then interpolated linearly and the S1 cube is resampled spatially to a 10m resolution. Finally, 10 features are calculated on each of the band dimensions. These 10 features are the standard deviation, 25th, 50th and 75th percentile, and 6 equidistant t-steps. Through this procedure, we end up with a total of 120 features (12 bands x 10 features).")]),t._v(" "),a("h3",{attrs:{id:"model"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#model"}},[t._v("#")]),t._v(" Model")]),t._v(" "),a("p",[t._v("Where previously models had to be trained outside of openEO, we can now train Random Forest models in openEO itself. Hyperparameter tuning can be performed using a custom hyperparameter set. After training, the model is validated and used for prediction.")]),t._v(" "),a("h2",{attrs:{id:"implementation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#implementation"}},[t._v("#")]),t._v(" Implementation")]),t._v(" "),a("p",[t._v("First, we load in a dataset with target labels. In order for the model to work, the target labels need to be integers. Also, we extract some target points from the target polygons.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" geopandas "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" gpd\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo_classification"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("landuse_classification "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" sklearn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("model_selection "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" train_test_split\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" json\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" pathlib "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Path\n\nmask "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" box"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ny "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gpd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("read_file"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://artifactory.vgt.vito.be/auxdata-public/openeo/LUCAS_2018_Copernicus.gpkg"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("mask"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mask"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ny"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("lambda")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("centroid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ny"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LC1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LC1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("lambda")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("ord")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("65")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ny_train"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y_test "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" train_test_split"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" test_size"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.25")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" random_state"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("333")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Next, we will create our featureset and use this featureset to train a model. The indices from which you calculate features can be adjusted by a parameter, but if you'd want you could even create the entire feature engineering pipeline yourself. If you are interested in knowing how to do so, you can dive a little bit deeper into the openEO code found "),a("a",{attrs:{href:"https://github.com/openEOPlatform/openeo-classification/blob/main/src/openeo_classification/features.py",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" feature_list "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" load_lc_features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"terrascope"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"both"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datetime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("date"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2018")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datetime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("date"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2018")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nX "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("loads"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y_train"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nml_model "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" X"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("fit_class_random_forest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("target"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("loads"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y_train"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" num_trees"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("nrtrees"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmodel "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ml_model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_ml_model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ntraining_job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ntraining_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_and_wait"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Subsequently, we can calculate a number of validation metrics from our test set. To do so, we do inference for the points of our y-test set and write these predictions out to a netCDF. The function "),a("code",[t._v("calculate_validation_metrics")]),t._v(" (not part of openEO itself, but simply a client-side helper function) then loads in the y-test geojson and the netCDF with predicted values, extracts the points and stores the predicted values alongside their actual target labels in a dataframe.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("base_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cwd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"results"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testarea"')]),t._v("\nvalidation_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" base_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"validation"')]),t._v("\nvalidation_path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mkdir"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parents"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("exist_ok"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ny_test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_file"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filename"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validation_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'y_test.geojson'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("driver"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GeoJSON"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("loads"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y_test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npredicted "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("predict_random_forest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("model"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("training_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("linear_scale_range"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ntest_job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" predicted"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute_batch"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("out_format"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ntest_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validation_path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ngdf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" final_res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" calculate_validation_metrics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n path_to_test_geojson"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validation_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'y_test.geojson'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n path_to_test_raster"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validation_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openEO.nc"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("After inspecting the metrics and possibly further finetuning the model or dataset, we can do inference on an area of choice and write the result. Happy mapping!")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" feature_list "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" load_lc_features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"terrascope"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"both"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datetime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("date"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2018")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datetime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("date"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2018")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bbox"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.7")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.8")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npredicted "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("predict_random_forest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n model"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("training_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("linear_scale_range"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ninf_job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" predicted"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute_batch"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("out_format"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ninf_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("base_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"prediction"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[a("img",{attrs:{src:"https://user-images.githubusercontent.com/10434651/162389189-f20d8b4d-6509-4965-bf13-60590438d75c.png",alt:"tile31UFS"}})])],1)}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{593:function(t,a,s){"use strict";s.r(a);var e=s(4),n=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"dynamic-land-cover-service"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-land-cover-service"}},[t._v("#")]),t._v(" Dynamic land cover service")]),t._v(" "),a("p",[t._v("In this notebook we will be studying land cover mapping. Land cover mapping has been done since the onset of remote sensing, and LC products have been identified as a fundamental variable needed for studying the functional and morphological changes occurring in the Earth's ecosystems and the environment, and plays therefore an important role in studying climate change and carbon circulation (Congalton et al., 2014; Feddema et al., 2005; Sellers et al., 1997). In addition to that, it provides valuable information for policy development and a wide range of applications within natural sciences and life sciences, making it one of the most widely studied applications within remote sensing (Yu et al., 2014, Tucker et al., 1985; Running, 2008; Yang et al., 2013).")]),t._v(" "),a("p",[t._v("With this variety in application fields comes a variety of user needs. Depending on the use case, there may be large differences in the target labels desired, the target year(s) requested, the output resolution needed, the featureset used, the stratification strategy employed, and more. The goal of this use case is to show that OpenEO as a platform can deal with this variability, and we will do so through creating a userfriendly interface in which the user can set a variety of parameters that will tailor the pipeline from -reference set & L2A+GRD > to model > to inference- to the users needs.")]),t._v(" "),a("p",[t._v("In this notebook, helper functionality from "),a("a",{attrs:{href:"https://github.com/openEOPlatform/openeo-classification",target:"_blank",rel:"noopener noreferrer"}},[t._v("this repository"),a("OutboundLink")],1),t._v(" is used. It contains amongst others the entire feature building engineering workflow, so if you are interested in knowing how to do that or if you want to make more customizations towards your own use case, have a look at it. Note that the repository is not finalized, as it is a general repository also used for other purposes.")]),t._v(" "),a("p",[t._v("A full notebook for this use case can be found "),a("a",{attrs:{href:"https://github.com/openEOPlatform/sample-notebooks/blob/main/Dynamic%20land%20cover%20mapping.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://user-images.githubusercontent.com/10434651/162210357-48389c4a-d58c-46da-972d-14f6ade2312e.png",alt:"heelbelgie"}})]),t._v(" "),a("h2",{attrs:{id:"methodology"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#methodology"}},[t._v("#")]),t._v(" Methodology")]),t._v(" "),a("h3",{attrs:{id:"reference-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reference-data"}},[t._v("#")]),t._v(" Reference data")]),t._v(" "),a("p",[t._v("The reference dataset used in this section is the Land Use/Cover Area frame Survey (LUCAS) Copernicus dataset of 2018. LUCAS is an evenly spaced in-situ land use and land cover ground survey exercise that extends over the entire of the European Union. The Copernicus module extends up to 51m in four cardinal directions to delineate polygons for each of these points. The final product contains about 60,000 polygons, from which subsequent points can be sampled (d'Andrimont et al., 2021). You as a user can specify how many points to sample from these polygons to train your model. In addition, the user can upload extra target data to improve performance.")]),t._v(" "),a("h3",{attrs:{id:"input-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#input-data"}},[t._v("#")]),t._v(" Input data")]),t._v(" "),a("p",[t._v("The service created runs on features constructed from GRD sigma0 and L2A data. This data will be accessed through OpenEO platform from Terrascope and Sentinel Hub. You, as a user, can determine a time range, though the year should be kept to 2018, as that is the year in which the LUCAS Copernicus dataset was assembled. Data from other years can be extracted for prediction, provided that the user uploads their own reference set.")]),t._v(" "),a("h3",{attrs:{id:"preprocessing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#preprocessing"}},[t._v("#")]),t._v(" Preprocessing")]),t._v(" "),a("p",[t._v("The L2A data has been masked using the sen2cor sceneclassification, with a buffering approach developed at VITO and made available as a process called mask_scl_dilation. From the Sentinel-1 GRD collection, backscatter is calculated.")]),t._v(" "),a("h3",{attrs:{id:"feature-engineering"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#feature-engineering"}},[t._v("#")]),t._v(" Feature engineering")]),t._v(" "),a("p",[t._v("We select and calculate the following products from our input collections:")]),t._v(" "),a("ul",[a("li",[t._v("7 indices (NDVI, NDMI, NDGI, ANIR, NDRE1, NDRE2, NDRE5) and 2 bands (B06, B12) from the L2A collection")]),t._v(" "),a("li",[t._v("VV, VH and VV/VH (ratio) from the GRD sigma0 collection")])]),t._v(" "),a("p",[t._v("All layers are rescaled to 0 to 30000 for computational efficiency. The indices/bands are then aggregated temporally (for Sentinel-2 data: 10-day window using the median. For Sentinel-1 data: 12 day window using the mean. The median was used for the S2 collection instead of the mean to prevent possible artifacts caused by cloud shadows). The output is then interpolated linearly and the S1 cube is resampled spatially to a 10m resolution. Finally, 10 features are calculated on each of the band dimensions. These 10 features are the standard deviation, 25th, 50th and 75th percentile, and 6 equidistant t-steps. Through this procedure, we end up with a total of 120 features (12 bands x 10 features).")]),t._v(" "),a("h3",{attrs:{id:"model"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#model"}},[t._v("#")]),t._v(" Model")]),t._v(" "),a("p",[t._v("Where previously models had to be trained outside of openEO, we can now train Random Forest models in openEO itself. Hyperparameter tuning can be performed using a custom hyperparameter set. After training, the model is validated and used for prediction.")]),t._v(" "),a("h2",{attrs:{id:"implementation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#implementation"}},[t._v("#")]),t._v(" Implementation")]),t._v(" "),a("p",[t._v("First, we load in a dataset with target labels. In order for the model to work, the target labels need to be integers. Also, we extract some target points from the target polygons.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" geopandas "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" gpd\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo_classification"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("landuse_classification "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" sklearn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("model_selection "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" train_test_split\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" json\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" pathlib "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Path\n\nmask "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" box"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("51.2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ny "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gpd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("read_file"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://artifactory.vgt.vito.be/auxdata-public/openeo/LUCAS_2018_Copernicus.gpkg"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("mask"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mask"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ny"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("lambda")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("centroid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ny"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LC1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LC1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("lambda")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("ord")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("65")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ny_train"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y_test "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" train_test_split"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" test_size"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.25")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" random_state"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("333")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Next, we will create our featureset and use this featureset to train a model. The indices from which you calculate features can be adjusted by a parameter, but if you'd want you could even create the entire feature engineering pipeline yourself. If you are interested in knowing how to do so, you can dive a little bit deeper into the openEO code found "),a("a",{attrs:{href:"https://github.com/openEOPlatform/openeo-classification/blob/main/src/openeo_classification/features.py",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" feature_list "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" load_lc_features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"terrascope"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"both"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datetime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("date"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2018")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datetime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("date"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2018")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nX "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("loads"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y_train"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nml_model "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" X"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("fit_class_random_forest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("target"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("loads"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y_train"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" num_trees"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("nrtrees"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmodel "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ml_model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_ml_model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ntraining_job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" model"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ntraining_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_and_wait"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("Subsequently, we can calculate a number of validation metrics from our test set. To do so, we do inference for the points of our y-test set and write these predictions out to a netCDF. The function "),a("code",[t._v("calculate_validation_metrics")]),t._v(" (not part of openEO itself, but simply a client-side helper function) then loads in the y-test geojson and the netCDF with predicted values, extracts the points and stores the predicted values alongside their actual target labels in a dataframe.")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("base_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cwd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"results"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testarea"')]),t._v("\nvalidation_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" base_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"validation"')]),t._v("\nvalidation_path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mkdir"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parents"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("exist_ok"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ny_test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_file"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("filename"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validation_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'y_test.geojson'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("driver"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GeoJSON"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_spatial"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("loads"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y_test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npredicted "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("predict_random_forest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("model"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("training_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("linear_scale_range"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ntest_job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" predicted"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute_batch"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("out_format"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"netCDF"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ntest_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validation_path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ngdf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" final_res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" calculate_validation_metrics"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n path_to_test_geojson"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validation_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'y_test.geojson'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n path_to_test_raster"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validation_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openEO.nc"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[t._v("After inspecting the metrics and possibly further finetuning the model or dataset, we can do inference on an area of choice and write the result. Happy mapping!")]),t._v(" "),a("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" feature_list "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" load_lc_features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"terrascope"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"both"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datetime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("date"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2018")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datetime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("date"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2018")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" features"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bbox"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'west'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'east'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'south'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.7")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'north'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.8")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npredicted "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("predict_random_forest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n model"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("training_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("linear_scale_range"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ninf_job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" predicted"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute_batch"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("out_format"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ninf_job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("base_path "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"prediction"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[a("p",[a("em",[t._v("No JavaScript code available yet.")])])]},proxy:!0}])}),t._v(" "),a("p",[a("img",{attrs:{src:"https://user-images.githubusercontent.com/10434651/162389189-f20d8b4d-6509-4965-bf13-60590438d75c.png",alt:"tile31UFS"}})])],1)}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/app.b7647609.js b/assets/js/app.2fb86a9c.js similarity index 86% rename from assets/js/app.b7647609.js rename to assets/js/app.2fb86a9c.js index bf8b57294..ed3f053d5 100644 --- a/assets/js/app.b7647609.js +++ b/assets/js/app.2fb86a9c.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(e){function t(t){for(var r,a,s=t[0],c=t[1],l=t[2],f=0,p=[];f=0&&(t=e.slice(r),e=e.slice(0,r));var o=e.indexOf("?");return o>=0&&(n=e.slice(o+1),e=e.slice(0,o)),{path:e,query:n,hash:t}}(i.path||""),p=t&&t.path||"/",d=l.path?C(l.path,p,n||i.append):p,h=function(e,t,n){void 0===t&&(t={});var r,o=n||f;try{r=o(e||"")}catch(e){r={}}for(var i in t){var a=t[i];r[i]=Array.isArray(a)?a.map(u):u(a)}return r}(l.query,i.query,r&&r.options.parseQuery),v=i.hash||l.hash;return v&&"#"!==v.charAt(0)&&(v="#"+v),{_normalized:!0,path:d,query:h,hash:v}}var H,W=function(){},G={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,r=this.$route,i=n.resolve(this.to,r,this.append),a=i.location,s=i.route,c=i.href,l={},u=n.options.linkActiveClass,f=n.options.linkExactActiveClass,p=null==u?"router-link-active":u,v=null==f?"router-link-exact-active":f,m=null==this.activeClass?p:this.activeClass,g=null==this.exactActiveClass?v:this.exactActiveClass,y=s.redirectedFrom?h(null,q(s.redirectedFrom),null,n):s;l[g]=b(r,y,this.exactPath),l[m]=this.exact||this.exactPath?l[g]:function(e,t){return 0===e.path.replace(d,"/").indexOf(t.path.replace(d,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(r,y);var _=l[g]?this.ariaCurrentValue:null,x=function(e){K(e)&&(t.replace?n.replace(a,W):n.push(a,W))},w={click:K};Array.isArray(this.event)?this.event.forEach((function(e){w[e]=x})):w[this.event]=x;var k={class:l},C=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:c,route:s,navigate:x,isActive:l[m],isExactActive:l[g]});if(C){if(1===C.length)return C[0];if(C.length>1||!C.length)return 0===C.length?e():e("span",{},C)}if("a"===this.tag)k.on=w,k.attrs={href:c,"aria-current":_};else{var $=function e(t){var n;if(t)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=V(u.path,s.params),c(u,s,a)}if(s.path){s.params={};for(var d=0;d-1}function $e(e,t){return Ce(e)&&e._isRouter&&(null==t||e.type===t)}function Oe(e,t,n){var r=function(o){o>=e.length?n():e[o]?t(e[o],(function(){r(o+1)})):r(o+1)};r(0)}function Se(e){return function(t,n,r){var o=!1,i=0,a=null;je(e,(function(e,t,n,s){if("function"==typeof e&&void 0===e.cid){o=!0,i++;var c,l=Ae((function(t){var o;((o=t).__esModule||Ee&&"Module"===o[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:H.extend(t),n.components[s]=t,--i<=0&&r()})),u=Ae((function(e){var t="Failed to resolve async component "+s+": "+e;a||(a=Ce(e)?e:new Error(t),r(a))}));try{c=e(l,u)}catch(e){u(e)}if(c)if("function"==typeof c.then)c.then(l,u);else{var f=c.component;f&&"function"==typeof f.then&&f.then(l,u)}}})),o||r()}}function je(e,t){return Pe(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Pe(e){return Array.prototype.concat.apply([],e)}var Ee="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Ae(e){var t=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var Te=function(e,t){this.router=e,this.base=function(e){if(!e)if(J){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=m,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Le(e,t,n,r){var o=je(e,(function(e,r,o,i){var a=function(e,t){"function"!=typeof e&&(e=H.extend(e));return e.options[t]}(e,t);if(a)return Array.isArray(a)?a.map((function(e){return n(e,r,o,i)})):n(a,r,o,i)}));return Pe(r?o.reverse():o)}function Re(e,t){if(t)return function(){return e.apply(t,arguments)}}Te.prototype.listen=function(e){this.cb=e},Te.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Te.prototype.onError=function(e){this.errorCbs.push(e)},Te.prototype.transitionTo=function(e,t,n){var r,o=this;try{r=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),t&&t(r),o.ensureURL(),o.router.afterHooks.forEach((function(e){e&&e(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(e){e(r)})))}),(function(e){n&&n(e),e&&!o.ready&&($e(e,be.redirected)&&i===m||(o.ready=!0,o.readyErrorCbs.forEach((function(t){t(e)}))))}))},Te.prototype.confirmTransition=function(e,t,n){var r=this,o=this.current;this.pending=e;var i,a,s=function(e){!$e(e)&&Ce(e)&&(r.errorCbs.length?r.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},c=e.matched.length-1,l=o.matched.length-1;if(b(e,o)&&c===l&&e.matched[c]===o.matched[l])return this.ensureURL(),e.hash&&se(this.router,o,e,!1),s(((a=we(i=o,e,be.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var u=function(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,r=me&&n;r&&this.listeners.push(ae());var o=function(){var n=e.current,o=Ue(e.base);e.current===m&&o===e._startLocation||e.transitionTo(o,(function(e){r&&se(t,e,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ge($(r.base+e.fullPath)),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ye($(r.base+e.fullPath)),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Ue(this.base)!==this.current.fullPath){var t=$(this.base+this.current.fullPath);e?ge(t):ye(t)}},t.prototype.getCurrentLocation=function(){return Ue(this.base)},t}(Te);function Ue(e){var t=window.location.pathname,n=t.toLowerCase(),r=e.toLowerCase();return!e||n!==r&&0!==n.indexOf($(r+"/"))||(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Ie=function(e){function t(t,n,r){e.call(this,t,n),r&&function(e){var t=Ue(e);if(!/^\/#/.test(t))return window.location.replace($(e+"/#"+t)),!0}(this.base)||De()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=me&&t;n&&this.listeners.push(ae());var r=function(){var t=e.current;De()&&e.transitionTo(Fe(),(function(r){n&&se(e.router,r,t,!0),me||ze(r.fullPath)}))},o=me?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Be(e.fullPath),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ze(e.fullPath),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Fe()!==t&&(e?Be(t):ze(t))},t.prototype.getCurrentLocation=function(){return Fe()},t}(Te);function De(){var e=Fe();return"/"===e.charAt(0)||(ze("/"+e),!1)}function Fe(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Ne(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Be(e){me?ge(Ne(e)):window.location.hash=e}function ze(e){me?ye(Ne(e)):window.location.replace(Ne(e))}var Ve=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){$e(e,be.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Te),qe=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Z(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!me&&!1!==e.fallback,this.fallback&&(t="hash"),J||(t="abstract"),this.mode=t,t){case"history":this.history=new Me(this,e.base);break;case"hash":this.history=new Ie(this,e.base,this.fallback);break;case"abstract":this.history=new Ve(this,e.base);break;default:0}},He={currentRoute:{configurable:!0}};qe.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},He.currentRoute.get=function(){return this.history&&this.history.current},qe.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof Me||n instanceof Ie){var r=function(e){n.setupListeners(),function(e){var r=n.current,o=t.options.scrollBehavior;me&&o&&"fullPath"in e&&se(t,e,r,!1)}(e)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},qe.prototype.beforeEach=function(e){return Ge(this.beforeHooks,e)},qe.prototype.beforeResolve=function(e){return Ge(this.resolveHooks,e)},qe.prototype.afterEach=function(e){return Ge(this.afterHooks,e)},qe.prototype.onReady=function(e,t){this.history.onReady(e,t)},qe.prototype.onError=function(e){this.history.onError(e)},qe.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},qe.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},qe.prototype.go=function(e){this.history.go(e)},qe.prototype.back=function(){this.go(-1)},qe.prototype.forward=function(){this.go(1)},qe.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},qe.prototype.resolve=function(e,t,n){var r=q(e,t=t||this.history.current,n,this),o=this.match(r,t),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(e,t,n){var r="hash"===n?"#"+t:t;return e?$(e+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},qe.prototype.getRoutes=function(){return this.matcher.getRoutes()},qe.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},qe.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(qe.prototype,He);var We=qe;function Ge(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}qe.install=function e(t){if(!e.installed||H!==t){e.installed=!0,H=t;var n=function(e){return void 0!==e},r=function(e,t){var r=e.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",w),t.component("RouterLink",G);var o=t.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},qe.version="3.6.5",qe.isNavigationFailure=$e,qe.NavigationFailureType=be,qe.START_LOCATION=m,J&&window.Vue&&window.Vue.use(qe);var Ke={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(42)]).then(n.bind(null,251)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(28)]).then(n.bind(null,184)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(50)]).then(n.bind(null,158)),"components/Home":()=>Promise.all([n.e(0),n.e(32)]).then(n.bind(null,332)),"components/NavLink":()=>n.e(56).then(n.bind(null,156)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(27)]).then(n.bind(null,212)),"components/Navbar":()=>Promise.all([n.e(0),n.e(5),n.e(43)]).then(n.bind(null,541)),"components/Page":()=>Promise.all([n.e(0),n.e(26)]).then(n.bind(null,333)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(33)]).then(n.bind(null,219)),"components/PageNav":()=>Promise.all([n.e(0),n.e(29)]).then(n.bind(null,220)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(24)]).then(n.bind(null,334)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(51)]).then(n.bind(null,339)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,213)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(39)]).then(n.bind(null,185)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,179)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,564)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,554)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,555)),"layouts/404":()=>n.e(18).then(n.bind(null,556)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(5),n.e(9),n.e(11)]).then(n.bind(null,552)),NotFound:()=>n.e(18).then(n.bind(null,556)),Layout:()=>Promise.all([n.e(0),n.e(5),n.e(9),n.e(11)]).then(n.bind(null,552))},Je={"v-4e72e1d8":()=>n.e(62).then(n.bind(null,565)),"v-14e901dc":()=>n.e(63).then(n.bind(null,566)),"v-21917184":()=>n.e(64).then(n.bind(null,567)),"v-045b6323":()=>n.e(65).then(n.bind(null,568)),"v-acc004fa":()=>n.e(57).then(n.bind(null,569)),"v-3e291b63":()=>n.e(66).then(n.bind(null,570)),"v-78536523":()=>n.e(58).then(n.bind(null,571)),"v-700f1b88":()=>n.e(68).then(n.bind(null,572)),"v-688ffb43":()=>n.e(67).then(n.bind(null,573)),"v-21de1e8c":()=>n.e(69).then(n.bind(null,574)),"v-7ffae7c8":()=>n.e(59).then(n.bind(null,575)),"v-76e62a34":()=>n.e(70).then(n.bind(null,576)),"v-adb4d3cc":()=>n.e(71).then(n.bind(null,577)),"v-974804cc":()=>n.e(72).then(n.bind(null,578)),"v-779fe818":()=>n.e(73).then(n.bind(null,579)),"v-6b6d7bae":()=>n.e(75).then(n.bind(null,580)),"v-23074efc":()=>n.e(74).then(n.bind(null,581)),"v-a1f70a7a":()=>n.e(52).then(n.bind(null,582)),"v-a5deb388":()=>n.e(76).then(n.bind(null,583)),"v-d4caec3c":()=>n.e(78).then(n.bind(null,584)),"v-02b9217c":()=>n.e(77).then(n.bind(null,585)),"v-2ac201a4":()=>n.e(37).then(n.bind(null,586)),"v-c5fcf990":()=>n.e(80).then(n.bind(null,587)),"v-0937d47a":()=>n.e(79).then(n.bind(null,588)),"v-62bfd25c":()=>n.e(38).then(n.bind(null,589)),"v-65bcb302":()=>n.e(81).then(n.bind(null,590)),"v-2b5b0ed8":()=>n.e(54).then(n.bind(null,591)),"v-4a7f74ac":()=>n.e(55).then(n.bind(null,592)),"v-ddb09444":()=>n.e(53).then(n.bind(null,593)),"v-5041b7a0":()=>n.e(82).then(n.bind(null,594)),"v-589f7f88":()=>n.e(83).then(n.bind(null,595)),"v-697f60bc":()=>n.e(60).then(n.bind(null,596)),"v-e3af3008":()=>n.e(40).then(n.bind(null,597))};function Xe(e){const t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}const Ye=/-(\w)/g,Ze=Xe(e=>e.replace(Ye,(e,t)=>t?t.toUpperCase():"")),Qe=/\B([A-Z])/g,et=Xe(e=>e.replace(Qe,"-$1").toLowerCase()),tt=Xe(e=>e.charAt(0).toUpperCase()+e.slice(1));function nt(e,t){if(!t)return;if(e(t))return e(t);return t.includes("-")?e(tt(Ze(t))):e(tt(t))||e(et(t))}const rt=Object.assign({},Ke,Je),ot=e=>rt[e],it=e=>Je[e],at=e=>Ke[e],st=e=>r.a.component(e);function ct(e){return nt(it,e)}function lt(e){return nt(at,e)}function ut(e){return nt(ot,e)}function ft(e){return nt(st,e)}function pt(...e){return Promise.all(e.filter(e=>e).map(async e=>{if(!ft(e)&&ut(e)){const t=await ut(e)();r.a.component(e,t.default)}}))}function dt(e,t){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[e]=t)}var ht=n(47),vt=n.n(ht),mt=n(48),gt=n.n(mt),yt={created(){if(this.siteMeta=this.$site.headTags.filter(([e])=>"meta"===e).map(([e,t])=>t),this.$ssrContext){const t=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(e=t)?e.map(e=>{let t="{t+=` ${n}="${gt()(e[n])}"`}),t+">"}).join("\n "):"",this.$ssrContext.canonicalLink=_t(this.$canonicalUrl)}var e},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const e=this.getMergedMetaTags();this.currentMetaTags=xt(e,this.currentMetaTags)},getMergedMetaTags(){const e=this.$page.frontmatter.meta||[];return vt()([{name:"description",content:this.$description}],e,this.siteMeta,wt)},updateCanonicalLink(){bt(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",_t(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){xt(null,this.currentMetaTags),bt()}};function bt(){const e=document.querySelector("link[rel='canonical']");e&&e.remove()}function _t(e=""){return e?``:""}function xt(e,t){if(t&&[...t].filter(e=>e.parentNode===document.head).forEach(e=>document.head.removeChild(e)),e)return e.map(e=>{const t=document.createElement("meta");return Object.keys(e).forEach(n=>{t.setAttribute(n,e[n])}),document.head.appendChild(t),t})}function wt(e){for(const t of["name","property","itemprop"])if(e.hasOwnProperty(t))return e[t]+t;return JSON.stringify(e)}var kt=n(13),Ct=n.n(kt),$t={mounted(){Ct.a.configure({showSpinner:!1}),this.$router.beforeEach((e,t,n)=>{e.path===t.path||r.a.component(e.name)||Ct.a.start(),n()}),this.$router.afterEach(()=>{Ct.a.done(),this.isSidebarOpen=!1})}},Ot=n(49),St={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(Ot)()((function(){this.setActiveHash()}),300),setActiveHash(){const e=[].slice.call(document.querySelectorAll(".sidebar-link")),t=[].slice.call(document.querySelectorAll(".header-anchor")).filter(t=>e.some(e=>e.hash===t.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let e=0;e=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},jt={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let e={};return e[this.options.align]="7.5px",e},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null},copyToClipboard(e){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let e=document.createElement("textarea");document.body.appendChild(e),e.value=this.code,e.select(),document.execCommand("Copy"),e.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let e=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${e.r}, ${e.g}, ${e.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},Pt=(n(146),n(4)),Et=Object(Pt.a)(jt,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"code-copy"},[t("svg",{class:e.iconClass,style:e.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:e.copyToClipboard}},[t("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),e._v(" "),t("path",{attrs:{fill:e.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),e._v(" "),t("span",{class:e.success?"success":"",style:e.alignStyle},[e._v("\n "+e._s(e.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,At=(n(147),[yt,$t,St,{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(e=>{if(e.classList.contains("code-copy-added"))return;let t=new(r.a.extend(Et));t.options={align:"bottom",color:"#27b1ff",backgroundTransition:!0,backgroundColor:"#0075b8",successText:"Copied!",staticIcon:!1},t.code=e.innerText,t.parent=e,t.$mount(),e.classList.add("code-copy-added"),e.appendChild(t.$el)})},100)}}}]),Tt={name:"GlobalLayout",computed:{layout(){const e=this.getLayout();return dt("layout",e),r.a.component(e)}},methods:{getLayout(){if(this.$page.path){const e=this.$page.frontmatter.layout;return e&&(this.$vuepress.getLayoutAsyncComponent(e)||this.$vuepress.getVueComponent(e))?e:"Layout"}return"NotFound"}}},Lt=Object(Pt.a)(Tt,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(e,t,n){switch(t){case"components":e[t]||(e[t]={}),Object.assign(e[t],n);break;case"mixins":e[t]||(e[t]=[]),e[t].push(...n);break;default:throw new Error("Unknown option name.")}}(Lt,"mixins",At);const Rt=[{name:"v-4e72e1d8",path:"/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-4e72e1d8").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-14e901dc",path:"/api/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-14e901dc").then(n)}},{path:"/api/index.html",redirect:"/api/"},{name:"v-21917184",path:"/data-collections/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-21917184").then(n)}},{path:"/data-collections/index.html",redirect:"/data-collections/"},{name:"v-045b6323",path:"/federation/accounting.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-045b6323").then(n)}},{name:"v-acc004fa",path:"/federation/backends/api.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-acc004fa").then(n)}},{name:"v-3e291b63",path:"/federation/backends/collections.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-3e291b63").then(n)}},{name:"v-78536523",path:"/federation/backends/processes.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-78536523").then(n)}},{name:"v-700f1b88",path:"/federation/backends/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-700f1b88").then(n)}},{path:"/federation/backends/index.html",redirect:"/federation/backends/"},{name:"v-688ffb43",path:"/federation/backends/fileformats.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-688ffb43").then(n)}},{name:"v-21de1e8c",path:"/file-formats/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-21de1e8c").then(n)}},{path:"/file-formats/index.html",redirect:"/file-formats/"},{name:"v-7ffae7c8",path:"/federation/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-7ffae7c8").then(n)}},{path:"/federation/index.html",redirect:"/federation/"},{name:"v-76e62a34",path:"/getting-started/client-side-processing/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-76e62a34").then(n)}},{path:"/getting-started/client-side-processing/index.html",redirect:"/getting-started/client-side-processing/"},{name:"v-adb4d3cc",path:"/getting-started/editor/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-adb4d3cc").then(n)}},{path:"/getting-started/editor/index.html",redirect:"/getting-started/editor/"},{name:"v-974804cc",path:"/getting-started/javascript/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-974804cc").then(n)}},{path:"/getting-started/javascript/index.html",redirect:"/getting-started/javascript/"},{name:"v-779fe818",path:"/getting-started/jupyterlab/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-779fe818").then(n)}},{path:"/getting-started/jupyterlab/index.html",redirect:"/getting-started/jupyterlab/"},{name:"v-6b6d7bae",path:"/getting-started/python/shiny.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-6b6d7bae").then(n)}},{name:"v-23074efc",path:"/getting-started/python/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-23074efc").then(n)}},{path:"/getting-started/python/index.html",redirect:"/getting-started/python/"},{name:"v-a1f70a7a",path:"/join/free_trial.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-a1f70a7a").then(n)}},{name:"v-a5deb388",path:"/getting-started/r/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-a5deb388").then(n)}},{path:"/getting-started/r/index.html",redirect:"/getting-started/r/"},{name:"v-d4caec3c",path:"/usecases/ard/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-d4caec3c").then(n)}},{path:"/usecases/ard/index.html",redirect:"/usecases/ard/"},{name:"v-02b9217c",path:"/processes/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-02b9217c").then(n)}},{path:"/processes/index.html",redirect:"/processes/"},{name:"v-2ac201a4",path:"/usecases/Fractional-canopy-Cover/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-2ac201a4").then(n)}},{path:"/usecases/Fractional-canopy-Cover/index.html",redirect:"/usecases/Fractional-canopy-Cover/"},{name:"v-c5fcf990",path:"/usecases/ard/sar/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-c5fcf990").then(n)}},{path:"/usecases/ard/sar/index.html",redirect:"/usecases/ard/sar/"},{name:"v-0937d47a",path:"/usecases/ard/msi/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-0937d47a").then(n)}},{path:"/usecases/ard/msi/index.html",redirect:"/usecases/ard/msi/"},{name:"v-62bfd25c",path:"/usecases/ard/sen2like/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-62bfd25c").then(n)}},{path:"/usecases/ard/sen2like/index.html",redirect:"/usecases/ard/sen2like/"},{name:"v-65bcb302",path:"/usecases/crop-classification/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-65bcb302").then(n)}},{path:"/usecases/crop-classification/index.html",redirect:"/usecases/crop-classification/"},{name:"v-2b5b0ed8",path:"/usecases/forest-change-detection/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-2b5b0ed8").then(n)}},{path:"/usecases/forest-change-detection/index.html",redirect:"/usecases/forest-change-detection/"},{name:"v-4a7f74ac",path:"/usecases/gfm/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-4a7f74ac").then(n)}},{path:"/usecases/gfm/index.html",redirect:"/usecases/gfm/"},{name:"v-ddb09444",path:"/usecases/crop-conditions/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-ddb09444").then(n)}},{path:"/usecases/crop-conditions/index.html",redirect:"/usecases/crop-conditions/"},{name:"v-5041b7a0",path:"/usecases/landcover/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-5041b7a0").then(n)}},{path:"/usecases/landcover/index.html",redirect:"/usecases/landcover/"},{name:"v-589f7f88",path:"/usecases/large-scale-processing/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-589f7f88").then(n)}},{path:"/usecases/large-scale-processing/index.html",redirect:"/usecases/large-scale-processing/"},{name:"v-697f60bc",path:"/usecases/no2-monitoring/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-697f60bc").then(n)}},{path:"/usecases/no2-monitoring/index.html",redirect:"/usecases/no2-monitoring/"},{name:"v-e3af3008",path:"/usecases/vessel-detection/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-e3af3008").then(n)}},{path:"/usecases/vessel-detection/index.html",redirect:"/usecases/vessel-detection/"},{path:"*",component:Lt}],Mt={title:"openEO Platform Documentation",description:"One of the most important properties for a future-oriented platform on earth observation is the orientation towards simple operation, with a special focus on efficiency of evaluation and availability. Complexity is kept hidden in the background to direct your focus on the data. This is done on one hand by the use of an aggregate API to access the infrastructure, but also by improved user-faced graphical processing. For access to the API, the user has the option to incorporate his own preferences, by choosing between several clients.",base:"/",headTags:[],pages:[{title:"Home",frontmatter:{home:!0},regularPath:"/",relativePath:"README.md",key:"v-4e72e1d8",path:"/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/api/",relativePath:"api/index.md",key:"v-14e901dc",path:"/api/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{frontmatter:{sidebar:!1,stripCSS:!0},regularPath:"/data-collections/",relativePath:"data-collections/index.md",key:"v-21917184",path:"/data-collections/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Platform credit usage",frontmatter:{},regularPath:"/federation/accounting.html",relativePath:"federation/accounting.md",key:"v-045b6323",path:"/federation/accounting.html",headers:[{level:2,title:"Platform credit rates",slug:"platform-credit-rates"},{level:2,title:"Estimating resource usage",slug:"estimating-resource-usage"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Federation API",frontmatter:{},regularPath:"/federation/backends/api.html",relativePath:"federation/backends/api.md",key:"v-acc004fa",path:"/federation/backends/api.html",headers:[{level:2,title:"Profiles",slug:"profiles"},{level:3,title:"LP: Required for openEO Platform",slug:"lp-required-for-openeo-platform"},{level:2,title:"Authentication and authorization",slug:"authentication-and-authorization"},{level:3,title:"Authentication",slug:"authentication"},{level:3,title:"Authorization",slug:"authorization"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Collections",frontmatter:{},regularPath:"/federation/backends/collections.html",relativePath:"federation/backends/collections.md",key:"v-3e291b63",path:"/federation/backends/collections.html",headers:[{level:2,title:"Collection availability",slug:"collection-availability"},{level:3,title:"Requirements for non-experimental collections",slug:"requirements-for-non-experimental-collections"},{level:2,title:"Harmonization",slug:"harmonization"},{level:3,title:"Common naming convention",slug:"common-naming-convention"},{level:3,title:"Sentinel2-L2A",slug:"sentinel2-l2a"},{level:3,title:"Common Properties",slug:"common-properties"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Processes",frontmatter:{},regularPath:"/federation/backends/processes.html",relativePath:"federation/backends/processes.md",key:"v-78536523",path:"/federation/backends/processes.html",headers:[{level:3,title:"Requirements per Profile",slug:"requirements-per-profile"},{level:2,title:"L2P: Required - openEO Platform",slug:"l2p-required-openeo-platform"},{level:2,title:"L3P: Advanced - openEO Platform",slug:"l3p-advanced-openeo-platform"},{level:2,title:"L4P: Complete - openEO Platform",slug:"l4p-complete-openeo-platform"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Federation Contract",frontmatter:{},regularPath:"/federation/backends/",relativePath:"federation/backends/index.md",key:"v-700f1b88",path:"/federation/backends/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"File Formats",frontmatter:{},regularPath:"/federation/backends/fileformats.html",relativePath:"federation/backends/fileformats.md",key:"v-688ffb43",path:"/federation/backends/fileformats.html",headers:[{level:2,title:"Best practices file formats",slug:"best-practices-file-formats"},{level:3,title:"Raster Formats",slug:"raster-formats"},{level:2,title:"Federation agreement file formats",slug:"federation-agreement-file-formats"},{level:3,title:"GeoTiff",slug:"geotiff"},{level:3,title:"netCDF",slug:"netcdf"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{frontmatter:{sidebar:!1,stripCSS:!0},regularPath:"/file-formats/",relativePath:"file-formats/index.md",key:"v-21de1e8c",path:"/file-formats/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Federation Aspects and Known Issues",frontmatter:{},regularPath:"/federation/",relativePath:"federation/index.md",key:"v-7ffae7c8",path:"/federation/",headers:[{level:2,title:"Data Collections",slug:"data-collections"},{level:3,title:"Terrascope",slug:"terrascope"},{level:3,title:"Sentinel Hub",slug:"sentinel-hub"},{level:3,title:"EODC",slug:"eodc"},{level:3,title:"Enforce back-end selection for common collections",slug:"enforce-back-end-selection-for-common-collections"},{level:2,title:"Processes",slug:"processes"},{level:2,title:"File formats",slug:"file-formats"},{level:2,title:"On-demand-preview",slug:"on-demand-preview"},{level:2,title:"Batch jobs",slug:"batch-jobs"},{level:3,title:"Managed job splitting",slug:"managed-job-splitting"},{level:3,title:"Validity of signed URLs in batch job results",slug:"validity-of-signed-urls-in-batch-job-results"},{level:3,title:"Customizing batch job resources on Terrascope",slug:"customizing-batch-job-resources-on-terrascope"},{level:3,title:"Batch job results on Sentinel Hub",slug:"batch-job-results-on-sentinel-hub"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO Python Client Client Side Processing",frontmatter:{},regularPath:"/getting-started/client-side-processing/",relativePath:"getting-started/client-side-processing/index.md",key:"v-76e62a34",path:"/getting-started/client-side-processing/",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Usage",slug:"usage"},{level:3,title:"STAC Collections and Items",slug:"stac-collections-and-items"},{level:3,title:"Local Collections",slug:"local-collections"},{level:3,title:"Local Processing",slug:"local-processing"},{level:2,title:"Client-Side Processing Example Notebooks",slug:"client-side-processing-example-notebooks"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO Platform Editor",frontmatter:{},regularPath:"/getting-started/editor/",relativePath:"getting-started/editor/index.md",key:"v-adb4d3cc",path:"/getting-started/editor/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO JavaScript Client",frontmatter:{},regularPath:"/getting-started/javascript/",relativePath:"getting-started/javascript/index.md",key:"v-974804cc",path:"/getting-started/javascript/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Connecting to openEO Platform",slug:"connecting-to-openeo-platform"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:2,title:"Creating a (user-defined) process",slug:"creating-a-user-defined-process"},{level:2,title:"Batch Job Management",slug:"batch-job-management"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with openEO Platform in JupyterLab (Python)",frontmatter:{},regularPath:"/getting-started/jupyterlab/",relativePath:"getting-started/jupyterlab/index.md",key:"v-779fe818",path:"/getting-started/jupyterlab/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Run openEO processes in Shiny apps",frontmatter:{},regularPath:"/getting-started/python/shiny.html",relativePath:"getting-started/python/shiny.md",key:"v-6b6d7bae",path:"/getting-started/python/shiny.html",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO Python Client",frontmatter:{},regularPath:"/getting-started/python/",relativePath:"getting-started/python/index.md",key:"v-23074efc",path:"/getting-started/python/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Connect to openEO Platform and explore",slug:"connect-to-openeo-platform-and-explore"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:2,title:"Working with Datacubes",slug:"working-with-datacubes"},{level:3,title:"Creating a Datacube",slug:"creating-a-datacube"},{level:3,title:"Applying processes",slug:"applying-processes"},{level:3,title:"Defining output format",slug:"defining-output-format"},{level:2,title:"Execution",slug:"execution"},{level:3,title:"Batch job execution",slug:"batch-job-execution"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Registration",frontmatter:{},regularPath:"/join/free_trial.html",relativePath:"join/free_trial.md",key:"v-a1f70a7a",path:"/join/free_trial.html",headers:[{level:2,title:"Connect with EGI Check-in",slug:"connect-with-egi-check-in"},{level:2,title:"EOPlaza",slug:"eoplaza"},{level:2,title:"Working with openEO Platform",slug:"working-with-openeo-platform"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO R Client",frontmatter:{},regularPath:"/getting-started/r/",relativePath:"getting-started/r/index.md",key:"v-a5deb388",path:"/getting-started/r/",headers:[{level:2,title:"Useful links",slug:"useful-links"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Connect to openEO Platform and explore",slug:"connect-to-openeo-platform-and-explore"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:2,title:"Creating a (user-defined) process",slug:"creating-a-user-defined-process"},{level:2,title:"Batch Job Management",slug:"batch-job-management"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Analysis-Ready Data (ARD)",frontmatter:{},regularPath:"/usecases/ard/",relativePath:"usecases/ard/index.md",key:"v-d4caec3c",path:"/usecases/ard/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/processes/",relativePath:"processes/index.md",key:"v-02b9217c",path:"/processes/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Fractional Canopy Cover",frontmatter:{},regularPath:"/usecases/Fractional-canopy-Cover/",relativePath:"usecases/Fractional-canopy-Cover/index.md",key:"v-2ac201a4",path:"/usecases/Fractional-canopy-Cover/",headers:[{level:2,title:"Fractional Canopy Cover",slug:"fractional-canopy-cover"},{level:2,title:"Data Preparation",slug:"data-preparation"},{level:2,title:"Model training",slug:"model-training"},{level:2,title:"Predicted Fractional Canopy Cover",slug:"predicted-fractional-canopy-cover"},{level:2,title:"Validation",slug:"validation"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Analysis-Ready Data for SAR (Sentinel-1)",frontmatter:{},regularPath:"/usecases/ard/sar/",relativePath:"usecases/ard/sar/index.md",key:"v-c5fcf990",path:"/usecases/ard/sar/",headers:[{level:2,title:"Backscatter computation",slug:"backscatter-computation"},{level:2,title:"Reference implementations",slug:"reference-implementations"},{level:3,title:"CARD4L NRB for SENTINEL1_GRD collection (provided by Sentinel Hub)",slug:"card4l-nrb-for-sentinel1-grd-collection-provided-by-sentinel-hub"},{level:3,title:"Orfeo for other GRD collections (provided by VITO / TerraScope)",slug:"orfeo-for-other-grd-collections-provided-by-vito-terrascope"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Analysis-Ready Data for Multi-Spectral Imagery (Sentinel-2)",frontmatter:{},regularPath:"/usecases/ard/msi/",relativePath:"usecases/ard/msi/index.md",key:"v-0937d47a",path:"/usecases/ard/msi/",headers:[{level:2,title:"Atmospheric correction",slug:"atmospheric-correction"},{level:3,title:"Reference implementations",slug:"reference-implementations"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Sen2Like",frontmatter:{},regularPath:"/usecases/ard/sen2like/",relativePath:"usecases/ard/sen2like/index.md",key:"v-62bfd25c",path:"/usecases/ard/sen2like/",headers:[{level:2,title:"1. sen2like for RGB",slug:"_1-sen2like-for-rgb"},{level:3,title:"openEO sen2like processing",slug:"openeo-sen2like-processing"},{level:3,title:"Explore the openEO L2F results",slug:"explore-the-openeo-l2f-results"},{level:2,title:"2. sen2like for NDVI",slug:"_2-sen2like-for-ndvi"},{level:3,title:"Explore the openEO L2F NDVI results",slug:"explore-the-openeo-l2f-ndvi-results"},{level:2,title:"3. Sen2Like processing in the openeo web editor",slug:"_3-sen2like-processing-in-the-openeo-web-editor"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Crop Classification",frontmatter:{},regularPath:"/usecases/crop-classification/",relativePath:"usecases/crop-classification/index.md",key:"v-65bcb302",path:"/usecases/crop-classification/",headers:[{level:2,title:"Preprocessing & feature engineering",slug:"preprocessing-feature-engineering"},{level:3,title:"Data preparation",slug:"data-preparation"},{level:3,title:"Computing temporal features",slug:"computing-temporal-features"},{level:2,title:"Model training",slug:"model-training"},{level:2,title:"Classification",slug:"classification"},{level:3,title:"Rule-based classification",slug:"rule-based-classification"},{level:3,title:"Supervised classification using Random Forest",slug:"supervised-classification-using-random-forest"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Forest Change Detection",frontmatter:{},regularPath:"/usecases/forest-change-detection/",relativePath:"usecases/forest-change-detection/index.md",key:"v-2b5b0ed8",path:"/usecases/forest-change-detection/",headers:[{level:2,title:"Data preparation",slug:"data-preparation"},{level:2,title:"Seasonal curve fitting",slug:"seasonal-curve-fitting"},{level:2,title:"Predicting values",slug:"predicting-values"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Global Flood Monitoring",frontmatter:{},regularPath:"/usecases/gfm/",relativePath:"usecases/gfm/index.md",key:"v-4a7f74ac",path:"/usecases/gfm/",headers:[{level:2,title:"Output layers used in openEO",slug:"output-layers-used-in-openeo"},{level:2,title:"Links",slug:"links"},{level:2,title:"Compute the maximum flood extent",slug:"compute-the-maximum-flood-extent"},{level:2,title:"Explore how the flood extent relates to the Global Human Settlement Built-up layer",slug:"explore-how-the-flood-extent-relates-to-the-global-human-settlement-built-up-layer"},{level:2,title:"Statistical analysis",slug:"statistical-analysis"},{level:2,title:"Observed water (flood_extent + refwater)",slug:"observed-water-flood-extent-refwater"},{level:2,title:"Explore the observed water",slug:"explore-the-observed-water"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Crop conditions",frontmatter:{},regularPath:"/usecases/crop-conditions/",relativePath:"usecases/crop-conditions/index.md",key:"v-ddb09444",path:"/usecases/crop-conditions/",headers:[{level:2,title:"1. data preparation",slug:"_1-data-preparation"},{level:2,title:"2. Sen2like processing",slug:"_2-sen2like-processing"},{level:2,title:"3. Running the Job",slug:"_3-running-the-job"},{level:2,title:"4. Explore the openEO results",slug:"_4-explore-the-openeo-results"},{level:2,title:"5. Indices calculations",slug:"_5-indices-calculations"},{level:3,title:"5.1 Leaf Area Index (LAI)",slug:"_5-1-leaf-area-index-lai"},{level:3,title:"5.2\tLeaf Chlorophyll Content (CAB)",slug:"_5-2leaf-chlorophyll-content-cab"},{level:3,title:"5.3\tFraction of green Vegetation Cover (FCOVER)",slug:"_5-3fraction-of-green-vegetation-cover-fcover"},{level:3,title:"5.4\tFraction of Absorbed Photosynthetically Active Radiation (FAPAR)",slug:"_5-4fraction-of-absorbed-photosynthetically-active-radiation-fapar"},{level:3,title:"5.5\tNormalized difference vegetation index",slug:"_5-5normalized-difference-vegetation-index"},{level:3,title:"5.6 Explore the results",slug:"_5-6-explore-the-results"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Dynamic land cover service",frontmatter:{},regularPath:"/usecases/landcover/",relativePath:"usecases/landcover/index.md",key:"v-5041b7a0",path:"/usecases/landcover/",headers:[{level:2,title:"Methodology",slug:"methodology"},{level:3,title:"Reference data",slug:"reference-data"},{level:3,title:"Input data",slug:"input-data"},{level:3,title:"Preprocessing",slug:"preprocessing"},{level:3,title:"Feature engineering",slug:"feature-engineering"},{level:3,title:"Model",slug:"model"},{level:2,title:"Implementation",slug:"implementation"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Large scale processing",frontmatter:{},regularPath:"/usecases/large-scale-processing/",relativePath:"usecases/large-scale-processing/index.md",key:"v-589f7f88",path:"/usecases/large-scale-processing/",headers:[{level:2,title:"Relevant openEO features",slug:"relevant-openeo-features"},{level:2,title:"Preparation",slug:"preparation"},{level:2,title:"Prepare tiling grid",slug:"prepare-tiling-grid"},{level:2,title:"Prepare job attributes",slug:"prepare-job-attributes"},{level:2,title:"Tuning your processing job",slug:"tuning-your-processing-job"},{level:2,title:"Starting map production",slug:"starting-map-production"},{level:2,title:"Errors during production",slug:"errors-during-production"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"NO₂ monitoring",frontmatter:{},regularPath:"/usecases/no2-monitoring/",relativePath:"usecases/no2-monitoring/index.md",key:"v-697f60bc",path:"/usecases/no2-monitoring/",headers:[{level:2,title:"Shiny apps (R and Python)",slug:"shiny-apps-r-and-python"},{level:3,title:"Time-Series Analyser",slug:"time-series-analyser"},{level:3,title:"Map Maker for one Snapshot",slug:"map-maker-for-one-snapshot"},{level:3,title:"Spacetime Animation",slug:"spacetime-animation"},{level:2,title:"Basic NO₂ analysis in Python, R and JavaScript",slug:"basic-no2-analysis-in-python-r-and-javascript"},{level:3,title:"1. Load a data cube",slug:"_1-load-a-data-cube"},{level:3,title:"2. Fill gaps",slug:"_2-fill-gaps"},{level:3,title:"3. Smoothen values (optional)",slug:"_3-smoothen-values-optional"},{level:3,title:"4. What do you want to know?",slug:"_4-what-do-you-want-to-know"},{level:3,title:"5. Execute the process",slug:"_5-execute-the-process"},{level:3,title:"Result",slug:"result"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Vessel Detection",frontmatter:{},regularPath:"/usecases/vessel-detection/",relativePath:"usecases/vessel-detection/index.md",key:"v-e3af3008",path:"/usecases/vessel-detection/",headers:[{level:2,title:"Adaptive Thresholding in Xarray",slug:"adaptive-thresholding-in-xarray"},{level:3,title:"1. Authenticate",slug:"_1-authenticate"},{level:3,title:"2. Pre-processing prep",slug:"_2-pre-processing-prep"},{level:3,title:"3. Defining a process graph to detect vessels in our AOI.",slug:"_3-defining-a-process-graph-to-detect-vessels-in-our-aoi"},{level:3,title:"4. Run Auxilliary job",slug:"_4-run-auxilliary-job"},{level:2,title:"Result Visualisation",slug:"result-visualisation"},{level:2,title:"Use Case -- Recap",slug:"use-case-recap"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3}],themeConfig:{logo:"https://openeo.cloud/wp-content/themes/openeo_platform/images/logo-pages.svg",editLinks:!0,docsRepo:"openEOPlatform/documentation",docsBranch:"main",algolia:{appId:"AH1DCGL38F",apiKey:"3d026b8a9c3950be6d136a6d0f934029",indexName:"openeo-cloud"},nav:[{text:"Datasets",link:"/data-collections/"},{text:"Get Started",items:[{text:"Free Trial Registration",link:"/join/free_trial.html"},{text:"Data Cubes",link:"https://openeo.org/documentation/1.0/datacubes.html"},{text:"Client Libraries",items:[{text:"JavaScript",link:"/getting-started/javascript/"},{text:"Python",link:"/getting-started/python/"},{text:"R",link:"/getting-started/r/"}]},{text:"Development Environments",items:[{text:"JupyterLab (Python)",link:"/getting-started/jupyterlab/"},{text:"Editor",link:"/getting-started/editor/"}]},{text:"Cookbook",link:"https://openeo.org/documentation/1.0/cookbook/"},{text:"Client-Side Processing (Python)",link:"/getting-started/client-side-processing/"}]},{text:"Clients",items:[{text:"JavaScript",link:"https://open-eo.github.io/openeo-js-client/latest/"},{text:"Python",link:"https://open-eo.github.io/openeo-python-client/"},{text:"R",link:"https://open-eo.github.io/openeo-r-client/"}]},{text:"Use Cases",items:[{text:"Cookbook",link:"https://openeo.org/documentation/1.0/cookbook/"},{text:"Analysis-Ready Data (ARD)",items:[{text:"Overview",link:"/usecases/ard/"},{text:"SAR (Sentinel-1)",link:"/usecases/ard/sar/"},{text:"Multi-Spectral Imagery",link:"/usecases/ard/msi/"},{text:"Sen2Like",link:"/usecases/ard/sen2like/"}]},{text:"Crop Classification",link:"/usecases/crop-classification/"},{text:"Forest Change Detection",link:"/usecases/forest-change-detection/"},{text:"Land Cover Classification",link:"/usecases/landcover/"},{text:"NO₂ monitoring",link:"/usecases/no2-monitoring/"},{text:"Large scale processing",link:"/usecases/large-scale-processing/"},{text:"Global flood monitoring",link:"/usecases/gfm/"},{text:"Vessel Detection",link:"/usecases/vessel-detection/"},{text:"Fractional canopy Cover",link:"/usecases/Fractional-canopy-Cover/"},{text:"Crop Conditions",link:"/usecases/crop-conditions/"}]},{text:"Processes",items:[{text:"JavaScript & R",link:"/processes/"},{text:"Python",link:"https://open-eo.github.io/openeo-python-client/api.html#module-openeo.rest.datacube"}]},{text:"File Formats",link:"/file-formats/"},{text:"Advanced",items:[{text:"Accounting",link:"/federation/accounting.html"},{text:"Federation Aspects",link:"/federation/index.html"},{text:"Federation Contract",link:"/federation/backends/index.html"},{text:"HTTP API",link:"/api/"}]},{text:"Contact",link:"https://openeo.cloud/contact/"}],sidebar:"auto"}};"undefined"!=typeof window&&(window.global=window);n(148);r.a.component("ApiSpec",()=>n.e(61).then(n.bind(null,557))),r.a.component("DataCollections",()=>Promise.all([n.e(0),n.e(4),n.e(34)]).then(n.bind(null,550))),r.a.component("FileFormatsSpec",()=>Promise.all([n.e(0),n.e(4),n.e(35)]).then(n.bind(null,551))),r.a.component("ProcessesSpec",()=>Promise.all([n.e(0),n.e(1),n.e(4),n.e(23),n.e(41)]).then(n.bind(null,558))),r.a.component("CodeBlock",()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,554))),r.a.component("Badge",()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,564))),r.a.component("CodeGroup",()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,555)));n(149);var Ut=[({router:e,Vue:t})=>{t.config.ignoredElements=["redoc"],e.beforeEach((e,t,n)=>{const r={"/authentication":"/join/free_trial.html","/join/early_adopter.html":"/join/free_trial.html"}[e.path];r?n({path:r}):n()})},{},({Vue:e})=>{e.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},{},({Vue:e})=>{e.component("CodeCopy",Et)}],It=[];class Dt extends class{constructor(){this.store=new r.a({data:{state:{}}})}$get(e){return this.store.state[e]}$set(e,t){r.a.set(this.store.state,e,t)}$emit(...e){this.store.$emit(...e)}$on(...e){this.store.$on(...e)}}{}Object.assign(Dt.prototype,{getPageAsyncComponent:ct,getLayoutAsyncComponent:lt,getAsyncComponent:ut,getVueComponent:ft});var Ft={install(e){const t=new Dt;e.$vuepress=t,e.prototype.$vuepress=t}};function Nt(e,t){const n=t.toLowerCase();return e.options.routes.some(e=>e.path.toLowerCase()===n)}var Bt={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(e){const t=this.pageKey||this.$parent.$page.key;return dt("pageKey",t),r.a.component(t)||r.a.component(t,ct(t)),r.a.component(t)?e(t):e("")}},zt={functional:!0,props:{slotKey:String,required:!0},render:(e,{props:t,slots:n})=>e("div",{class:["content__"+t.slotKey]},n()[t.slotKey])},Vt={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},qt=(n(150),n(151),Object(Pt.a)(Vt,(function(){var e=this._self._c;return e("span",[e("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[e("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),e("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),e("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),Ht={functional:!0,render(e,{parent:t,children:n}){if(t._isMounted)return n;t.$once("hook:mounted",()=>{t.$forceUpdate()})}};r.a.config.productionTip=!1,r.a.use(We),r.a.use(Ft),r.a.mixin(function(e,t,n=r.a){!function(e){e.locales&&Object.keys(e.locales).forEach(t=>{e.locales[t].path=t});Object.freeze(e)}(t),n.$vuepress.$set("siteData",t);const o=new(e(n.$vuepress.$get("siteData"))),i=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(o)),a={};return Object.keys(i).reduce((e,t)=>(t.startsWith("$")&&(e[t]=i[t].get),e),a),{computed:a}}(e=>class{setPage(e){this.__page=e}get $site(){return e}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:e={}}=this.$site;let t,n;for(const r in e)"/"===r?n=e[r]:0===this.$page.path.indexOf(r)&&(t=e[r]);return t||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:e}=this.$page.frontmatter;return"string"==typeof e&&e}get $title(){const e=this.$page,{metaTitle:t}=this.$page.frontmatter;if("string"==typeof t)return t;const n=this.$siteTitle,r=e.frontmatter.home?null:e.frontmatter.title||e.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const e=function(e){if(e){const t=e.filter(e=>"description"===e.name)[0];if(t)return t.content}}(this.$page.frontmatter.meta);return e||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(e,t){for(let n=0;nn||(e.hash?!r.a.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(e.hash)}:{x:0,y:0})});!function(e){e.beforeEach((t,n,r)=>{if(Nt(e,t.path))r();else if(/(\/|\.html)$/.test(t.path))if(/\/$/.test(t.path)){const n=t.path.replace(/\/$/,"")+".html";Nt(e,n)?r(n):r()}else r();else{const n=t.path+"/",o=t.path+".html";Nt(e,o)?r(o):Nt(e,n)?r(n):r()}})}(n);const o={};try{await Promise.all(Ut.filter(e=>"function"==typeof e).map(t=>t({Vue:r.a,options:o,router:n,siteData:Mt,isServer:e})))}catch(e){console.error(e)}return{app:new r.a(Object.assign(o,{router:n,render:e=>e("div",{attrs:{id:"app"}},[e("RouterView",{ref:"layout"}),e("div",{class:"global-ui"},It.map(t=>e(t)))])})),router:n}}(!1).then(({app:e,router:t})=>{t.onReady(()=>{e.$mount("#app")})})}]); \ No newline at end of file + */function o(e,t){for(var n in t)e[n]=t[n];return e}var i=/[!'()*]/g,a=function(e){return"%"+e.charCodeAt(0).toString(16)},s=/%2C/g,c=function(e){return encodeURIComponent(e).replace(i,a).replace(s,",")};function l(e){try{return decodeURIComponent(e)}catch(e){0}return e}var u=function(e){return null==e||"object"==typeof e?e:String(e)};function f(e){var t={};return(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var n=e.replace(/\+/g," ").split("="),r=l(n.shift()),o=n.length>0?l(n.join("=")):null;void 0===t[r]?t[r]=o:Array.isArray(t[r])?t[r].push(o):t[r]=[t[r],o]})),t):t}function p(e){var t=e?Object.keys(e).map((function(t){var n=e[t];if(void 0===n)return"";if(null===n)return c(t);if(Array.isArray(n)){var r=[];return n.forEach((function(e){void 0!==e&&(null===e?r.push(c(t)):r.push(c(t)+"="+c(e)))})),r.join("&")}return c(t)+"="+c(n)})).filter((function(e){return e.length>0})).join("&"):null;return t?"?"+t:""}var d=/\/?$/;function h(e,t,n,r){var o=r&&r.options.stringifyQuery,i=t.query||{};try{i=v(i)}catch(e){}var a={name:t.name||e&&e.name,meta:e&&e.meta||{},path:t.path||"/",hash:t.hash||"",query:i,params:t.params||{},fullPath:y(t,o),matched:e?g(e):[]};return n&&(a.redirectedFrom=y(n,o)),Object.freeze(a)}function v(e){if(Array.isArray(e))return e.map(v);if(e&&"object"==typeof e){var t={};for(var n in e)t[n]=v(e[n]);return t}return e}var m=h(null,{path:"/"});function g(e){for(var t=[];e;)t.unshift(e),e=e.parent;return t}function y(e,t){var n=e.path,r=e.query;void 0===r&&(r={});var o=e.hash;return void 0===o&&(o=""),(n||"/")+(t||p)(r)+o}function b(e,t,n){return t===m?e===t:!!t&&(e.path&&t.path?e.path.replace(d,"")===t.path.replace(d,"")&&(n||e.hash===t.hash&&_(e.query,t.query)):!(!e.name||!t.name)&&(e.name===t.name&&(n||e.hash===t.hash&&_(e.query,t.query)&&_(e.params,t.params))))}function _(e,t){if(void 0===e&&(e={}),void 0===t&&(t={}),!e||!t)return e===t;var n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((function(n,o){var i=e[n];if(r[o]!==n)return!1;var a=t[n];return null==i||null==a?i===a:"object"==typeof i&&"object"==typeof a?_(i,a):String(i)===String(a)}))}function x(e){for(var t=0;t=0&&(t=e.slice(r),e=e.slice(0,r));var o=e.indexOf("?");return o>=0&&(n=e.slice(o+1),e=e.slice(0,o)),{path:e,query:n,hash:t}}(i.path||""),p=t&&t.path||"/",d=l.path?C(l.path,p,n||i.append):p,h=function(e,t,n){void 0===t&&(t={});var r,o=n||f;try{r=o(e||"")}catch(e){r={}}for(var i in t){var a=t[i];r[i]=Array.isArray(a)?a.map(u):u(a)}return r}(l.query,i.query,r&&r.options.parseQuery),v=i.hash||l.hash;return v&&"#"!==v.charAt(0)&&(v="#"+v),{_normalized:!0,path:d,query:h,hash:v}}var H,W=function(){},G={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,r=this.$route,i=n.resolve(this.to,r,this.append),a=i.location,s=i.route,c=i.href,l={},u=n.options.linkActiveClass,f=n.options.linkExactActiveClass,p=null==u?"router-link-active":u,v=null==f?"router-link-exact-active":f,m=null==this.activeClass?p:this.activeClass,g=null==this.exactActiveClass?v:this.exactActiveClass,y=s.redirectedFrom?h(null,q(s.redirectedFrom),null,n):s;l[g]=b(r,y,this.exactPath),l[m]=this.exact||this.exactPath?l[g]:function(e,t){return 0===e.path.replace(d,"/").indexOf(t.path.replace(d,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(r,y);var _=l[g]?this.ariaCurrentValue:null,x=function(e){K(e)&&(t.replace?n.replace(a,W):n.push(a,W))},w={click:K};Array.isArray(this.event)?this.event.forEach((function(e){w[e]=x})):w[this.event]=x;var k={class:l},C=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:c,route:s,navigate:x,isActive:l[m],isExactActive:l[g]});if(C){if(1===C.length)return C[0];if(C.length>1||!C.length)return 0===C.length?e():e("span",{},C)}if("a"===this.tag)k.on=w,k.attrs={href:c,"aria-current":_};else{var $=function e(t){var n;if(t)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=V(u.path,s.params),c(u,s,a)}if(s.path){s.params={};for(var d=0;d-1}function $e(e,t){return Ce(e)&&e._isRouter&&(null==t||e.type===t)}function Oe(e,t,n){var r=function(o){o>=e.length?n():e[o]?t(e[o],(function(){r(o+1)})):r(o+1)};r(0)}function Se(e){return function(t,n,r){var o=!1,i=0,a=null;je(e,(function(e,t,n,s){if("function"==typeof e&&void 0===e.cid){o=!0,i++;var c,l=Ae((function(t){var o;((o=t).__esModule||Ee&&"Module"===o[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:H.extend(t),n.components[s]=t,--i<=0&&r()})),u=Ae((function(e){var t="Failed to resolve async component "+s+": "+e;a||(a=Ce(e)?e:new Error(t),r(a))}));try{c=e(l,u)}catch(e){u(e)}if(c)if("function"==typeof c.then)c.then(l,u);else{var f=c.component;f&&"function"==typeof f.then&&f.then(l,u)}}})),o||r()}}function je(e,t){return Pe(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Pe(e){return Array.prototype.concat.apply([],e)}var Ee="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Ae(e){var t=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var Te=function(e,t){this.router=e,this.base=function(e){if(!e)if(J){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=m,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Le(e,t,n,r){var o=je(e,(function(e,r,o,i){var a=function(e,t){"function"!=typeof e&&(e=H.extend(e));return e.options[t]}(e,t);if(a)return Array.isArray(a)?a.map((function(e){return n(e,r,o,i)})):n(a,r,o,i)}));return Pe(r?o.reverse():o)}function Re(e,t){if(t)return function(){return e.apply(t,arguments)}}Te.prototype.listen=function(e){this.cb=e},Te.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Te.prototype.onError=function(e){this.errorCbs.push(e)},Te.prototype.transitionTo=function(e,t,n){var r,o=this;try{r=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),t&&t(r),o.ensureURL(),o.router.afterHooks.forEach((function(e){e&&e(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(e){e(r)})))}),(function(e){n&&n(e),e&&!o.ready&&($e(e,be.redirected)&&i===m||(o.ready=!0,o.readyErrorCbs.forEach((function(t){t(e)}))))}))},Te.prototype.confirmTransition=function(e,t,n){var r=this,o=this.current;this.pending=e;var i,a,s=function(e){!$e(e)&&Ce(e)&&(r.errorCbs.length?r.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},c=e.matched.length-1,l=o.matched.length-1;if(b(e,o)&&c===l&&e.matched[c]===o.matched[l])return this.ensureURL(),e.hash&&se(this.router,o,e,!1),s(((a=we(i=o,e,be.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var u=function(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,r=me&&n;r&&this.listeners.push(ae());var o=function(){var n=e.current,o=Ue(e.base);e.current===m&&o===e._startLocation||e.transitionTo(o,(function(e){r&&se(t,e,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ge($(r.base+e.fullPath)),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ye($(r.base+e.fullPath)),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Ue(this.base)!==this.current.fullPath){var t=$(this.base+this.current.fullPath);e?ge(t):ye(t)}},t.prototype.getCurrentLocation=function(){return Ue(this.base)},t}(Te);function Ue(e){var t=window.location.pathname,n=t.toLowerCase(),r=e.toLowerCase();return!e||n!==r&&0!==n.indexOf($(r+"/"))||(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Ie=function(e){function t(t,n,r){e.call(this,t,n),r&&function(e){var t=Ue(e);if(!/^\/#/.test(t))return window.location.replace($(e+"/#"+t)),!0}(this.base)||De()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=me&&t;n&&this.listeners.push(ae());var r=function(){var t=e.current;De()&&e.transitionTo(Fe(),(function(r){n&&se(e.router,r,t,!0),me||ze(r.fullPath)}))},o=me?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Be(e.fullPath),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ze(e.fullPath),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Fe()!==t&&(e?Be(t):ze(t))},t.prototype.getCurrentLocation=function(){return Fe()},t}(Te);function De(){var e=Fe();return"/"===e.charAt(0)||(ze("/"+e),!1)}function Fe(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Ne(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Be(e){me?ge(Ne(e)):window.location.hash=e}function ze(e){me?ye(Ne(e)):window.location.replace(Ne(e))}var Ve=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){$e(e,be.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Te),qe=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Z(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!me&&!1!==e.fallback,this.fallback&&(t="hash"),J||(t="abstract"),this.mode=t,t){case"history":this.history=new Me(this,e.base);break;case"hash":this.history=new Ie(this,e.base,this.fallback);break;case"abstract":this.history=new Ve(this,e.base);break;default:0}},He={currentRoute:{configurable:!0}};qe.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},He.currentRoute.get=function(){return this.history&&this.history.current},qe.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof Me||n instanceof Ie){var r=function(e){n.setupListeners(),function(e){var r=n.current,o=t.options.scrollBehavior;me&&o&&"fullPath"in e&&se(t,e,r,!1)}(e)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},qe.prototype.beforeEach=function(e){return Ge(this.beforeHooks,e)},qe.prototype.beforeResolve=function(e){return Ge(this.resolveHooks,e)},qe.prototype.afterEach=function(e){return Ge(this.afterHooks,e)},qe.prototype.onReady=function(e,t){this.history.onReady(e,t)},qe.prototype.onError=function(e){this.history.onError(e)},qe.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},qe.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},qe.prototype.go=function(e){this.history.go(e)},qe.prototype.back=function(){this.go(-1)},qe.prototype.forward=function(){this.go(1)},qe.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},qe.prototype.resolve=function(e,t,n){var r=q(e,t=t||this.history.current,n,this),o=this.match(r,t),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(e,t,n){var r="hash"===n?"#"+t:t;return e?$(e+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},qe.prototype.getRoutes=function(){return this.matcher.getRoutes()},qe.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},qe.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(qe.prototype,He);var We=qe;function Ge(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}qe.install=function e(t){if(!e.installed||H!==t){e.installed=!0,H=t;var n=function(e){return void 0!==e},r=function(e,t){var r=e.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",w),t.component("RouterLink",G);var o=t.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},qe.version="3.6.5",qe.isNavigationFailure=$e,qe.NavigationFailureType=be,qe.START_LOCATION=m,J&&window.Vue&&window.Vue.use(qe);var Ke={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(42)]).then(n.bind(null,251)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(28)]).then(n.bind(null,184)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(50)]).then(n.bind(null,158)),"components/Home":()=>Promise.all([n.e(0),n.e(32)]).then(n.bind(null,332)),"components/NavLink":()=>n.e(56).then(n.bind(null,156)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(27)]).then(n.bind(null,212)),"components/Navbar":()=>Promise.all([n.e(0),n.e(5),n.e(43)]).then(n.bind(null,541)),"components/Page":()=>Promise.all([n.e(0),n.e(26)]).then(n.bind(null,333)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(33)]).then(n.bind(null,219)),"components/PageNav":()=>Promise.all([n.e(0),n.e(29)]).then(n.bind(null,220)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(24)]).then(n.bind(null,334)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(51)]).then(n.bind(null,339)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,213)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(39)]).then(n.bind(null,185)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,179)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,564)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,554)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,555)),"layouts/404":()=>n.e(18).then(n.bind(null,556)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(5),n.e(9),n.e(11)]).then(n.bind(null,552)),NotFound:()=>n.e(18).then(n.bind(null,556)),Layout:()=>Promise.all([n.e(0),n.e(5),n.e(9),n.e(11)]).then(n.bind(null,552))},Je={"v-4e72e1d8":()=>n.e(62).then(n.bind(null,565)),"v-14e901dc":()=>n.e(63).then(n.bind(null,566)),"v-21917184":()=>n.e(64).then(n.bind(null,567)),"v-acc004fa":()=>n.e(57).then(n.bind(null,568)),"v-045b6323":()=>n.e(65).then(n.bind(null,569)),"v-688ffb43":()=>n.e(67).then(n.bind(null,570)),"v-3e291b63":()=>n.e(66).then(n.bind(null,571)),"v-700f1b88":()=>n.e(68).then(n.bind(null,572)),"v-78536523":()=>n.e(58).then(n.bind(null,573)),"v-7ffae7c8":()=>n.e(59).then(n.bind(null,574)),"v-21de1e8c":()=>n.e(69).then(n.bind(null,575)),"v-76e62a34":()=>n.e(70).then(n.bind(null,576)),"v-adb4d3cc":()=>n.e(71).then(n.bind(null,577)),"v-779fe818":()=>n.e(73).then(n.bind(null,578)),"v-23074efc":()=>n.e(74).then(n.bind(null,579)),"v-974804cc":()=>n.e(72).then(n.bind(null,580)),"v-6b6d7bae":()=>n.e(75).then(n.bind(null,581)),"v-a5deb388":()=>n.e(76).then(n.bind(null,582)),"v-a1f70a7a":()=>n.e(52).then(n.bind(null,583)),"v-02b9217c":()=>n.e(77).then(n.bind(null,584)),"v-2ac201a4":()=>n.e(37).then(n.bind(null,585)),"v-0937d47a":()=>n.e(79).then(n.bind(null,586)),"v-d4caec3c":()=>n.e(78).then(n.bind(null,587)),"v-62bfd25c":()=>n.e(38).then(n.bind(null,588)),"v-ddb09444":()=>n.e(53).then(n.bind(null,589)),"v-c5fcf990":()=>n.e(80).then(n.bind(null,590)),"v-2b5b0ed8":()=>n.e(54).then(n.bind(null,591)),"v-65bcb302":()=>n.e(81).then(n.bind(null,592)),"v-5041b7a0":()=>n.e(82).then(n.bind(null,593)),"v-697f60bc":()=>n.e(60).then(n.bind(null,594)),"v-589f7f88":()=>n.e(83).then(n.bind(null,595)),"v-4a7f74ac":()=>n.e(55).then(n.bind(null,596)),"v-e3af3008":()=>n.e(40).then(n.bind(null,597))};function Xe(e){const t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}const Ye=/-(\w)/g,Ze=Xe(e=>e.replace(Ye,(e,t)=>t?t.toUpperCase():"")),Qe=/\B([A-Z])/g,et=Xe(e=>e.replace(Qe,"-$1").toLowerCase()),tt=Xe(e=>e.charAt(0).toUpperCase()+e.slice(1));function nt(e,t){if(!t)return;if(e(t))return e(t);return t.includes("-")?e(tt(Ze(t))):e(tt(t))||e(et(t))}const rt=Object.assign({},Ke,Je),ot=e=>rt[e],it=e=>Je[e],at=e=>Ke[e],st=e=>r.a.component(e);function ct(e){return nt(it,e)}function lt(e){return nt(at,e)}function ut(e){return nt(ot,e)}function ft(e){return nt(st,e)}function pt(...e){return Promise.all(e.filter(e=>e).map(async e=>{if(!ft(e)&&ut(e)){const t=await ut(e)();r.a.component(e,t.default)}}))}function dt(e,t){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[e]=t)}var ht=n(47),vt=n.n(ht),mt=n(48),gt=n.n(mt),yt={created(){if(this.siteMeta=this.$site.headTags.filter(([e])=>"meta"===e).map(([e,t])=>t),this.$ssrContext){const t=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(e=t)?e.map(e=>{let t="{t+=` ${n}="${gt()(e[n])}"`}),t+">"}).join("\n "):"",this.$ssrContext.canonicalLink=_t(this.$canonicalUrl)}var e},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const e=this.getMergedMetaTags();this.currentMetaTags=xt(e,this.currentMetaTags)},getMergedMetaTags(){const e=this.$page.frontmatter.meta||[];return vt()([{name:"description",content:this.$description}],e,this.siteMeta,wt)},updateCanonicalLink(){bt(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",_t(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){xt(null,this.currentMetaTags),bt()}};function bt(){const e=document.querySelector("link[rel='canonical']");e&&e.remove()}function _t(e=""){return e?``:""}function xt(e,t){if(t&&[...t].filter(e=>e.parentNode===document.head).forEach(e=>document.head.removeChild(e)),e)return e.map(e=>{const t=document.createElement("meta");return Object.keys(e).forEach(n=>{t.setAttribute(n,e[n])}),document.head.appendChild(t),t})}function wt(e){for(const t of["name","property","itemprop"])if(e.hasOwnProperty(t))return e[t]+t;return JSON.stringify(e)}var kt=n(13),Ct=n.n(kt),$t={mounted(){Ct.a.configure({showSpinner:!1}),this.$router.beforeEach((e,t,n)=>{e.path===t.path||r.a.component(e.name)||Ct.a.start(),n()}),this.$router.afterEach(()=>{Ct.a.done(),this.isSidebarOpen=!1})}},Ot=n(49),St={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(Ot)()((function(){this.setActiveHash()}),300),setActiveHash(){const e=[].slice.call(document.querySelectorAll(".sidebar-link")),t=[].slice.call(document.querySelectorAll(".header-anchor")).filter(t=>e.some(e=>e.hash===t.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let e=0;e=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},jt={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let e={};return e[this.options.align]="7.5px",e},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null},copyToClipboard(e){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let e=document.createElement("textarea");document.body.appendChild(e),e.value=this.code,e.select(),document.execCommand("Copy"),e.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let e=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${e.r}, ${e.g}, ${e.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},Pt=(n(146),n(4)),Et=Object(Pt.a)(jt,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"code-copy"},[t("svg",{class:e.iconClass,style:e.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:e.copyToClipboard}},[t("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),e._v(" "),t("path",{attrs:{fill:e.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),e._v(" "),t("span",{class:e.success?"success":"",style:e.alignStyle},[e._v("\n "+e._s(e.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,At=(n(147),[yt,$t,St,{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(e=>{if(e.classList.contains("code-copy-added"))return;let t=new(r.a.extend(Et));t.options={align:"bottom",color:"#27b1ff",backgroundTransition:!0,backgroundColor:"#0075b8",successText:"Copied!",staticIcon:!1},t.code=e.innerText,t.parent=e,t.$mount(),e.classList.add("code-copy-added"),e.appendChild(t.$el)})},100)}}}]),Tt={name:"GlobalLayout",computed:{layout(){const e=this.getLayout();return dt("layout",e),r.a.component(e)}},methods:{getLayout(){if(this.$page.path){const e=this.$page.frontmatter.layout;return e&&(this.$vuepress.getLayoutAsyncComponent(e)||this.$vuepress.getVueComponent(e))?e:"Layout"}return"NotFound"}}},Lt=Object(Pt.a)(Tt,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(e,t,n){switch(t){case"components":e[t]||(e[t]={}),Object.assign(e[t],n);break;case"mixins":e[t]||(e[t]=[]),e[t].push(...n);break;default:throw new Error("Unknown option name.")}}(Lt,"mixins",At);const Rt=[{name:"v-4e72e1d8",path:"/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-4e72e1d8").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-14e901dc",path:"/api/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-14e901dc").then(n)}},{path:"/api/index.html",redirect:"/api/"},{name:"v-21917184",path:"/data-collections/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-21917184").then(n)}},{path:"/data-collections/index.html",redirect:"/data-collections/"},{name:"v-acc004fa",path:"/federation/backends/api.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-acc004fa").then(n)}},{name:"v-045b6323",path:"/federation/accounting.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-045b6323").then(n)}},{name:"v-688ffb43",path:"/federation/backends/fileformats.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-688ffb43").then(n)}},{name:"v-3e291b63",path:"/federation/backends/collections.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-3e291b63").then(n)}},{name:"v-700f1b88",path:"/federation/backends/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-700f1b88").then(n)}},{path:"/federation/backends/index.html",redirect:"/federation/backends/"},{name:"v-78536523",path:"/federation/backends/processes.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-78536523").then(n)}},{name:"v-7ffae7c8",path:"/federation/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-7ffae7c8").then(n)}},{path:"/federation/index.html",redirect:"/federation/"},{name:"v-21de1e8c",path:"/file-formats/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-21de1e8c").then(n)}},{path:"/file-formats/index.html",redirect:"/file-formats/"},{name:"v-76e62a34",path:"/getting-started/client-side-processing/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-76e62a34").then(n)}},{path:"/getting-started/client-side-processing/index.html",redirect:"/getting-started/client-side-processing/"},{name:"v-adb4d3cc",path:"/getting-started/editor/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-adb4d3cc").then(n)}},{path:"/getting-started/editor/index.html",redirect:"/getting-started/editor/"},{name:"v-779fe818",path:"/getting-started/jupyterlab/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-779fe818").then(n)}},{path:"/getting-started/jupyterlab/index.html",redirect:"/getting-started/jupyterlab/"},{name:"v-23074efc",path:"/getting-started/python/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-23074efc").then(n)}},{path:"/getting-started/python/index.html",redirect:"/getting-started/python/"},{name:"v-974804cc",path:"/getting-started/javascript/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-974804cc").then(n)}},{path:"/getting-started/javascript/index.html",redirect:"/getting-started/javascript/"},{name:"v-6b6d7bae",path:"/getting-started/python/shiny.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-6b6d7bae").then(n)}},{name:"v-a5deb388",path:"/getting-started/r/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-a5deb388").then(n)}},{path:"/getting-started/r/index.html",redirect:"/getting-started/r/"},{name:"v-a1f70a7a",path:"/join/free_trial.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-a1f70a7a").then(n)}},{name:"v-02b9217c",path:"/processes/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-02b9217c").then(n)}},{path:"/processes/index.html",redirect:"/processes/"},{name:"v-2ac201a4",path:"/usecases/Fractional-canopy-Cover/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-2ac201a4").then(n)}},{path:"/usecases/Fractional-canopy-Cover/index.html",redirect:"/usecases/Fractional-canopy-Cover/"},{name:"v-0937d47a",path:"/usecases/ard/msi/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-0937d47a").then(n)}},{path:"/usecases/ard/msi/index.html",redirect:"/usecases/ard/msi/"},{name:"v-d4caec3c",path:"/usecases/ard/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-d4caec3c").then(n)}},{path:"/usecases/ard/index.html",redirect:"/usecases/ard/"},{name:"v-62bfd25c",path:"/usecases/ard/sen2like/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-62bfd25c").then(n)}},{path:"/usecases/ard/sen2like/index.html",redirect:"/usecases/ard/sen2like/"},{name:"v-ddb09444",path:"/usecases/crop-conditions/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-ddb09444").then(n)}},{path:"/usecases/crop-conditions/index.html",redirect:"/usecases/crop-conditions/"},{name:"v-c5fcf990",path:"/usecases/ard/sar/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-c5fcf990").then(n)}},{path:"/usecases/ard/sar/index.html",redirect:"/usecases/ard/sar/"},{name:"v-2b5b0ed8",path:"/usecases/forest-change-detection/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-2b5b0ed8").then(n)}},{path:"/usecases/forest-change-detection/index.html",redirect:"/usecases/forest-change-detection/"},{name:"v-65bcb302",path:"/usecases/crop-classification/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-65bcb302").then(n)}},{path:"/usecases/crop-classification/index.html",redirect:"/usecases/crop-classification/"},{name:"v-5041b7a0",path:"/usecases/landcover/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-5041b7a0").then(n)}},{path:"/usecases/landcover/index.html",redirect:"/usecases/landcover/"},{name:"v-697f60bc",path:"/usecases/no2-monitoring/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-697f60bc").then(n)}},{path:"/usecases/no2-monitoring/index.html",redirect:"/usecases/no2-monitoring/"},{name:"v-589f7f88",path:"/usecases/large-scale-processing/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-589f7f88").then(n)}},{path:"/usecases/large-scale-processing/index.html",redirect:"/usecases/large-scale-processing/"},{name:"v-4a7f74ac",path:"/usecases/gfm/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-4a7f74ac").then(n)}},{path:"/usecases/gfm/index.html",redirect:"/usecases/gfm/"},{name:"v-e3af3008",path:"/usecases/vessel-detection/",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-e3af3008").then(n)}},{path:"/usecases/vessel-detection/index.html",redirect:"/usecases/vessel-detection/"},{path:"*",component:Lt}],Mt={title:"openEO Platform Documentation",description:"One of the most important properties for a future-oriented platform on earth observation is the orientation towards simple operation, with a special focus on efficiency of evaluation and availability. Complexity is kept hidden in the background to direct your focus on the data. This is done on one hand by the use of an aggregate API to access the infrastructure, but also by improved user-faced graphical processing. For access to the API, the user has the option to incorporate his own preferences, by choosing between several clients.",base:"/",headTags:[],pages:[{title:"Home",frontmatter:{home:!0},regularPath:"/",relativePath:"README.md",key:"v-4e72e1d8",path:"/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/api/",relativePath:"api/index.md",key:"v-14e901dc",path:"/api/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{frontmatter:{sidebar:!1,stripCSS:!0},regularPath:"/data-collections/",relativePath:"data-collections/index.md",key:"v-21917184",path:"/data-collections/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Federation API",frontmatter:{},regularPath:"/federation/backends/api.html",relativePath:"federation/backends/api.md",key:"v-acc004fa",path:"/federation/backends/api.html",headers:[{level:2,title:"Profiles",slug:"profiles"},{level:3,title:"LP: Required for openEO Platform",slug:"lp-required-for-openeo-platform"},{level:2,title:"Authentication and authorization",slug:"authentication-and-authorization"},{level:3,title:"Authentication",slug:"authentication"},{level:3,title:"Authorization",slug:"authorization"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Platform credit usage",frontmatter:{},regularPath:"/federation/accounting.html",relativePath:"federation/accounting.md",key:"v-045b6323",path:"/federation/accounting.html",headers:[{level:2,title:"Platform credit rates",slug:"platform-credit-rates"},{level:2,title:"Estimating resource usage",slug:"estimating-resource-usage"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"File Formats",frontmatter:{},regularPath:"/federation/backends/fileformats.html",relativePath:"federation/backends/fileformats.md",key:"v-688ffb43",path:"/federation/backends/fileformats.html",headers:[{level:2,title:"Best practices file formats",slug:"best-practices-file-formats"},{level:3,title:"Raster Formats",slug:"raster-formats"},{level:2,title:"Federation agreement file formats",slug:"federation-agreement-file-formats"},{level:3,title:"GeoTiff",slug:"geotiff"},{level:3,title:"netCDF",slug:"netcdf"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Collections",frontmatter:{},regularPath:"/federation/backends/collections.html",relativePath:"federation/backends/collections.md",key:"v-3e291b63",path:"/federation/backends/collections.html",headers:[{level:2,title:"Collection availability",slug:"collection-availability"},{level:3,title:"Requirements for non-experimental collections",slug:"requirements-for-non-experimental-collections"},{level:2,title:"Harmonization",slug:"harmonization"},{level:3,title:"Common naming convention",slug:"common-naming-convention"},{level:3,title:"Sentinel2-L2A",slug:"sentinel2-l2a"},{level:3,title:"Common Properties",slug:"common-properties"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Federation Contract",frontmatter:{},regularPath:"/federation/backends/",relativePath:"federation/backends/index.md",key:"v-700f1b88",path:"/federation/backends/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Processes",frontmatter:{},regularPath:"/federation/backends/processes.html",relativePath:"federation/backends/processes.md",key:"v-78536523",path:"/federation/backends/processes.html",headers:[{level:3,title:"Requirements per Profile",slug:"requirements-per-profile"},{level:2,title:"L2P: Required - openEO Platform",slug:"l2p-required-openeo-platform"},{level:2,title:"L3P: Advanced - openEO Platform",slug:"l3p-advanced-openeo-platform"},{level:2,title:"L4P: Complete - openEO Platform",slug:"l4p-complete-openeo-platform"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Federation Aspects and Known Issues",frontmatter:{},regularPath:"/federation/",relativePath:"federation/index.md",key:"v-7ffae7c8",path:"/federation/",headers:[{level:2,title:"Data Collections",slug:"data-collections"},{level:3,title:"Terrascope",slug:"terrascope"},{level:3,title:"Sentinel Hub",slug:"sentinel-hub"},{level:3,title:"EODC",slug:"eodc"},{level:3,title:"Enforce back-end selection for common collections",slug:"enforce-back-end-selection-for-common-collections"},{level:2,title:"Processes",slug:"processes"},{level:2,title:"File formats",slug:"file-formats"},{level:2,title:"On-demand-preview",slug:"on-demand-preview"},{level:2,title:"Batch jobs",slug:"batch-jobs"},{level:3,title:"Managed job splitting",slug:"managed-job-splitting"},{level:3,title:"Validity of signed URLs in batch job results",slug:"validity-of-signed-urls-in-batch-job-results"},{level:3,title:"Customizing batch job resources on Terrascope",slug:"customizing-batch-job-resources-on-terrascope"},{level:3,title:"Batch job results on Sentinel Hub",slug:"batch-job-results-on-sentinel-hub"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{frontmatter:{sidebar:!1,stripCSS:!0},regularPath:"/file-formats/",relativePath:"file-formats/index.md",key:"v-21de1e8c",path:"/file-formats/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO Python Client Client Side Processing",frontmatter:{},regularPath:"/getting-started/client-side-processing/",relativePath:"getting-started/client-side-processing/index.md",key:"v-76e62a34",path:"/getting-started/client-side-processing/",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Usage",slug:"usage"},{level:3,title:"STAC Collections and Items",slug:"stac-collections-and-items"},{level:3,title:"Local Collections",slug:"local-collections"},{level:3,title:"Local Processing",slug:"local-processing"},{level:2,title:"Client-Side Processing Example Notebooks",slug:"client-side-processing-example-notebooks"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO Platform Editor",frontmatter:{},regularPath:"/getting-started/editor/",relativePath:"getting-started/editor/index.md",key:"v-adb4d3cc",path:"/getting-started/editor/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with openEO Platform in JupyterLab (Python)",frontmatter:{},regularPath:"/getting-started/jupyterlab/",relativePath:"getting-started/jupyterlab/index.md",key:"v-779fe818",path:"/getting-started/jupyterlab/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO Python Client",frontmatter:{},regularPath:"/getting-started/python/",relativePath:"getting-started/python/index.md",key:"v-23074efc",path:"/getting-started/python/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Connect to openEO Platform and explore",slug:"connect-to-openeo-platform-and-explore"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:2,title:"Working with Datacubes",slug:"working-with-datacubes"},{level:3,title:"Creating a Datacube",slug:"creating-a-datacube"},{level:3,title:"Applying processes",slug:"applying-processes"},{level:3,title:"Defining output format",slug:"defining-output-format"},{level:2,title:"Execution",slug:"execution"},{level:3,title:"Batch job execution",slug:"batch-job-execution"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO JavaScript Client",frontmatter:{},regularPath:"/getting-started/javascript/",relativePath:"getting-started/javascript/index.md",key:"v-974804cc",path:"/getting-started/javascript/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Connecting to openEO Platform",slug:"connecting-to-openeo-platform"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:2,title:"Creating a (user-defined) process",slug:"creating-a-user-defined-process"},{level:2,title:"Batch Job Management",slug:"batch-job-management"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Run openEO processes in Shiny apps",frontmatter:{},regularPath:"/getting-started/python/shiny.html",relativePath:"getting-started/python/shiny.md",key:"v-6b6d7bae",path:"/getting-started/python/shiny.html",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Get started with the openEO R Client",frontmatter:{},regularPath:"/getting-started/r/",relativePath:"getting-started/r/index.md",key:"v-a5deb388",path:"/getting-started/r/",headers:[{level:2,title:"Useful links",slug:"useful-links"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Connect to openEO Platform and explore",slug:"connect-to-openeo-platform-and-explore"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:2,title:"Creating a (user-defined) process",slug:"creating-a-user-defined-process"},{level:2,title:"Batch Job Management",slug:"batch-job-management"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Registration",frontmatter:{},regularPath:"/join/free_trial.html",relativePath:"join/free_trial.md",key:"v-a1f70a7a",path:"/join/free_trial.html",headers:[{level:2,title:"Connect with EGI Check-in",slug:"connect-with-egi-check-in"},{level:2,title:"EOPlaza",slug:"eoplaza"},{level:2,title:"Working with openEO Platform",slug:"working-with-openeo-platform"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/processes/",relativePath:"processes/index.md",key:"v-02b9217c",path:"/processes/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Fractional Canopy Cover",frontmatter:{},regularPath:"/usecases/Fractional-canopy-Cover/",relativePath:"usecases/Fractional-canopy-Cover/index.md",key:"v-2ac201a4",path:"/usecases/Fractional-canopy-Cover/",headers:[{level:2,title:"Fractional Canopy Cover",slug:"fractional-canopy-cover"},{level:2,title:"Data Preparation",slug:"data-preparation"},{level:2,title:"Model training",slug:"model-training"},{level:2,title:"Predicted Fractional Canopy Cover",slug:"predicted-fractional-canopy-cover"},{level:2,title:"Validation",slug:"validation"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Analysis-Ready Data for Multi-Spectral Imagery (Sentinel-2)",frontmatter:{},regularPath:"/usecases/ard/msi/",relativePath:"usecases/ard/msi/index.md",key:"v-0937d47a",path:"/usecases/ard/msi/",headers:[{level:2,title:"Atmospheric correction",slug:"atmospheric-correction"},{level:3,title:"Reference implementations",slug:"reference-implementations"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Analysis-Ready Data (ARD)",frontmatter:{},regularPath:"/usecases/ard/",relativePath:"usecases/ard/index.md",key:"v-d4caec3c",path:"/usecases/ard/",lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Sen2Like",frontmatter:{},regularPath:"/usecases/ard/sen2like/",relativePath:"usecases/ard/sen2like/index.md",key:"v-62bfd25c",path:"/usecases/ard/sen2like/",headers:[{level:2,title:"1. sen2like for RGB",slug:"_1-sen2like-for-rgb"},{level:3,title:"openEO sen2like processing",slug:"openeo-sen2like-processing"},{level:3,title:"Explore the openEO L2F results",slug:"explore-the-openeo-l2f-results"},{level:2,title:"2. sen2like for NDVI",slug:"_2-sen2like-for-ndvi"},{level:3,title:"Explore the openEO L2F NDVI results",slug:"explore-the-openeo-l2f-ndvi-results"},{level:2,title:"3. Sen2Like processing in the openeo web editor",slug:"_3-sen2like-processing-in-the-openeo-web-editor"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Crop conditions",frontmatter:{},regularPath:"/usecases/crop-conditions/",relativePath:"usecases/crop-conditions/index.md",key:"v-ddb09444",path:"/usecases/crop-conditions/",headers:[{level:2,title:"1. data preparation",slug:"_1-data-preparation"},{level:2,title:"2. Sen2like processing",slug:"_2-sen2like-processing"},{level:2,title:"3. Running the Job",slug:"_3-running-the-job"},{level:2,title:"4. Explore the openEO results",slug:"_4-explore-the-openeo-results"},{level:2,title:"5. Indices calculations",slug:"_5-indices-calculations"},{level:3,title:"5.1 Leaf Area Index (LAI)",slug:"_5-1-leaf-area-index-lai"},{level:3,title:"5.2\tLeaf Chlorophyll Content (CAB)",slug:"_5-2leaf-chlorophyll-content-cab"},{level:3,title:"5.3\tFraction of green Vegetation Cover (FCOVER)",slug:"_5-3fraction-of-green-vegetation-cover-fcover"},{level:3,title:"5.4\tFraction of Absorbed Photosynthetically Active Radiation (FAPAR)",slug:"_5-4fraction-of-absorbed-photosynthetically-active-radiation-fapar"},{level:3,title:"5.5\tNormalized difference vegetation index",slug:"_5-5normalized-difference-vegetation-index"},{level:3,title:"5.6 Explore the results",slug:"_5-6-explore-the-results"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Analysis-Ready Data for SAR (Sentinel-1)",frontmatter:{},regularPath:"/usecases/ard/sar/",relativePath:"usecases/ard/sar/index.md",key:"v-c5fcf990",path:"/usecases/ard/sar/",headers:[{level:2,title:"Backscatter computation",slug:"backscatter-computation"},{level:2,title:"Reference implementations",slug:"reference-implementations"},{level:3,title:"CARD4L NRB for SENTINEL1_GRD collection (provided by Sentinel Hub)",slug:"card4l-nrb-for-sentinel1-grd-collection-provided-by-sentinel-hub"},{level:3,title:"Orfeo for other GRD collections (provided by VITO / TerraScope)",slug:"orfeo-for-other-grd-collections-provided-by-vito-terrascope"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Forest Change Detection",frontmatter:{},regularPath:"/usecases/forest-change-detection/",relativePath:"usecases/forest-change-detection/index.md",key:"v-2b5b0ed8",path:"/usecases/forest-change-detection/",headers:[{level:2,title:"Data preparation",slug:"data-preparation"},{level:2,title:"Seasonal curve fitting",slug:"seasonal-curve-fitting"},{level:2,title:"Predicting values",slug:"predicting-values"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Crop Classification",frontmatter:{},regularPath:"/usecases/crop-classification/",relativePath:"usecases/crop-classification/index.md",key:"v-65bcb302",path:"/usecases/crop-classification/",headers:[{level:2,title:"Preprocessing & feature engineering",slug:"preprocessing-feature-engineering"},{level:3,title:"Data preparation",slug:"data-preparation"},{level:3,title:"Computing temporal features",slug:"computing-temporal-features"},{level:2,title:"Model training",slug:"model-training"},{level:2,title:"Classification",slug:"classification"},{level:3,title:"Rule-based classification",slug:"rule-based-classification"},{level:3,title:"Supervised classification using Random Forest",slug:"supervised-classification-using-random-forest"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Dynamic land cover service",frontmatter:{},regularPath:"/usecases/landcover/",relativePath:"usecases/landcover/index.md",key:"v-5041b7a0",path:"/usecases/landcover/",headers:[{level:2,title:"Methodology",slug:"methodology"},{level:3,title:"Reference data",slug:"reference-data"},{level:3,title:"Input data",slug:"input-data"},{level:3,title:"Preprocessing",slug:"preprocessing"},{level:3,title:"Feature engineering",slug:"feature-engineering"},{level:3,title:"Model",slug:"model"},{level:2,title:"Implementation",slug:"implementation"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"NO₂ monitoring",frontmatter:{},regularPath:"/usecases/no2-monitoring/",relativePath:"usecases/no2-monitoring/index.md",key:"v-697f60bc",path:"/usecases/no2-monitoring/",headers:[{level:2,title:"Shiny apps (R and Python)",slug:"shiny-apps-r-and-python"},{level:3,title:"Time-Series Analyser",slug:"time-series-analyser"},{level:3,title:"Map Maker for one Snapshot",slug:"map-maker-for-one-snapshot"},{level:3,title:"Spacetime Animation",slug:"spacetime-animation"},{level:2,title:"Basic NO₂ analysis in Python, R and JavaScript",slug:"basic-no2-analysis-in-python-r-and-javascript"},{level:3,title:"1. Load a data cube",slug:"_1-load-a-data-cube"},{level:3,title:"2. Fill gaps",slug:"_2-fill-gaps"},{level:3,title:"3. Smoothen values (optional)",slug:"_3-smoothen-values-optional"},{level:3,title:"4. What do you want to know?",slug:"_4-what-do-you-want-to-know"},{level:3,title:"5. Execute the process",slug:"_5-execute-the-process"},{level:3,title:"Result",slug:"result"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Large scale processing",frontmatter:{},regularPath:"/usecases/large-scale-processing/",relativePath:"usecases/large-scale-processing/index.md",key:"v-589f7f88",path:"/usecases/large-scale-processing/",headers:[{level:2,title:"Relevant openEO features",slug:"relevant-openeo-features"},{level:2,title:"Preparation",slug:"preparation"},{level:2,title:"Prepare tiling grid",slug:"prepare-tiling-grid"},{level:2,title:"Prepare job attributes",slug:"prepare-job-attributes"},{level:2,title:"Tuning your processing job",slug:"tuning-your-processing-job"},{level:2,title:"Starting map production",slug:"starting-map-production"},{level:2,title:"Errors during production",slug:"errors-during-production"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Global Flood Monitoring",frontmatter:{},regularPath:"/usecases/gfm/",relativePath:"usecases/gfm/index.md",key:"v-4a7f74ac",path:"/usecases/gfm/",headers:[{level:2,title:"Output layers used in openEO",slug:"output-layers-used-in-openeo"},{level:2,title:"Links",slug:"links"},{level:2,title:"Compute the maximum flood extent",slug:"compute-the-maximum-flood-extent"},{level:2,title:"Explore how the flood extent relates to the Global Human Settlement Built-up layer",slug:"explore-how-the-flood-extent-relates-to-the-global-human-settlement-built-up-layer"},{level:2,title:"Statistical analysis",slug:"statistical-analysis"},{level:2,title:"Observed water (flood_extent + refwater)",slug:"observed-water-flood-extent-refwater"},{level:2,title:"Explore the observed water",slug:"explore-the-observed-water"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3},{title:"Vessel Detection",frontmatter:{},regularPath:"/usecases/vessel-detection/",relativePath:"usecases/vessel-detection/index.md",key:"v-e3af3008",path:"/usecases/vessel-detection/",headers:[{level:2,title:"Adaptive Thresholding in Xarray",slug:"adaptive-thresholding-in-xarray"},{level:3,title:"1. Authenticate",slug:"_1-authenticate"},{level:3,title:"2. Pre-processing prep",slug:"_2-pre-processing-prep"},{level:3,title:"3. Defining a process graph to detect vessels in our AOI.",slug:"_3-defining-a-process-graph-to-detect-vessels-in-our-aoi"},{level:3,title:"4. Run Auxilliary job",slug:"_4-run-auxilliary-job"},{level:2,title:"Result Visualisation",slug:"result-visualisation"},{level:2,title:"Use Case -- Recap",slug:"use-case-recap"}],lastUpdated:"8/22/2024, 6:54:05 AM",lastUpdatedTimestamp:1724309645e3}],themeConfig:{logo:"https://openeo.cloud/wp-content/themes/openeo_platform/images/logo-pages.svg",editLinks:!0,docsRepo:"openEOPlatform/documentation",docsBranch:"main",algolia:{appId:"AH1DCGL38F",apiKey:"3d026b8a9c3950be6d136a6d0f934029",indexName:"openeo-cloud"},nav:[{text:"Datasets",link:"/data-collections/"},{text:"Get Started",items:[{text:"Free Trial Registration",link:"/join/free_trial.html"},{text:"Data Cubes",link:"https://openeo.org/documentation/1.0/datacubes.html"},{text:"Client Libraries",items:[{text:"JavaScript",link:"/getting-started/javascript/"},{text:"Python",link:"/getting-started/python/"},{text:"R",link:"/getting-started/r/"}]},{text:"Development Environments",items:[{text:"JupyterLab (Python)",link:"/getting-started/jupyterlab/"},{text:"Editor",link:"/getting-started/editor/"}]},{text:"Cookbook",link:"https://openeo.org/documentation/1.0/cookbook/"},{text:"Client-Side Processing (Python)",link:"/getting-started/client-side-processing/"}]},{text:"Clients",items:[{text:"JavaScript",link:"https://open-eo.github.io/openeo-js-client/latest/"},{text:"Python",link:"https://open-eo.github.io/openeo-python-client/"},{text:"R",link:"https://open-eo.github.io/openeo-r-client/"}]},{text:"Use Cases",items:[{text:"Cookbook",link:"https://openeo.org/documentation/1.0/cookbook/"},{text:"Analysis-Ready Data (ARD)",items:[{text:"Overview",link:"/usecases/ard/"},{text:"SAR (Sentinel-1)",link:"/usecases/ard/sar/"},{text:"Multi-Spectral Imagery",link:"/usecases/ard/msi/"},{text:"Sen2Like",link:"/usecases/ard/sen2like/"}]},{text:"Crop Classification",link:"/usecases/crop-classification/"},{text:"Forest Change Detection",link:"/usecases/forest-change-detection/"},{text:"Land Cover Classification",link:"/usecases/landcover/"},{text:"NO₂ monitoring",link:"/usecases/no2-monitoring/"},{text:"Large scale processing",link:"/usecases/large-scale-processing/"},{text:"Global flood monitoring",link:"/usecases/gfm/"},{text:"Vessel Detection",link:"/usecases/vessel-detection/"},{text:"Fractional canopy Cover",link:"/usecases/Fractional-canopy-Cover/"},{text:"Crop Conditions",link:"/usecases/crop-conditions/"}]},{text:"Processes",items:[{text:"JavaScript & R",link:"/processes/"},{text:"Python",link:"https://open-eo.github.io/openeo-python-client/api.html#module-openeo.rest.datacube"}]},{text:"File Formats",link:"/file-formats/"},{text:"Advanced",items:[{text:"Accounting",link:"/federation/accounting.html"},{text:"Federation Aspects",link:"/federation/index.html"},{text:"Federation Contract",link:"/federation/backends/index.html"},{text:"HTTP API",link:"/api/"}]},{text:"Contact",link:"https://openeo.cloud/contact/"}],sidebar:"auto"}};"undefined"!=typeof window&&(window.global=window);n(148);r.a.component("DataCollections",()=>Promise.all([n.e(0),n.e(4),n.e(34)]).then(n.bind(null,550))),r.a.component("ApiSpec",()=>n.e(61).then(n.bind(null,557))),r.a.component("FileFormatsSpec",()=>Promise.all([n.e(0),n.e(4),n.e(35)]).then(n.bind(null,551))),r.a.component("ProcessesSpec",()=>Promise.all([n.e(0),n.e(1),n.e(4),n.e(23),n.e(41)]).then(n.bind(null,558))),r.a.component("CodeBlock",()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,554))),r.a.component("Badge",()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,564))),r.a.component("CodeGroup",()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,555)));n(149);var Ut=[({router:e,Vue:t})=>{t.config.ignoredElements=["redoc"],e.beforeEach((e,t,n)=>{const r={"/authentication":"/join/free_trial.html","/join/early_adopter.html":"/join/free_trial.html"}[e.path];r?n({path:r}):n()})},{},({Vue:e})=>{e.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},{},({Vue:e})=>{e.component("CodeCopy",Et)}],It=[];class Dt extends class{constructor(){this.store=new r.a({data:{state:{}}})}$get(e){return this.store.state[e]}$set(e,t){r.a.set(this.store.state,e,t)}$emit(...e){this.store.$emit(...e)}$on(...e){this.store.$on(...e)}}{}Object.assign(Dt.prototype,{getPageAsyncComponent:ct,getLayoutAsyncComponent:lt,getAsyncComponent:ut,getVueComponent:ft});var Ft={install(e){const t=new Dt;e.$vuepress=t,e.prototype.$vuepress=t}};function Nt(e,t){const n=t.toLowerCase();return e.options.routes.some(e=>e.path.toLowerCase()===n)}var Bt={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(e){const t=this.pageKey||this.$parent.$page.key;return dt("pageKey",t),r.a.component(t)||r.a.component(t,ct(t)),r.a.component(t)?e(t):e("")}},zt={functional:!0,props:{slotKey:String,required:!0},render:(e,{props:t,slots:n})=>e("div",{class:["content__"+t.slotKey]},n()[t.slotKey])},Vt={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},qt=(n(150),n(151),Object(Pt.a)(Vt,(function(){var e=this._self._c;return e("span",[e("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[e("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),e("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),e("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),Ht={functional:!0,render(e,{parent:t,children:n}){if(t._isMounted)return n;t.$once("hook:mounted",()=>{t.$forceUpdate()})}};r.a.config.productionTip=!1,r.a.use(We),r.a.use(Ft),r.a.mixin(function(e,t,n=r.a){!function(e){e.locales&&Object.keys(e.locales).forEach(t=>{e.locales[t].path=t});Object.freeze(e)}(t),n.$vuepress.$set("siteData",t);const o=new(e(n.$vuepress.$get("siteData"))),i=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(o)),a={};return Object.keys(i).reduce((e,t)=>(t.startsWith("$")&&(e[t]=i[t].get),e),a),{computed:a}}(e=>class{setPage(e){this.__page=e}get $site(){return e}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:e={}}=this.$site;let t,n;for(const r in e)"/"===r?n=e[r]:0===this.$page.path.indexOf(r)&&(t=e[r]);return t||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:e}=this.$page.frontmatter;return"string"==typeof e&&e}get $title(){const e=this.$page,{metaTitle:t}=this.$page.frontmatter;if("string"==typeof t)return t;const n=this.$siteTitle,r=e.frontmatter.home?null:e.frontmatter.title||e.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const e=function(e){if(e){const t=e.filter(e=>"description"===e.name)[0];if(t)return t.content}}(this.$page.frontmatter.meta);return e||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(e,t){for(let n=0;nn||(e.hash?!r.a.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(e.hash)}:{x:0,y:0})});!function(e){e.beforeEach((t,n,r)=>{if(Nt(e,t.path))r();else if(/(\/|\.html)$/.test(t.path))if(/\/$/.test(t.path)){const n=t.path.replace(/\/$/,"")+".html";Nt(e,n)?r(n):r()}else r();else{const n=t.path+"/",o=t.path+".html";Nt(e,o)?r(o):Nt(e,n)?r(n):r()}})}(n);const o={};try{await Promise.all(Ut.filter(e=>"function"==typeof e).map(t=>t({Vue:r.a,options:o,router:n,siteData:Mt,isServer:e})))}catch(e){console.error(e)}return{app:new r.a(Object.assign(o,{router:n,render:e=>e("div",{attrs:{id:"app"}},[e("RouterView",{ref:"layout"}),e("div",{class:"global-ui"},It.map(t=>e(t)))])})),router:n}}(!1).then(({app:e,router:t})=>{t.onReady(()=>{e.$mount("#app")})})}]); \ No newline at end of file diff --git a/data-collections/index.html b/data-collections/index.html index def919c1b..127ff394b 100644 --- a/data-collections/index.html +++ b/data-collections/index.html @@ -8,7 +8,7 @@ - + @@ -165,6 +165,6 @@

Loading data...

- + diff --git a/federation/accounting.html b/federation/accounting.html index f5c22e9fa..785fd4875 100644 --- a/federation/accounting.html +++ b/federation/accounting.html @@ -8,7 +8,7 @@ - + @@ -182,6 +182,6 @@ costs a few euros, but then you would also notice that your job is taking multiple hours to run.

In any case, once you've established an initial cost for a small area, you can extrapolate to a larger area. If simple linear extrapolation shows that a larger job is affordable, then run the job on larger areas, like 50ha or up to 100x100km. This will show you how your job scales, and what kind of costs you will be incurring! If at any point the cost appears unreasonable, please contact the platform!

- + diff --git a/federation/backends/api.html b/federation/backends/api.html index 6ebd01825..87d59d9ba 100644 --- a/federation/backends/api.html +++ b/federation/backends/api.html @@ -8,7 +8,7 @@ - + @@ -170,6 +170,6 @@ The requirement to implement two of L1A, L1B, and L1C has been restricted for openEO Platform to always require L1A: Synchronous Processing and L1B: Batch Jobs (see req. no. 703). This means that L1C: Secondary Web Services is optional.

The hierarchy of openEO and openEO Platform API profiles.
An overview of the openEO and openEO Platform API profiles.

# LP: Required for openEO Platform

The profile only lists requirements that are not covered by the openEO profile L2: Recommended yet.

# API fundamentals

# Functionality Description
14 All > Billing Supports the openEO Platform credit system

# File Formats

# Functionality Description
45 GET /file_formats File format names and parameters aligned with openEO Platform as defined for the pre-defined file formats

# Other

# Functionality Description
90 GET /health Returns 2XX or 5XX http status code (without authentication)

# Auth

# Functionality Description
113 GET /credentials/oidc Supports EGI as identity provider (including tokens)
118 GET /credentials/oidc Supports the required entitlements of the vo.openeo.cloud virtual organization, especially the claim eduperson_entitlement

For more details about Authentication and Authorization, please see the corresponding chapters below.

# Pre-defined Processes

# Functionality Description
205 GET /processes > processes All processes are valid according to the specification (id, description, parameters, returns are required)
208 GET /processes > processes Processes are marked as experimental or deprecated if applicable

# Collections

# Functionality Description
311 GET /collections > collections Collections are marked as experimental or deprecated if applicable
324 GET /collections/{id} > id IDs follow the openEO Platform naming convention
327 GET /collections/{id} > providers Each collection needs to expose the backend offering the data

# Data Processing

# Functionality Description
703 Batch jobs and synchronous processing are implemented (secondary web services are optional)
704 Time after which batch job results get automatically deleted: 90 days or later
705 Time after which batch job metadata gets automatically deleted: 1 year or later

# Batch Jobs > Results

# Functionality Description
873 GET /jobs/{id}/results > public access link Default expiry time of the signed URLs for results: 7 days

# Synchronous Processing

# Functionality Description
920 POST /result > timeout The timeout for synchronous calls is: 5 minutes

# Authentication and authorization

This important aspect of the federation is standardized by the AARC Blueprint Architecture (opens new window). EGI Check-in is the concrete implementation that is currently in use.

# Authentication

The openEO platform federation standardizes on the use of EGI Check-in (opens new window) as identity provider. Backends have to support the use of openID connect + PKCE, to enable this and register a client with EGI Check-in.

# Authorization

# Entitlements

Users of the federation are organized under the 'vo.openeo.cloud' virtual organization in EGI Check-in. Inside the virtual organization, different roles can be assigned to a user, to indicate that they have a certain subscription, or even on a more fine-grained level are entitled to specific actions or resources. The mechanism to check this, is again supported by EGI Check-in, under the 'eduperson_entitlement' claim: https://docs.egi.eu/providers/check-in/sp/#claims (opens new window)

# Credits

The second criterium for authorization is based on credits that are available to a user. Credits allow the platform to limit the volume of data access and processing operations that a user can perform during a given time frame. The amount of available credits depends on the subscription. When the credit balance of a user goes below zero, processing operations can be blocked.

# Aggregator rules

Based on the subscription and available credits, the aggregator can implement these rules:

  1. Credit checks to block starting of batch jobs, synchronous requests to /result and viewing services.
  2. Rate limiting (TBD)

# Backend rules

Some authorization rules will need to be enforced by the backends themselves:

  1. Basic access and access to user specific resources based on subscription role.
  2. Number of concurrent batch jobs
  3. Available processing resources, batch job priorities
  4. Batch job result data volume
  5. Access to restricted collections
- + diff --git a/federation/backends/collections.html b/federation/backends/collections.html index 0a3ab42cf..f3e2478b9 100644 --- a/federation/backends/collections.html +++ b/federation/backends/collections.html @@ -8,7 +8,7 @@ - + @@ -174,6 +174,6 @@ considered non-experimental.

  1. Collections need to indicate the key 'providers' that are responsible for ensuring access to the data and continuity in the case of active missions. The user may depend on the guarantees offered by these providers with respect to the properties (timeliness, completeness,...) of a specific collection. The providers with role 'host' and 'producer' are mandatory.

  2. The collection description and extents needs to specify known limitations with respect to the original collection. For instance, if only a subset of the full archive is available, this should be indicated. Extents can be rough approximations to avoid requiring very detailed geometry in the metadata.

  3. Collections without an end time are assumed to be active missions. By default, 99% of items in these collections should be available within 48 hours after being published by the producer. This gives users a basic guarantee with respect to timeliness of products.

  4. Collection metadata should be valid STAC metadata and must include all extensions in stac_extensions. Tools such as STAC-validator (opens new window) can indicate obvious issues.

  5. FAIR principle R1: (Meta)data are richly described with a plurality of accurate and relevant attributes (opens new window)

  6. Collections have to follow harmonization guidelines specified below, if applicable.

  7. Collections naming (id, dimensions, bands) should remain constant.

  8. Backwards incompatible changes or removal need to be announced with a lead time of 6 months, together with a migration path.

  9. Minimum availability of non-experimental collections is 98% on a monthly basis. The backend availability is used here if availability is not measured per collection.

  10. Availability of a collection means that a simple process graph (e.g. using load_collection) returns a correct result. Collections may have special conditions to work, for instance in the case of commercial data.

# Harmonization

When back-ends offer/mirror the same datasets, it is required to align names and metadata. For the following collections and metadata an agreement has been achieved. These are all Copernicus Missions, and the standard names refer to the archives prepared and distributed by ESA. If it is not possible/desirable to use this name as collection id, a 'common_name' can be added next to the 'id' property to identify the collection as a standard archive.

# Common naming convention

In order to achieve a uniform structure for all collections on the platform and thus make it easier for users to navigate between collections, it is recommended to follow the common naming convention*:

  • Names should be written in capital letters ("all caps")
  • Names should consist of a combination of different optional attributes (see table)
  • The different attributes should be separated by an underscore

Very roughly speaking, collections can be divided into two groups (in reality it is more of a spectrum with all gradations in between):

  • collections containing raw data (or processing levels of that data) measured directly by a satellite (or an other measurement platform) and often distributed by the platform operator (e.g., ESA)
  • derived collections, which are based on (pre-processed) raw data that has been processed to create a collection with a specific purpose (e.g., a land cover map) and are often distributed by the institution (or a service of an institution) that created the collection
Attribute Type Description Examples
Provider string Often used for derived collections produced or order by the listed provider. ESA, CNSE, EMODNET, TERRASCOPE. CAMS, CGLS
Satellite/Platform string Name of the satellite/platform that acquired the data in the collection. SENTINEL2, LANDSAT8, PALSAR2
Processing level string Name of the level to which the data was processed (often processed raw data). L2A, L3, L2_1
Version string Often used for derived collections that are produced in several versions. V1, V2
Resolution string (number + unit or string) Usually added, if the resolution is of particular importance for the collection (e.g., novel product with this resolution) for the collection. 10M, 120M, EUROPE, GLOBAL
Product Description string Human readable description of the data within the collection. Can also be an abbreviation or acronym. LAND_COVER_MAP, WORLDCOVER, NDVI, LAI
Year number Often used for derived products that where updated in the specified year or created based on data of the specified year. 2022

Collections containing raw data or processing levels of that data often use a combination of satellite/platform and processing level (e.g., SENTINEL2_L1C ). Derived collections often use a combination of provider and product description (e.g., CNES_LAND_COVER_MAP).

*Some existing collections may not strictly follow this naming convention as they were added to the platform prior to this agreement.

# Sentinel2-L2A

The common name for this collection is 'SENTINEL2_L2A'. It refers to the L2A products generated by the Sen2Cor software, which can be configured to be compatible with the ESA generated products. Note that the products in the ESA archive were also processed with different versions of Sen2Cor, so it is not possible to specify a very specific version or configuration of the processing chain.

# Bands

Band names for spectral bands follow the Bxx naming convention used by ESA. For example: B01, B02, B03, B08, B8A, B12

  • SCL = the Sen2Cor scene classification band
  • approximateViewAzimuth = collective term for the mean and accurate viewing azimuth angle. Depending on which backend is processing the data, the mean angle (for Sentinel Hub) or the accurate angle (for Terrascope) is used. If the accurate angle (viewAzimuthAngles) or the mean angle (viewAzimuthMean) is explicitly specified, the data is processed on the backend that holds the specified band.
  • viewZenithMean = collective term for the mean and accurate viewing zenith angle. Depending on which backend is processing the data, the mean angle (for Sentinel Hub) or the accurate angle (for Terrascope) is used. If the accurate angle (viewZenithMean) or the mean angle (viewZenithAngles) is explicitly specified, the data is processed on the backend that holds those bands.
  • sunAzimuthAngles/sunZenithAngles = collective term for the exact sun azimuth and sun zenith angle.

# Common Properties

We list here a set of common properties, that can be relevant for multiple collections. Collections are strongly encouraged to use these properties instead of using a different name for the same property.

# Common

# Optical instruments

# SAR instruments

- + diff --git a/federation/backends/fileformats.html b/federation/backends/fileformats.html index e6555b3a1..d203acd4b 100644 --- a/federation/backends/fileformats.html +++ b/federation/backends/fileformats.html @@ -8,7 +8,7 @@ - + @@ -169,6 +169,6 @@
  • georeferenced (x/y dimensions)
  • can store multiple bands (band dimension)
  • can store multiple timestamps (time dimension)
  • self-describing, portable and scalable
  • GeoTiff: ideal for storing several bands in one file in cloud optimized format
    • georeferenced
    • can store multiple bands
    • a single GeoTiff corresponds to one timestamp (in combination with STAC, multi-temporal collections can be supported)
    • cloud optimized
  • # Federation agreement file formats

    If back-ends offer/mirror the same file formats for both import and export, it is required to align them.

    For file export through save_result for example, the output parameters and the structure of the data that is written to storage needs to be defined. For the following file formats an agreement has been achieved:

    • GeoTiff
    • netCDF

    The idea of these guidelines is to align with what the formats and corresponding toolchains support as much as possible.

    # GeoTiff

    Defaults:

    # netCDF

    Defaults:

    • The full datacube is written to a single netCDF.
    • The openEO dimension metadata is preserved in the netCDF file.
    • CF conventions (https://cfconventions.org/) are used where applicable.
    • Data is chunked and compressed

    More information on all supported file formats, can be found here.

    - + diff --git a/federation/backends/index.html b/federation/backends/index.html index fb610c65e..0ec3abfe1 100644 --- a/federation/backends/index.html +++ b/federation/backends/index.html @@ -8,7 +8,7 @@ - + @@ -172,6 +172,6 @@ the provider is expected to stop working on new features and improve reliability, or to mark the component as experimental. Reverting a 'stable' feature to 'experimental' should be considered a backwards incompatible change, requiring communication towards the user and proper consideration of the impact.

    Note

    To join the federation, it is required to (mostly) fulfill these requirements and document differences for users in the "Federation Aspects and Known Issues". Nevertheless, these requirements are negotiable if there are good arguments for a change as the current state of the "contract" is just the compromise that the existing providers have agreed upon and if a new back-end joins the federation new compromises may need to be made.

    - + diff --git a/federation/backends/processes.html b/federation/backends/processes.html index afeac73f0..d31dbc751 100644 --- a/federation/backends/processes.html +++ b/federation/backends/processes.html @@ -8,7 +8,7 @@ - + @@ -177,6 +177,6 @@
    • has been tested on > 100x100km at 10m resolution (or equivalent)
  • load_url (experimental)
    • has been tested on > 100x100km at 10m resolution (or equivalent)
  • sar_backscatter (experimental)
    • has been tested on > 100x100km at 10m resolution (or equivalent)
  • - + diff --git a/federation/index.html b/federation/index.html index 6e960a9f6..b4ee4c6a3 100644 --- a/federation/index.html +++ b/federation/index.html @@ -8,7 +8,7 @@ - + @@ -256,6 +256,6 @@

    This is a short overview of the various options:

    • executor-memory: memory assigned to your workers, for the JVM that executes most predefined processes
    • executor-memoryOverhead: memory assigned on top of the JVM, for instance to run UDF's
    • executor-cores: number of CPUs per worker (executor). The number of parallel tasks is executor-cores/task-cpus
    • task-cpus: CPUs assigned to a single task. UDF's using libraries like Tensorflow can benefit from further parallellization on the level of individual tasks.
    • executor-request-cores: this settings is only relevant for Kubernetes based backends, allows to overcommit CPU
    • max-executors: the maximum number of workers assigned to your job. Maximum number of parallel tasks is max-executors*executor-cores/task-cpus. Increasing this can inflate your costs, while not necessarily improving performance!
    • driver-memory: memory assigned to the spark 'driver' JVM that controls execution of your batch job
    • driver-memoryOverhead: memory assigned to the spark 'driver' on top of JVM memory, for Python processes.
    • logging-threshold: the threshold for logging, set to 'info' by default, can be set to 'debug' to generate much more logging
    • udf-dependency-archives: an array of urls pointing to zip files with extra dependencies, see below

    # Custom UDF dependencies

    User defined functions often depend on (specific versions of) libraries or require small auxiliary data files. The UDF specifications do not yet define a standardized manner to provide this other than having the ability of selecting from a predefined set of 'runtimes' that than again have a predefined configuration.

    The Terrascope/Geotrellis backends solve this via the udf-dependency-archives job option, that allows to specify a list of zip files that should be included in the working directory of the UDF.

    This enables the following example workflow for Python UDF's:

    1. Create a Python 'virtualenv' with your dependencies
    2. Based on the 'site-packages' directory of the virtualenv, create a zip file with all dependencies
    3. Upload the zip to a url that can be reached by the backend.
    4. In job options, add "udf-dependency-archives": ['https://yourhost.com/myEnv.zip#tmp/mydir'] The #tmp/mydir suffix indicates where you want to unzip your files, relative to the working directory.
    5. In your UDF, before trying to import libraries, add your directory to the Python path: sys.path.insert(0, 'tmp/mydir')
    6. Now your libraries should be loaded before anything else!

    Known limitations:

    • Your dependencies need to be compatible with the Python version of the backend, currently 3.8.
    • Your dependencies need to be compatible with the OS of the backend, currently AlmaLinux 8.
    • The backend has a limited set of Python dependences that are preloaded, and cannot be changed, such as numpy.

    # Learning more

    The topic of resource optimization is a complex one, and here we just give a short summary. The goal of openEO is to hide most of these details from the user, but we realize that advanced users sometimes want to have a bit more insight, so in the spirit of being open, we give some hints.

    To learn more about these options, we point to the piece of code that handles this:

    https://github.com/Open-EO/openeo-geopyspark-driver/blob/faf5d5364a82e870e42efd2a8aee9742f305da9f/openeogeotrellis/backend.py#L1213

    Most memory related options are translated to Apache Spark configuration settings, which are documented here:

    https://spark.apache.org/docs/3.3.1/configuration.html#application-properties

    # Batch job results on Sentinel Hub

    If you are processing data and the underlying back-end is Sentinel Hub, the output extent of your batch job results is currently larger than your input extent because Sentinel Hub processes whole tiles (this may change in the future and the data will be cropped to your input extent).

    - + diff --git a/file-formats/index.html b/file-formats/index.html index 77c8b708c..8f67f44d6 100644 --- a/file-formats/index.html +++ b/file-formats/index.html @@ -8,7 +8,7 @@ - + @@ -165,6 +165,6 @@

    Loading data...

    - + diff --git a/getting-started/client-side-processing/index.html b/getting-started/client-side-processing/index.html index 108c2b0fc..f31f52bd5 100644 --- a/getting-started/client-side-processing/index.html +++ b/getting-started/client-side-processing/index.html @@ -8,7 +8,7 @@ - + @@ -265,6 +265,6 @@ ndvi_median = ndvi.reduce_dimension(dimension="time", reducer="median") result_ndvi = ndvi_median.execute()

    # Client-Side Processing Example Notebooks

    # Additional Information

    Additional information and resources about the openEO Python Client Library:

    - + diff --git a/getting-started/editor/index.html b/getting-started/editor/index.html index 7105d07f5..8fc5a90a5 100644 --- a/getting-started/editor/index.html +++ b/getting-started/editor/index.html @@ -8,7 +8,7 @@ - + @@ -165,6 +165,6 @@

    # Get started with the openEO Platform Editor

    Note

    You need to get an openEO Platform account (opens new window) to access the processing infrastructure.

    The openEO Platform Editor (also called Web Editor) is a browser-based graphical user interface for openEO Platform. It allows to use the openEO Platform services without any coding experience. You can explore the service offerings such as data collections and processes, but also create and run custom processes on our infrastructure and then visualize the results. Result visualization is still a bit limited, but all other features of the Platform are supported.

    The Editor is available at https://editor.openeo.cloud (opens new window) and loads up in "Discovery mode" by default, which means you can explore the service offerings without being logged in. On the left side you can find the service offerings like data collections and processes and on the right side the process editor is shown.

    To enable more functionality, e.g. to compute something in a batch job, you have to login. Hover over the button with the text "Guest" in the top right corner and it will show you a "Login" button. Once you clicked on it, the login screen shows up. Here you can simply click the "Log in with EGI Check-in" button and the login procedure will start. See the chapters on the Free Tier or the available plans (opens new window) for more details on the procedure to register and log in.

    After you've completed this the login procedure, the Editor shows up again and you'll notice that a new area in the lower middle part of the Editor aprears. This is the user workspace, where you can see all your stored data, e.g. batch jobs or uploaded files.

    If you need any more help you can always click the "Help" button in the top right area of the Editor and you'll start a guided tour through the Editor. If there are any additional questions, please contact us.

    - + diff --git a/getting-started/javascript/index.html b/getting-started/javascript/index.html index b2d358fac..fba2dcf9f 100644 --- a/getting-started/javascript/index.html +++ b/getting-started/javascript/index.html @@ -8,7 +8,7 @@ - + @@ -266,6 +266,6 @@

    There's also the method downloadResults to download the results directly. Unfortunately, you can only download files from a Node.js environment where file access to your local drive is possible. In a Browser environment, it is also an option to download the STAC Item or Collection for the results using the getResultsAsStac method and point a STAC client (opens new window) to it for downloading.

    # Additional Information

    - + diff --git a/getting-started/jupyterlab/index.html b/getting-started/jupyterlab/index.html index 4db834a4d..b339ec7cc 100644 --- a/getting-started/jupyterlab/index.html +++ b/getting-started/jupyterlab/index.html @@ -8,7 +8,7 @@ - + @@ -166,6 +166,6 @@ Contact (opens new window)

    # Get started with openEO Platform in JupyterLab (Python)

    Important

    You need to get an openEO Platform account (opens new window) to access the processing infrastructure.

    A hosted JupyterLab environment for openEO Platform is available at lab.openeo.cloud (opens new window).

    It has the openEO Python client pre-installed, but it does not support running the R or JavaScript clients.

    You need to authenticate before you can use it:

    1. Select from the "Sign in" dropdown menu the "openEO Platform" option
    2. It will start the EGI Authentication workflow for openEO Platform. If you haven't you need to get an openEO Platform account (opens new window) before you proceed.
    3. After you have logged in via EGI, the "Server Options" appear and you are requested to "Select your desired stack". Please choose "openEO Platform Lab" and click "Start".
    4. You are logged in, now. The JupyterLab should be usable like a normal JupyterLab instance that has the openEO Python client and some other tools pre-installed.
    5. You can now open a new Python 3 Notebook and, for example, start to follow the general Python Getting Started Guide.

      Note

      You can skip the "Installation" section in the Getting Started Guide, but unfortunately you need to authenticate with the Python client again! We'll try to remove this annoyance in the future.

    Note

    You may shut down your device or log out during the job runs on the backend. You can retrieve the status and results later and from any client.

    If you require any additional packages to be installed into your JupyterLab environment please refrain from installing them via pip and install them via conda. Anaconda documentation (opens new window)

    Please also refer to the the official documentation for the openEO Python Client (opens new window) and JupyterLab (opens new window) for more details.

    - + diff --git a/getting-started/python/index.html b/getting-started/python/index.html index 3b4f8fdbc..70f38f5a1 100644 --- a/getting-started/python/index.html +++ b/getting-started/python/index.html @@ -8,7 +8,7 @@ - + @@ -273,6 +273,6 @@

    When everything completes successfully, the processing result will be downloaded as a GeoTIFF file in a folder "output".

    TIP

    You may shut down your device or log out during the job runs on the backend. You can retrieve the status and results later and from any client.

    The official openEO Python Client documentation has more information on batch job management and downloading results (opens new window)

    # Additional Information

    Additional information and resources about the openEO Python Client Library:

    - + diff --git a/getting-started/python/shiny.html b/getting-started/python/shiny.html index 619272e61..d31624146 100644 --- a/getting-started/python/shiny.html +++ b/getting-started/python/shiny.html @@ -8,7 +8,7 @@ - + @@ -248,6 +248,6 @@ return fig

    As in a dashboard, one will probably work with rendering plots mainly, that should be resourceful enough to let anyone start playing with openEO and Shiny in python together. If there are any doubts, do not hesitate to reach the developers and consider even creating an issue in this repository. Please be aware of openEO backend related issues that do not concern this dashboard developers.

    - + diff --git a/getting-started/r/index.html b/getting-started/r/index.html index ff367a01d..7810e09a5 100644 --- a/getting-started/r/index.html +++ b/getting-started/r/index.html @@ -8,7 +8,7 @@ - + @@ -250,6 +250,6 @@ # download all the files into a folder on the file system download_results(job = job, folder = "/some/folder/on/filesystem")

    Note

    The printing behavior and the actual data structure might differ!

    - + diff --git a/index.html b/index.html index 78593d04f..8b7e725fa 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ - + @@ -184,6 +184,6 @@

    You can also go back to the project website at openeo.cloud to find the less technical details.

    - + diff --git a/join/free_trial.html b/join/free_trial.html index 9c42ed2ee..bb26eafb2 100644 --- a/join/free_trial.html +++ b/join/free_trial.html @@ -8,7 +8,7 @@ - + @@ -201,6 +201,6 @@ https://openeo.cloud and then authenticate through EGI Check-in with the account used above.

    Tip

    For your own convenience, we advise you to always log in with the same identity provider you originally registered with. Otherwise, you run the risk of creating a separate new EGI account, which in turn will have to go through the openEO Platform virtual organization acceptance process again. It is possible to link multiple accounts from multiple identity providers to the same EGI account. However, this must be done before you use these accounts to log in, as explained in the EGI documentation (opens new window).

    See the getting started guides to find out more about how to use the clients for this:

    - + diff --git a/processes/index.html b/processes/index.html index 8cedd47df..0472f7ada 100644 --- a/processes/index.html +++ b/processes/index.html @@ -8,7 +8,7 @@ - + @@ -171,6 +171,6 @@
    - + diff --git a/usecases/Fractional-canopy-Cover/index.html b/usecases/Fractional-canopy-Cover/index.html index 520f58769..2901505fa 100644 --- a/usecases/Fractional-canopy-Cover/index.html +++ b/usecases/Fractional-canopy-Cover/index.html @@ -8,7 +8,7 @@ - + @@ -169,6 +169,6 @@

    # Predicted Fractional Canopy Cover

    In the fit_regr_random_forest process, the actual regression calculation is taking place. Based on the random forest implementation a model is created to predict the target variable. The fitting is done in a standard machine learning approach with 70% of the polygons whereas 30% of the polygons are used for the evaluation of the model.

    Scoring method
    Figure 3: Predicted Fractional Canopy Cover for part of the study area

    # Validation

    Polygons were separated in the initial stage of the project for the validation. 512 polygons with 36 pixels each corresponding to the HRL tree density layer were used for the validation task. The comparison showed a correlation of 0.76 summarised in the plot below in Figure 4.

    Scoring method
    Figure 4: Correlation plot with HRL tree density polygons
    - + diff --git a/usecases/ard/index.html b/usecases/ard/index.html index 19636be58..e1dafefb0 100644 --- a/usecases/ard/index.html +++ b/usecases/ard/index.html @@ -8,7 +8,7 @@ - + @@ -170,6 +170,6 @@ There are also variants with a default parametrization that results in data that is compliant with CEOS CARD4L specifications (opens new window).

    We should note that these operations can be computationally expensive, so certainly affect overall processing time and cost of your final algorithm. Hence, make sure to make an informed decision when you decide to use these methods.

    Examples:

    - + diff --git a/usecases/ard/msi/index.html b/usecases/ard/msi/index.html index ee1d25b02..6998d0aed 100644 --- a/usecases/ard/msi/index.html +++ b/usecases/ard/msi/index.html @@ -8,7 +8,7 @@ - + @@ -181,6 +181,6 @@ SMAC is implemented based on: https://github.com/olivierhagolle/SMAC (opens new window) Both methods have been tested with Sentinel-2 as input. The viewing and sun angles need to be selected by the user to make them available for the algorithm.

    This is an example of applying iCor:

    - + diff --git a/usecases/ard/sar/index.html b/usecases/ard/sar/index.html index 058d9037d..07752b0ba 100644 --- a/usecases/ard/sar/index.html +++ b/usecases/ard/sar/index.html @@ -8,7 +8,7 @@ - + @@ -175,6 +175,6 @@ Details can be found in the corresponding Getting Started guides.

    # CARD4L NRB for SENTINEL1_GRD collection (provided by Sentinel Hub)

    When working with the Sentinel Hub based SENTINEL1_GRD collection, both SAR backscatter processes can be used. The underlying implementation is provided by Sentinel Hub (opens new window), and offers full CARD4L compliant processing options.

    # Orfeo for other GRD collections (provided by VITO / TerraScope)

    When working with other GRD data, an implementation (opens new window) based on Orfeo Toolbox (opens new window) is used.

    The Orfeo implementation currently only supports sigma0 computation, and is not CARD4L compliant.

    - + diff --git a/usecases/ard/sen2like/index.html b/usecases/ard/sen2like/index.html index ac58b8745..6d6f4f1de 100644 --- a/usecases/ard/sen2like/index.html +++ b/usecases/ard/sen2like/index.html @@ -8,7 +8,7 @@ - + @@ -330,6 +330,6 @@ "parameters": [] }
    - + diff --git a/usecases/crop-classification/index.html b/usecases/crop-classification/index.html index 26dc6b1cf..25dcd9505 100644 --- a/usecases/crop-classification/index.html +++ b/usecases/crop-classification/index.html @@ -8,7 +8,7 @@ - + @@ -168,6 +168,6 @@ but you can have a look at the random forest notebook if that is something you need help with.

    # Classification

    # Rule-based classification

    A simple approach is to define rules based on your features to classify crops. For example, when looking at temporal profiles of corn, we can see that the NDVI of may is smaller than the NDVI of june. By creating and iteratively refining rules for each of these crop types, we can get a first classification result.

    However, to do this, we need to be able to do band math on the temporal dimension. Remember target_dimension="bands" that we used before to calculate the statistics over the temporal dimension? We can use this again to stack the temporal dimension onto the band dimension.

    Next, we can do boolean comparison of features and see whether any given pixel matches the rules you determined.

    Each of these rules results in a boolean that can be combined using geometric progression, to obtain a final cube containing all crop type predictions.

    # Supervised classification using Random Forest

    A more sophisticated approach is to use a machine learning model such as Random Forest. As mentioned before, training is done after feature extraction outside of openEO, and you can then pickle your model and store it on a repository. Next, you define a UDF that unpickles your model, predicts, and returns a new DataCube instance that contains the predicted values instead of the features.

    Note that if your labels are strings, you will have to map them to integers. You can then download the classification results and plot it. Congratulations!

    To see a fully working example, you can check out this Python notebook on rule-based classification (opens new window) or this Python notebook on classification using Random Forest (opens new window).

    We ran the code in that notebook for ~120 MGRS tiles to end up with a crop cover map for 5 countries in Europe, which looks like this:

    cropcover_5_countries

    - + diff --git a/usecases/crop-conditions/index.html b/usecases/crop-conditions/index.html index 6056e990f..7715bf542 100644 --- a/usecases/crop-conditions/index.html +++ b/usecases/crop-conditions/index.html @@ -8,7 +8,7 @@ - + @@ -283,6 +283,6 @@ plt.imshow(lai[0], cmap="YlGn") plt.colorbar()

    image

    - + diff --git a/usecases/forest-change-detection/index.html b/usecases/forest-change-detection/index.html index 34b51f6c6..368d074fc 100644 --- a/usecases/forest-change-detection/index.html +++ b/usecases/forest-change-detection/index.html @@ -8,7 +8,7 @@ - + @@ -170,6 +170,6 @@ The following figure shows such pixels with detected change from both Sentinel-1 and Sentinel-2

    S1 and S2 curve fitting and prediction steps
    Figure 2: Curve fitting and prediction for Sentinel-1 and Sentinel-2. In blue the S2 B08 and S1SIGÖ VH data and in orange the respective predicted values following the harmonic seasonal function.

    In this section, we will show how to combine openEO functionality into a basic change detection pipeline.

    # Data preparation

    To correctly find the right fitting for the harmonic function, we need cloud-free data if using optical data, or shadow masked data if using radar data, over a timeseries of at least two years (but more is better!). Pixels covered by clouds or shadows deviate from the expected trend of the vegetation and therefore we must start with pre-processed data.

    The current implementation of the fit_curve() / predict_curve() process and available processing and memory resources limit the spatio-temporal extent of data which can be processed in a single job. If a large extent should be processed, the extent has to be split into multiple parts and can be processed in multiple jobs.

    # Seasonal curve fitting

    Supposing that the training input data is a cloud-free Sentinel-2 timeseries we can write the following code using the openEO clients to find the optimal function coefficients:

    # Predicting values

    With the seasonal function coefficients, we can predict the expected value for a particular time step. In the following case, we are computing the values following the seasonal trend for the training time steps:

    The difference between the training data and the predicted values following the seasonal model is a key information, which is used to perform the change detection with new data. Please have a look at the reference notebook (opens new window) for the complete pipeline.

    The results obtained over an area of South Tyrol in Northern Italy which was hit by the Vaia storm are shown below. Similar damages are detected from Sentinel-1 and Sentinel-2

    Change detection from Sentinel-1 and Sentinel-2
    Figure 3: Change detection maps for the Vaia storm from Sentinel-1 and Sentinel-2.

    - + diff --git a/usecases/gfm/index.html b/usecases/gfm/index.html index 992492abf..eaec23a62 100644 --- a/usecases/gfm/index.html +++ b/usecases/gfm/index.html @@ -8,7 +8,7 @@ - + @@ -217,6 +217,6 @@ # Save the result in Equi7Grid and as GeoTiff observed_water_tif = observed_water.save_result(format="GTiff", options={"tile_grid": "equi7"})

    # Explore the observed water

    The original GFM data is stored in the Equi7 Grid and the Asian Equi7 coordinate reference system. With the tile_grid parameter, the user can either keep the data like this, or pick a different CRS.

    Observed water
    Figure 2: The observed water mask in Pakistan in September 2022.
    - + diff --git a/usecases/landcover/index.html b/usecases/landcover/index.html index fa7f7ebb8..4bd4f565a 100644 --- a/usecases/landcover/index.html +++ b/usecases/landcover/index.html @@ -8,7 +8,7 @@ - + @@ -165,6 +165,6 @@

    # Dynamic land cover service

    In this notebook we will be studying land cover mapping. Land cover mapping has been done since the onset of remote sensing, and LC products have been identified as a fundamental variable needed for studying the functional and morphological changes occurring in the Earth's ecosystems and the environment, and plays therefore an important role in studying climate change and carbon circulation (Congalton et al., 2014; Feddema et al., 2005; Sellers et al., 1997). In addition to that, it provides valuable information for policy development and a wide range of applications within natural sciences and life sciences, making it one of the most widely studied applications within remote sensing (Yu et al., 2014, Tucker et al., 1985; Running, 2008; Yang et al., 2013).

    With this variety in application fields comes a variety of user needs. Depending on the use case, there may be large differences in the target labels desired, the target year(s) requested, the output resolution needed, the featureset used, the stratification strategy employed, and more. The goal of this use case is to show that OpenEO as a platform can deal with this variability, and we will do so through creating a userfriendly interface in which the user can set a variety of parameters that will tailor the pipeline from -reference set & L2A+GRD > to model > to inference- to the users needs.

    In this notebook, helper functionality from this repository (opens new window) is used. It contains amongst others the entire feature building engineering workflow, so if you are interested in knowing how to do that or if you want to make more customizations towards your own use case, have a look at it. Note that the repository is not finalized, as it is a general repository also used for other purposes.

    A full notebook for this use case can be found here (opens new window).

    heelbelgie

    # Methodology

    # Reference data

    The reference dataset used in this section is the Land Use/Cover Area frame Survey (LUCAS) Copernicus dataset of 2018. LUCAS is an evenly spaced in-situ land use and land cover ground survey exercise that extends over the entire of the European Union. The Copernicus module extends up to 51m in four cardinal directions to delineate polygons for each of these points. The final product contains about 60,000 polygons, from which subsequent points can be sampled (d'Andrimont et al., 2021). You as a user can specify how many points to sample from these polygons to train your model. In addition, the user can upload extra target data to improve performance.

    # Input data

    The service created runs on features constructed from GRD sigma0 and L2A data. This data will be accessed through OpenEO platform from Terrascope and Sentinel Hub. You, as a user, can determine a time range, though the year should be kept to 2018, as that is the year in which the LUCAS Copernicus dataset was assembled. Data from other years can be extracted for prediction, provided that the user uploads their own reference set.

    # Preprocessing

    The L2A data has been masked using the sen2cor sceneclassification, with a buffering approach developed at VITO and made available as a process called mask_scl_dilation. From the Sentinel-1 GRD collection, backscatter is calculated.

    # Feature engineering

    We select and calculate the following products from our input collections:

    • 7 indices (NDVI, NDMI, NDGI, ANIR, NDRE1, NDRE2, NDRE5) and 2 bands (B06, B12) from the L2A collection
    • VV, VH and VV/VH (ratio) from the GRD sigma0 collection

    All layers are rescaled to 0 to 30000 for computational efficiency. The indices/bands are then aggregated temporally (for Sentinel-2 data: 10-day window using the median. For Sentinel-1 data: 12 day window using the mean. The median was used for the S2 collection instead of the mean to prevent possible artifacts caused by cloud shadows). The output is then interpolated linearly and the S1 cube is resampled spatially to a 10m resolution. Finally, 10 features are calculated on each of the band dimensions. These 10 features are the standard deviation, 25th, 50th and 75th percentile, and 6 equidistant t-steps. Through this procedure, we end up with a total of 120 features (12 bands x 10 features).

    # Model

    Where previously models had to be trained outside of openEO, we can now train Random Forest models in openEO itself. Hyperparameter tuning can be performed using a custom hyperparameter set. After training, the model is validated and used for prediction.

    # Implementation

    First, we load in a dataset with target labels. In order for the model to work, the target labels need to be integers. Also, we extract some target points from the target polygons.

    Next, we will create our featureset and use this featureset to train a model. The indices from which you calculate features can be adjusted by a parameter, but if you'd want you could even create the entire feature engineering pipeline yourself. If you are interested in knowing how to do so, you can dive a little bit deeper into the openEO code found here (opens new window).

    Subsequently, we can calculate a number of validation metrics from our test set. To do so, we do inference for the points of our y-test set and write these predictions out to a netCDF. The function calculate_validation_metrics (not part of openEO itself, but simply a client-side helper function) then loads in the y-test geojson and the netCDF with predicted values, extracts the points and stores the predicted values alongside their actual target labels in a dataframe.

    After inspecting the metrics and possibly further finetuning the model or dataset, we can do inference on an area of choice and write the result. Happy mapping!

    tile31UFS

    - + diff --git a/usecases/large-scale-processing/index.html b/usecases/large-scale-processing/index.html index 01763ca6d..839e9fafa 100644 --- a/usecases/large-scale-processing/index.html +++ b/usecases/large-scale-processing/index.html @@ -8,7 +8,7 @@ - + @@ -194,6 +194,6 @@ your backend of choice. For instance, in a cloud environment with 16GB per machine and 4 cpu's, using slightly less than 4GB per worker is efficient as you can fit 4 parallel workers on a single VM, while requiring 6GB would fit only 2 workers and leave about 4GB unused.

    In our example, we used the Geotrellis backends, which has these execution options.

    # Starting map production

    The openEO Python client provides a useful tool to run multiple processing jobs in multiple backends:

    https://open-eo.github.io/openeo-python-client/cookbook/job_manager.html (opens new window)

    This class takes a GeoJSON corresponding to your tile grid and job properties per tiles, and triggers a function provided by you whenever a new job needs to be created. You can configure multiple backends, and set the number of parallel jobs per backend.

    This class also takes care of error handling, and can be considered more resilient compared to writing a simple loop yourself.

    A full example of how we use this can be found here (opens new window).

    This script uses a CSV file to track your jobs, and whenever it is interrupted it can simply resume from that CSV file, making it tolerant to failure.

    Tracking jobs by CSV

    # Errors during production

    It is expected to see jobs failing during production, which can be considered normal as long as the failure rate is not too high. We advice to quickly inspect error logs, and if no obvious reason for failure is found, a simple retry might be sufficient. In other cases it may be needed to increase memory. We also see a limited number of cases where for instance issues in the underlying product archive cause failures or artifacts. These are harder to resolve, and may require interaction with the backend to resove!

    - + diff --git a/usecases/no2-monitoring/index.html b/usecases/no2-monitoring/index.html index 0e3d63108..2275501b3 100644 --- a/usecases/no2-monitoring/index.html +++ b/usecases/no2-monitoring/index.html @@ -8,7 +8,7 @@ - + @@ -195,6 +195,6 @@ For the GeoTiff and netCDF files you may want to store them into files though. The JSON output you could directly work with.

    # Result

    If you'd visualize the results of running the timeseries analysis for mean, min and max could results in such a chart:

    min/max/mean NO2 chart

    - + diff --git a/usecases/vessel-detection/index.html b/usecases/vessel-detection/index.html index 686b23000..8b1dbb98c 100644 --- a/usecases/vessel-detection/index.html +++ b/usecases/vessel-detection/index.html @@ -8,7 +8,7 @@ - + @@ -226,6 +226,6 @@

    # Result Visualisation

    A small dashboard has been provided with the Plotly Dash library to quickly visualise the results of our processing. We're using this dashboard so we can interface with the PyGeoApi server that hosts the Maritime Traffic data. You will need to use the canonical url of the job result, this can be found in the notebook via a helper fuinction, or in the job information via the web editor.

    PyGeoApi Data: https://features.dev.services.eodc.eu/collections/adriatic_vessels

    from eodc.visualisation.vessel_detection.app import app
     app.run()
     

    # Plotly Dashboard for results viewing

    Plotly Dashboard

    # With the additional auxilliary job

    Plotly Dashboard

    # Use Case -- Recap

    We've been through a number of iterations to arrive at this implementation.

    1. Recieved an initial implementation from Planetek, which we packaged and released as a custom function, "vessel_detection".
    2. Porting to Xarray. This resulted in a single function called "adaptive_thresholding", that removed the dependency to the ellipsoid corrected SENTINEL1_GRD imagery.
    3. Porting to existing OpenEO processes. This addresses the feedback from the previous review, i.e. the implementation should be reproducable for this use case.
    - +