library(openeo)
# connect to the backend and authenticate
connection = connect(host = "https://openeofed.dataspace.copernicus.eu")
login()
# get the process collection to use the predefined processes of the back-end
p = processes()OpenEO data
OpenEO
OpenEO est un package R qui permet d’obtenir les données Earth Observation. Afin d’accéder à ces données, il est nécéssaire de se connecter. Ici il faut donc avoir un compte Copernicus. Le lien de documentation d’utilisation : https://documentation.dataspace.copernicus.eu/APIs/openEO/R_Client/R.html
Données DEM30
Pour récupérer les données d’élévation Copernicus DEM30, il faut délimiter notre loi. Afin de récupérer le bounding box de Mayotte, j’ai récupérer les coordonnées ici : http://bboxfinder.com/#0.000000,0.000000,0.000000,0.000000
data = p$load_collection(id = 'COPERNICUS_30',
spatial_extent = list(west=44.98,
south=-13.01,
east=45.30,
north=-12.61),
bands = c("DEM"))Ensuite, on peut sauver nos données dans le format souhaité et l’enregistrer en local.
result = p$save_result(data = data, format = "GTiff")
# save the tif file
compute_result(graph = result, output_file = "/home/abiton/Documents/dem_data/dem_mayotte.tif")Données Sentinel
Pour récupérer les données de végétation, on utilise le même principe mais avec une dimension temporelle en plus. Les données à utiliser pour calculer le NDVI sont les bandes 8 et 4 des données Sentinel L2A. Dans mon cas, je cherche à avoir le NDVI avant le cyclone CHIDO et le NDVI après le cyclone donc je dois récupérer à deux temporalités différentes.
bbox = list(west=44.98, south=-13.01, east=45.30, north=-12.61)
dossier_out = "/home/abiton/Documents/dem_data"
# function to compute ndvi
get_ndvi_period = function(start_date, end_date, filename) {
# charge data
data = p$load_collection(
id = "SENTINEL2_L2A",
spatial_extent = bbox,
temporal_extent = list(start_date, end_date),
bands = c("B08","B04"),
properties = list("eo:cloud_cover" = function(x) x <= 30)
# gerer les nuages avec cloud_cover, garde que moins de 30% nuages
)
# compute ndvi
# ndvi_cube = p$ndvi(data = data, nir = "B08", red = "B04")
#manually compute ndvi
spectral_reduce = p$reduce_dimension(data = data, dimension = "bands",reducer = function(data,context) {
b8 = data[1] #nir
b4 = data[2] #red
return((b8-b4)/(b8+b4))
})
temporal_reduce = p$reduce_dimension(data=spectral_reduce,dimension = "t", reducer = function(x,y){
p$median(x)
})
# save data
result = p$save_result(data = temporal_reduce, format = "GTiff")
compute_result(graph = result, output_file = file.path(dossier_out, filename))
}
# for chido, need to find dates without to much clouds
# before chido
get_ndvi_period("2024-10-22", "2024-12-10", "ndvi_avant_chido.tif")
# after chido
get_ndvi_period("2025-01-01", "2025-03-15", "ndvi_apres_chido.tif")Afin de gérer les nuages, il y a l’option cloud_cover, définit ici à 30%. Seules les données avec 30% ou moins de nuages sont gardées. On obtient donc des données de végétation avant-après Chido.

Tests métriques
Dans la fonction utilisée, j’ai utilisé la métrique mediane, mais il y a d’autres métriques tel que le max, le min, le median et le mean.
Voici les différences de visualisations du NDVI pour le même intervalle de temps pour chaque métrique. L’intervalle de temps ici est pour la période :
- avant CHIDO : 2024-10-22 2024-12-10
- après CHIDO : 2025-01-01, 2025-03-15


Au vu de ces résultats pour ces intervalles de temps, le moins pertinent serait de prendre la valeur minimale pour visualiser la végétation car c’est surement la valeur capté au travers d’un nuage et est non représentative ed la réelle végétation de Mayotte. Les valeurs les plus pertinentes seraient la valeur max pour estimer correctement la végétation réelle captée par Sentinel. C’est la visualisation avec le moins l’effet des nuages. Cependant, on voit les démarcations des tuiles ici.
Les valeurs médianes et moyennes sont pertinentes mais peuvent être impactées par la présence de nuages et ainsi retranscrire une mauvaise détection du réel indice NDVI en tout points.