From e7f001a9fe9871560e0a89820fd5a5d9976b9660 Mon Sep 17 00:00:00 2001 From: openEO CI Date: Tue, 26 Nov 2024 00:40:22 +0000 Subject: [PATCH] deploy: 085b7cf82fc4ddda7cb9fd5d36ff56752e0bdc0f --- 404.html | 6 +++--- api/index.html | 4 ++-- assets/js/{37.60c3c1c8.js => 37.58eb9300.js} | 2 +- assets/js/{52.d62744a5.js => 52.36e989f0.js} | 2 +- assets/js/{53.08c214fd.js => 53.0f456a8e.js} | 2 +- assets/js/{54.ed6c0bee.js => 54.f2fb5249.js} | 2 +- assets/js/{55.049d7676.js => 55.354f9414.js} | 2 +- assets/js/{57.6c62528b.js => 57.687e115a.js} | 2 +- assets/js/{59.192b0f57.js => 59.3be59468.js} | 2 +- assets/js/{65.2a1bff73.js => 65.ee3dfe60.js} | 2 +- assets/js/{66.6cd67341.js => 66.6282b2f4.js} | 2 +- assets/js/{68.4291a4fc.js => 68.248d0334.js} | 2 +- assets/js/{69.cc422707.js => 69.09f05241.js} | 2 +- assets/js/{71.2a288608.js => 71.7bdf3025.js} | 2 +- assets/js/{72.c90aabf1.js => 72.9a45fb61.js} | 2 +- assets/js/{73.6dd217af.js => 73.1badaee0.js} | 2 +- assets/js/{75.2176bc79.js => 75.fdc034f6.js} | 2 +- assets/js/{77.5a6fee3e.js => 77.3203cab1.js} | 2 +- assets/js/{app.8c0e1ada.js => app.b0297558.js} | 4 ++-- data-collections/index.html | 4 ++-- federation/accounting.html | 4 ++-- federation/backends/api.html | 4 ++-- federation/backends/collections.html | 4 ++-- federation/backends/fileformats.html | 4 ++-- federation/backends/index.html | 4 ++-- federation/backends/processes.html | 4 ++-- federation/index.html | 4 ++-- file-formats/index.html | 4 ++-- getting-started/client-side-processing/index.html | 4 ++-- getting-started/editor/index.html | 4 ++-- getting-started/javascript/index.html | 4 ++-- getting-started/jupyterlab/index.html | 4 ++-- getting-started/python/index.html | 4 ++-- getting-started/python/shiny.html | 4 ++-- getting-started/r/index.html | 4 ++-- index.html | 4 ++-- join/free_trial.html | 4 ++-- processes/index.html | 4 ++-- usecases/Fractional-canopy-Cover/index.html | 4 ++-- usecases/ard/index.html | 4 ++-- usecases/ard/msi/index.html | 4 ++-- usecases/ard/sar/index.html | 4 ++-- usecases/ard/sen2like/index.html | 4 ++-- usecases/crop-classification/index.html | 4 ++-- usecases/crop-conditions/index.html | 4 ++-- usecases/forest-change-detection/index.html | 4 ++-- usecases/gfm/index.html | 4 ++-- usecases/landcover/index.html | 4 ++-- usecases/large-scale-processing/index.html | 4 ++-- usecases/no2-monitoring/index.html | 4 ++-- usecases/vessel-detection/index.html | 4 ++-- 51 files changed, 87 insertions(+), 87 deletions(-) rename assets/js/{37.60c3c1c8.js => 37.58eb9300.js} (90%) rename assets/js/{52.d62744a5.js => 52.36e989f0.js} (96%) rename assets/js/{53.08c214fd.js => 53.0f456a8e.js} (99%) rename assets/js/{54.ed6c0bee.js => 54.f2fb5249.js} (97%) rename assets/js/{55.049d7676.js => 55.354f9414.js} (98%) rename assets/js/{57.6c62528b.js => 57.687e115a.js} (99%) rename assets/js/{59.192b0f57.js => 59.3be59468.js} (99%) rename assets/js/{65.2a1bff73.js => 65.ee3dfe60.js} (98%) rename assets/js/{66.6cd67341.js => 66.6282b2f4.js} (99%) rename assets/js/{68.4291a4fc.js => 68.248d0334.js} (98%) rename assets/js/{69.cc422707.js => 69.09f05241.js} (79%) rename assets/js/{71.2a288608.js => 71.7bdf3025.js} (97%) rename assets/js/{72.c90aabf1.js => 72.9a45fb61.js} (99%) rename assets/js/{73.6dd217af.js => 73.1badaee0.js} (98%) rename assets/js/{75.2176bc79.js => 75.fdc034f6.js} (99%) rename assets/js/{77.5a6fee3e.js => 77.3203cab1.js} (79%) rename assets/js/{app.8c0e1ada.js => app.b0297558.js} (91%) diff --git a/404.html b/404.html index c7d7eec2a..4987b4d27 100644 --- a/404.html +++ b/404.html @@ -8,13 +8,13 @@ - + -

404

Looks like we've got some broken links.
+ - + diff --git a/api/index.html b/api/index.html index 0701e65cd..fe2eb2d6c 100644 --- a/api/index.html +++ b/api/index.html @@ -8,7 +8,7 @@ - + @@ -165,6 +165,6 @@
- + diff --git a/assets/js/37.60c3c1c8.js b/assets/js/37.58eb9300.js similarity index 90% rename from assets/js/37.60c3c1c8.js rename to assets/js/37.58eb9300.js index c13f77f09..ffe870c3d 100644 --- a/assets/js/37.60c3c1c8.js +++ b/assets/js/37.58eb9300.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{350:function(e,t,a){e.exports=a.p+"assets/img/score.e247f05c.png"},351:function(e,t,a){e.exports=a.p+"assets/img/PG_prediction.405498a8.png"},352:function(e,t,a){e.exports=a.p+"assets/img/Predicted_FCC.7e4f40fe.png"},353:function(e,t,a){e.exports=a.p+"assets/img/Validation.e5a7edd6.png"},584: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(350),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(351),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(352),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(353),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/52.d62744a5.js b/assets/js/52.36e989f0.js similarity index 96% rename from assets/js/52.d62744a5.js rename to assets/js/52.36e989f0.js index 22d0a2289..3263b98cd 100644 --- a/assets/js/52.d62744a5.js +++ b/assets/js/52.36e989f0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{354:function(e,t,o){e.exports=o.p+"assets/img/Registration_Flow.a1d30769.png"},355:function(e,t,o){e.exports=o.p+"assets/img/join0.60a3bf5f.png"},585: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(354),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(355),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.0f456a8e.js similarity index 99% rename from assets/js/53.08c214fd.js rename to assets/js/53.0f456a8e.js index c2fe2acbf..f22202d3e 100644 --- a/assets/js/53.08c214fd.js +++ b/assets/js/53.0f456a8e.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"},591: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.f2fb5249.js similarity index 97% rename from assets/js/54.ed6c0bee.js rename to assets/js/54.f2fb5249.js index 88575b95f..cfbb9652f 100644 --- a/assets/js/54.ed6c0bee.js +++ b/assets/js/54.f2fb5249.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"},592: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.354f9414.js similarity index 98% rename from assets/js/55.049d7676.js rename to assets/js/55.354f9414.js index a6c6167ff..af2c0cf1d 100644 --- a/assets/js/55.049d7676.js +++ b/assets/js/55.354f9414.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],{364:function(t,e,s){t.exports=s.p+"assets/img/gfm-flood-extent.46cc6068.png"},365:function(t,e,s){t.exports=s.p+"assets/img/gfm-observed-water.6638af3f.png"},593: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(364),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(365),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/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/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/68.4291a4fc.js b/assets/js/68.248d0334.js similarity index 98% rename from assets/js/68.4291a4fc.js rename to assets/js/68.248d0334.js index 365a64a9f..7b04bc95f 100644 --- a/assets/js/68.4291a4fc.js +++ b/assets/js/68.248d0334.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{571:function(e,t,n){"use strict";n.r(t);var o=n(4),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"federation-contract"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#federation-contract"}},[e._v("#")]),e._v(" Federation Contract")]),e._v(" "),t("p",[e._v("For a federation to work, all providers need to come up with a federation contract to agree on.\nSee the "),t("RouterLink",{attrs:{to:"/federation/"}},[e._v("overview about the existing federation concepts and issues")]),e._v(".")],1),e._v(" "),t("p",[e._v("This contract has 2 main goals:")]),e._v(" "),t("ol",[t("li",[e._v("Achieve user satisfaction, which can be measured in terms of user growth and number of complaints versus the usage of a specific feature.")]),e._v(" "),t("li",[e._v("Agree on interfaces and harmonization rules to align the different services in the federation.")])]),e._v(" "),t("p",[e._v("The platform aims to be inclusive towards onboarding new features and components,\nto stimulate growth and innovation. To allow this in an environment that also supports\nuser-critical workflows such functionality needs to be clearly marked, for instance by setting\nan 'experimental' property on a process, collection or backend, and by indicating it in descriptions or the documentation.")]),e._v(" "),t("p",[e._v("We assume that most often, an implementor knows when a feature is mature enough. However, when there is doubt about indicating a feature as experimental:")]),e._v(" "),t("ul",[t("li",[e._v("By default or if unsure, it is probably experimental.")]),e._v(" "),t("li",[e._v("If a feature is new or it hasn't been used, it's experimental.")]),e._v(" "),t("li",[e._v("If still in doubt, consult with partner providers.")])]),e._v(" "),t("p",[e._v("If a non-experimental component exceeds the "),t("a",{attrs:{href:"https://sre.google/workbook/implementing-slos/",target:"_blank",rel:"noopener noreferrer"}},[e._v("error budget"),t("OutboundLink")],1),e._v(", for instance when downtime exceeds the objective,\nthe provider is expected to stop working on new features and improve reliability, or to mark the component\nas 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.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v('To join the federation, it is required to (mostly) fulfill these requirements and document differences for users in the "'),t("RouterLink",{attrs:{to:"/federation/"}},[e._v("Federation Aspects and Known Issues")]),e._v('".\nNevertheless, 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.')],1)]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/federation/backends/api.html"}},[e._v("API")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/federation/backends/collections.html"}},[e._v("Collections")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/federation/backends/fileformats.html"}},[e._v("File Formats")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/federation/backends/processes.html"}},[e._v("Processes")])],1)])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{570:function(e,t,n){"use strict";n.r(t);var o=n(4),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"federation-contract"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#federation-contract"}},[e._v("#")]),e._v(" Federation Contract")]),e._v(" "),t("p",[e._v("For a federation to work, all providers need to come up with a federation contract to agree on.\nSee the "),t("RouterLink",{attrs:{to:"/federation/"}},[e._v("overview about the existing federation concepts and issues")]),e._v(".")],1),e._v(" "),t("p",[e._v("This contract has 2 main goals:")]),e._v(" "),t("ol",[t("li",[e._v("Achieve user satisfaction, which can be measured in terms of user growth and number of complaints versus the usage of a specific feature.")]),e._v(" "),t("li",[e._v("Agree on interfaces and harmonization rules to align the different services in the federation.")])]),e._v(" "),t("p",[e._v("The platform aims to be inclusive towards onboarding new features and components,\nto stimulate growth and innovation. To allow this in an environment that also supports\nuser-critical workflows such functionality needs to be clearly marked, for instance by setting\nan 'experimental' property on a process, collection or backend, and by indicating it in descriptions or the documentation.")]),e._v(" "),t("p",[e._v("We assume that most often, an implementor knows when a feature is mature enough. However, when there is doubt about indicating a feature as experimental:")]),e._v(" "),t("ul",[t("li",[e._v("By default or if unsure, it is probably experimental.")]),e._v(" "),t("li",[e._v("If a feature is new or it hasn't been used, it's experimental.")]),e._v(" "),t("li",[e._v("If still in doubt, consult with partner providers.")])]),e._v(" "),t("p",[e._v("If a non-experimental component exceeds the "),t("a",{attrs:{href:"https://sre.google/workbook/implementing-slos/",target:"_blank",rel:"noopener noreferrer"}},[e._v("error budget"),t("OutboundLink")],1),e._v(", for instance when downtime exceeds the objective,\nthe provider is expected to stop working on new features and improve reliability, or to mark the component\nas 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.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v('To join the federation, it is required to (mostly) fulfill these requirements and document differences for users in the "'),t("RouterLink",{attrs:{to:"/federation/"}},[e._v("Federation Aspects and Known Issues")]),e._v('".\nNevertheless, 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.')],1)]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/federation/backends/api.html"}},[e._v("API")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/federation/backends/collections.html"}},[e._v("Collections")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/federation/backends/fileformats.html"}},[e._v("File Formats")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/federation/backends/processes.html"}},[e._v("Processes")])],1)])])}),[],!1,null,null,null);t.default=r.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/71.2a288608.js b/assets/js/71.7bdf3025.js similarity index 97% rename from assets/js/71.2a288608.js rename to assets/js/71.7bdf3025.js index 0de3dcdd4..e5fff61a7 100644 --- a/assets/js/71.2a288608.js +++ b/assets/js/71.7bdf3025.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{577:function(e,t,o){"use strict";o.r(t);var r=o(4),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"get-started-with-the-openeo-platform-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-platform-editor"}},[e._v("#")]),e._v(" Get started with the openEO Platform Editor")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("You need to "),t("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[e._v("get an openEO Platform account"),t("OutboundLink")],1),e._v(" to access the processing infrastructure.")])]),e._v(" "),t("p",[e._v("The "),t("em",[e._v("openEO Platform Editor")]),e._v(" (also called "),t("em",[e._v("Web Editor")]),e._v(") 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.")]),e._v(" "),t("p",[e._v("The Editor is available at "),t("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://editor.openeo.cloud"),t("OutboundLink")],1),e._v(' 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.')]),e._v(" "),t("p",[e._v('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 '),t("RouterLink",{attrs:{to:"/join/free_tier.html"}},[e._v("Free Tier")]),e._v(" or the "),t("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[e._v("available plans"),t("OutboundLink")],1),e._v(" for more details on the procedure to register and log in.")],1),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("p",[e._v('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.')])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{580:function(e,t,o){"use strict";o.r(t);var r=o(4),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"get-started-with-the-openeo-platform-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-platform-editor"}},[e._v("#")]),e._v(" Get started with the openEO Platform Editor")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("You need to "),t("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[e._v("get an openEO Platform account"),t("OutboundLink")],1),e._v(" to access the processing infrastructure.")])]),e._v(" "),t("p",[e._v("The "),t("em",[e._v("openEO Platform Editor")]),e._v(" (also called "),t("em",[e._v("Web Editor")]),e._v(") 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.")]),e._v(" "),t("p",[e._v("The Editor is available at "),t("a",{attrs:{href:"https://editor.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://editor.openeo.cloud"),t("OutboundLink")],1),e._v(' 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.')]),e._v(" "),t("p",[e._v('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 '),t("RouterLink",{attrs:{to:"/join/free_tier.html"}},[e._v("Free Tier")]),e._v(" or the "),t("a",{attrs:{href:"https://openeo.cloud/#plans",target:"_blank",rel:"noopener noreferrer"}},[e._v("available plans"),t("OutboundLink")],1),e._v(" for more details on the procedure to register and log in.")],1),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("p",[e._v('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.')])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/72.c90aabf1.js b/assets/js/72.9a45fb61.js similarity index 99% rename from assets/js/72.c90aabf1.js rename to assets/js/72.9a45fb61.js index c30ba6cb7..d1194f9ae 100644 --- a/assets/js/72.c90aabf1.js +++ b/assets/js/72.9a45fb61.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],{577: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.6dd217af.js b/assets/js/73.1badaee0.js similarity index 98% rename from assets/js/73.6dd217af.js rename to assets/js/73.1badaee0.js index 629271325..32856f1b6 100644 --- a/assets/js/73.6dd217af.js +++ b/assets/js/73.1badaee0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{581: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/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/77.5a6fee3e.js b/assets/js/77.3203cab1.js similarity index 79% rename from assets/js/77.5a6fee3e.js rename to assets/js/77.3203cab1.js index 791cf5b94..684e8fd88 100644 --- a/assets/js/77.5a6fee3e.js +++ b/assets/js/77.3203cab1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{583: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/app.8c0e1ada.js b/assets/js/app.b0297558.js similarity index 91% rename from assets/js/app.8c0e1ada.js rename to assets/js/app.b0297558.js index c104dd4a1..46560a330 100644 --- a/assets/js/app.8c0e1ada.js +++ b/assets/js/app.b0297558.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-700f1b88":()=>n.e(68).then(n.bind(null,571)),"v-688ffb43":()=>n.e(67).then(n.bind(null,572)),"v-78536523":()=>n.e(58).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-23074efc":()=>n.e(74).then(n.bind(null,579)),"v-6b6d7bae":()=>n.e(75).then(n.bind(null,580)),"v-779fe818":()=>n.e(73).then(n.bind(null,581)),"v-a5deb388":()=>n.e(76).then(n.bind(null,582)),"v-02b9217c":()=>n.e(77).then(n.bind(null,583)),"v-2ac201a4":()=>n.e(37).then(n.bind(null,584)),"v-a1f70a7a":()=>n.e(52).then(n.bind(null,585)),"v-d4caec3c":()=>n.e(78).then(n.bind(null,586)),"v-0937d47a":()=>n.e(79).then(n.bind(null,587)),"v-c5fcf990":()=>n.e(80).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-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-78536523",path:"/federation/backends/processes.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-78536523").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-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-6b6d7bae",path:"/getting-started/python/shiny.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-6b6d7bae").then(n)}},{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-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-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-a1f70a7a",path:"/join/free_trial.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-a1f70a7a").then(n)}},{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-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-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-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:"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},{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},{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 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:"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 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 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},{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:"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:"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:"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 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:"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-700f1b88":()=>n.e(68).then(n.bind(null,570)),"v-3e291b63":()=>n.e(66).then(n.bind(null,571)),"v-688ffb43":()=>n.e(67).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-974804cc":()=>n.e(72).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-adb4d3cc":()=>n.e(71).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-d4caec3c":()=>n.e(78).then(n.bind(null,586)),"v-0937d47a":()=>n.e(79).then(n.bind(null,587)),"v-c5fcf990":()=>n.e(80).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-ddb09444":()=>n.e(53).then(n.bind(null,591)),"v-2b5b0ed8":()=>n.e(54).then(n.bind(null,592)),"v-4a7f74ac":()=>n.e(55).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-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-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-3e291b63",path:"/federation/backends/collections.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-3e291b63").then(n)}},{name:"v-688ffb43",path:"/federation/backends/fileformats.html",component:Lt,beforeEnter:(e,t,n)=>{pt("Layout","v-688ffb43").then(n)}},{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-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-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-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-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-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-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-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-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-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-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-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:"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:"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:"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:"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:"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 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:"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 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:"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 (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:"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 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:"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:"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:"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:"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("Badge",()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,564))),r.a.component("CodeBlock",()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,554))),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 2895e162b..cbb1d59a5 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 6de07e8c5..bb3966caf 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 a64cadcc0..d02fd3396 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 6a6d1dffa..f0f01b654 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 c49152618..0b862947d 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 781c949a8..18f7546c5 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 8f7f884f6..4f658acdc 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 470ddc1a7..91f2b4dc9 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 aacf7fb01..757ae41de 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 32bdca6fd..7f005c320 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 001380dd1..08f104350 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 c7c5626a3..eb91620c9 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 e87f2e3ed..534d407fb 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 0935eae24..52fa3b0b9 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 8bd4d38a8..031b9a098 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 f903527c0..0c02ca7b9 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 0b287ffe3..9a380625b 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 87a824cfc..b6512d9da 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 c8fc66032..3d41e406e 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 cad68fb49..a59e1fe4d 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 bb38495b4..b3bc694a2 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 4c65b0db3..3dd54ad47 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 0b9cd0902..cd13e26dd 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 ca580f675..9008f7a3c 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 816aed44d..e8ac54492 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 8aa4b2ddd..25679cc4c 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 4e5c6b987..1d3359087 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 018d38fcd..6410af486 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 5fceb7de8..04f07076a 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 50c53ecf3..5eeb3d85e 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 6f11018ef..7dea2b71f 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 5a40af60b..ff2f3c77e 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.
    - +