4 Les collections d’images dans GEE
Collections d’images
L’une des caractéristiques les plus puissantes de GEE est sa capacité de calcul en nuage ; vous pouvez traiter de nombreuses données simultanément.
Jusqu’à présent, nous avons eu une introduction rapide au travail avec des images individuelles dans GEE. Avec l’aide des ressources de Google, nous pouvons travailler avec une collection d’images. Nous aurons ainsi l’avantage d’accéder à toutes les données disponibles gratuitement dans GEE.
Par exemple, il existe la collection d’images Landsat-9. Dans la boîte de recherche, tapez « Landsat 9« , et vous avez alors deux options pour importer la collection d’images dans l’éditeur de code :
- Cliquez sur le « import » à côté de « USGS Landsat 9 Level 2, Collection 2, Tier 2 » (Figure 42);
- Vous pouvez voir une brève description de la collection d’images en cliquant sur « USGS Landsat 9 Level 2, Collection 2, Tier 2« . Ici, vous pouvez importer la collection d’images en copiant le « Collection Snippet » et en le collant dans l’éditeur de code ou en cliquant sur le bouton IMPORT dans le coin inférieur droit (Figure 43).
Donc après avoir chargé la collection d’images de « Landsat-9 Level 2, Collection 2, Tier 2« , votre éditeur de code ressemblerait à ceci (Figure 44) :
Comme vous le remarquez, la commande clé pour utiliser les collections d’images est ee.ImageCollection. Comme il est possible de le voir dans l’image précédente, il y a une erreur dans la Console causée par print(landsat9);, ce qui nous indique que GEE n’est pas en mesure de traiter plus de 5000 images simultanément. Un autre point critique est que, compte tenu de la collection massive d’images Landsat-9, il n’est pas possible de les visualiser en un seul affichage. Par conséquent, à la visualisation nous ne voyons seulement que les scènes les plus récentes prises par le satellite. Pour éviter l’erreur susmentionnée et être en mesure de traiter une grande quantité de données, nous devons réduire le nombre d’images existantes dans la collection en appliquant certains filtres.
Créer une mosaïque à partir d’une collection d’images
La création d’une mosaïque d’images est réalisée en utilisant une collection, puis en y appliquant une série de filtres spatiaux ou temporels afin de contraindre les images utilisées à répondre aux attentes de l’analyste.
L’exemple ci-dessous montre un mosaïque d’images Landsat-8 sur la région de Montréal entre les 1er et 18 mai 2022 (Figure 45). Comme vous pouvez l’observer, les images Landsat sont sujettes à la couverture nuageuse et la création d’une mosaïque ave GEE n’est pas garante d’une image 100% dégagée. C’est pourquoi nous verrons dans les prochaines sections, les méthodes à privilégier pour appliquer certains filtres spécifiques afin d’optimiser les images utilisées pour la mosaïque.
Filtrer une collection d’images
Si, dans le panneau de gauche de l’onglet « Docs », vous ouvrez le filtre ee.Filter, vous verrez de nombreux types de filtres différents que vous pouvez appliquer à vos données pour obtenir l’image que vous souhaitez (Figure 46).
Les filtres temporels
- ee.Filter.date(start, end)
Filtre une collection par plage de dates.
start(Date |Nombre| Chaîne) : La date de début (inclusive).
end(Date |Numéro| Chaîne, optionnel) : La date de fin (exclusive).// Le filtre renverra les images acquises entre le 1er novembre 2020 et le 1er novembre 2022.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’)
.filter(ee.Filter.date(‘2020-11-01’, ‘2022-11-01’));
- ee.Filter.calendarRange(start, end, champ)
Renvoie un filtre qui passe si l’horodatage de l’objet se situe dans la plage donnée d’un champ du calendrier.
start(Integer) : La date de début de la période souhaitée (inclus).
end(Integer, default : null) : La fin de la période souhaitée (inclus).
field(String, default : « day_of_year ») : L’unité de mesure de la période. Les options sont : année, mois, heure, minute, jour de l’année, jour du mois et jour de la semaine.// Le premier filtre renvoie les images entre 2020 et 2022 et le second filtre s’assure que nous avons au moins une image de chaque mois.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’)
.filter(ee.Filter.calendarRange(2020, 2022,‘year’))
.filter(ee.Filter.calendarRange(1, 12,‘month’));
- ee.Filter.dayOfYear(start, end)
Renvoie un filtre qui passe si l’horodatage de l’objet se situe dans la plage de jours de l’année donnée.
start(Integer) : Le début de la plage de jours souhaitée (inclusivement).
end(Integer) : La fin de la plage de jours souhaitée (inclusivement).// Le filtre retournera les images entre 7 jours avant le 21 août (DOY 233) et 7 jours après.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’)
.filter(ee.Filter.dayOfYear(233 – 7, 233 + 7));
- ee.Filter.dateRangeContains(leftField, rightValue, rightField, leftValue)
Crée un filtre unaire ou binaire qui passe si l’opérande de gauche, une plage de dates, contient l’opérande de droite, une date.
leftField(String, default : null) : Un sélecteur pour l’opérande gauche. Il ne doit pas être spécifié si leftValue est spécifié.
rightValue(Object, default : null) : La valeur de l’opérandede droite. Elle ne doit pas être spécifiée si rightField est spécifié.
rightField(String, default : null) : Un sélecteur pour l’opérande de droite. Il ne doit pas être spécifié si rightValue est spécifié.
leftValue(Object, default : null) : La valeur de l’opérande gauche. Elle ne doit pas être spécifiée si leftField est spécifié.// Le filtre retournera les images dont la date d’acquisition est égale à 2021-08-03.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’)
.filter(ee.Filter.dateRangeContains(null, null, ‘DATE_ACQUIRED’, ee.DateRange(‘2021-08-03’)));
// Le filtre renvoie les images dont la date d’acquisition est comprise entre le 2018-01-01 et le 2018-05-01.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’)
.filter(ee.Filter.dateRangeContains(null, null, ‘DATE_ACQUIRED’, ee.DateRange(‘2018-01-01’, ‘2018-05-01’)));
Astuce
Si vous souhaitez reculer ou avancer dans le temps en fonction d’une date spécifique, vous devez utiliser ee.Date.advance pour cela. Nous vous montrons comment cela fonctionne à travers un exemple (Figure 47) :
Les filtres spatiaux
Avant d’expliquer le fonctionnement des filtres spatiaux, nous devons savoir comment créer une géométrie et définir la région d’intérêt (ROI).
La création d’une région d’intérêt (ROI)
Avec les outils de géométrie
Afin d’importer des géométries dans votre script, vous pouvez les dessiner à l’écran. Pour créer des géométries, utilisez les outils de dessin de géométrie dans le coin supérieur gauche de l’affichage de la carte. Pour dessiner des points, utilisez l’icône de point de repère , pour dessiner des lignes, utilisez l’icône de ligne , pour dessiner des polygones, utilisez l’icône de polygone , pour dessiner des rectangles, utilisez l’icône de rectangle . Pour configurer les géométries importées dans votre script, cliquez sur l’icône , dans la section « Imports » de l’éditeur de code (Figure 48).
Les entités géométriques et les collections d’entités géométriques
Les entités géométriques dotées d’attributs sont des objets Feature. Dans Earth Engine, une entité est déclinée sous la forme d’un fichier GeoJSON. GeoJSON est un format permettant d’encoder une variété de structures de données géographiques. Les collections d’entités sont stockées dans les objets FeatureCollection.
// Création d’une Feature Collection à partir d’une liste d’entités
var features = [
ee.Feature(ee.Geometry.Rectangle(30.01, 59.80, 30.59, 60.15), {name: ‘Voronoi’}),
ee.Feature(ee.Geometry.Point(-73.96, 40.781), {name: ‘Thiessen’}),
ee.Feature(ee.Geometry.Point(6.4806, 50.8012), {name: ‘Dirichlet’})
];
var fromList = ee.FeatureCollection(features);
print(fromList);
Le résultat de l’exécution du code ci-dessus génère le résultat suivant (Figure 49):
Earth Engine héberge une variété de jeux de données tabulaires pouvant être utilisés comme FeatureCollection. Pour charger un ensemble de données tabulaires, fournissez l’ID de la table au constructeur de FeatureCollection.
Par exemple, pour charger les données de la Frontière internationale à grande échelle (LSIB) (Figure 50) :
Une autre méthode utile de FeatureCollection est que vous pouvez créer une collection de points aléatoires dans une région spécifiée (Figure 51). Par exemple, cela pourrait nous être utile lorsque nous voulons rassembler des données d’entrainement pour former un algorithme d’apprentissage automatique; cela pourrait réduire considérablement le temps de préparation des données d’entraînement (nous aborderons ces sujets dans les sections suivantes).
Lire un fichier externe comme entité géométrique ou collection d’entités géométriques
Pour télécharger et gérer des ensembles de données géospatiales, utilisez le gestionnaire de ressources dans l’éditeur de code. Le gestionnaire d’actifs se trouve dans l’onglet « Assets », sur le côté gauche de l’éditeur de code (Figure 52).
Astuce
Pour télécharger un fichier « Shapefile » à partir de l’éditeur de code, cliquez sur le bouton , puis sélectionnez « Shape files » dans la section « Table Upload ». Une boîte de dialogue de téléchargement similaire à la figure ci-dessous s’affichera (Figure 53).
Cliquez sur le bouton « SELECT » et naviguez vers un fichier Shapefile ou une archive Zip contenant un fichier Shapefile sur votre système de fichiers local. Donnez au tableau un ID « asset » approprié (qui n’existe pas déjà) dans votre dossier utilisateur. Cliquez sur « UPLOAD » pour lancer le téléchargement.
Après avoir lancé le téléchargement d’une table, une tâche d’ingestion de ressources est ajoutée au Gestionnaire de tâches, qui se trouve sous l’onglet « Tâches » à droite de l’éditeur de code. Une fois l’ingestion terminée, la cellule de la tâche devient bleue et le bien apparaît dans votre dossier utilisateur sous l’onglet « Assets » avec une icône .
Vous pouvez importer une ressource dans votre script en passant la souris sur le nom de la ressource dans le gestionnaire de ressources et en cliquant sur l’icône . Si vous cliquez sur le nom de la ressource, une boîte de dialogue contenant la description de la ressource apparaît. Vous pouvez également copier l’ID de la ressource dans un constructeur tel que Image, ImageCollection ou FeatureCollection.
var image = ee.Image(‘users/username/your_asset);
Créer une géométrie GeoJSON dans un script GEE
Pour commencer, vous devez copier-coller la chaîne GeoJSON dans son intégralité. Le reste du script analyse les caractéristiques, puis les renvoie lorsque la fonction est appelée depuis le script principal.
Pour la première partie, le script qui contient et analyse le fichier GeoJSON est présenté ci-dessous. Vous devez juste effacer le « // Coller la géométrie GeoJSON ici // » et coller votre fichier GeoJSON à la place.
var geojson =
// Coller la géométrie GeoJSON ici //
function fromGeoJSON(geojson) {var features = ee.FeatureCollection(geojson.features)
Object.keys(geojson).map(function(p) {if(p == ‘type’ || p == ‘features’) {return}
features = features.set(p, geojson[p])})
return features
}
var features = fromGeoJSON(geojson)
Map.addLayer(features)
Dans un exemple réel du Québec, nous avons créé une géométrie à partir du fichier GeoJSON contenant les polygones délimitant les bois de l’agglomération de Montréal (Figure 54). Vous pouvez accéder à ce fichier à partir d’ici.
La prise en compte de la topologie
Après avoir appris les moyens de créer les régions d’intérêt (ROI), il est temps d’aller de l’avant et d’apprendre à filtrer les collections d’images en les utilisant.
- ee.Filter.bounds(geometry, errorMargin)
Crée un filtre qui passe si la géométrie de l’objet intersecte la géométrie donnée.
Géométrie (ComputedObject|FeatureCollection|Geometry) : La géométrie, l’élément ou la collection à intersecter.
errorMargin (ComputedObject|Number, facultatif) : Une marge d’erreur facultative. S’il s’agit d’un nombre, il est interprété comme des mètres.// Ce filtre va retourner les images qui seront en intersection avec la géométrie.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’)
.filter(ee.Filter. bounds(geometry));
Attention
Ce filtre renverra toute image qui a une intersection avec la géométrie que vous avez définie. Par conséquent, il ne couvre pas nécessairement tout le ROI.Ainsi, si nous voulons que la collection d’images renvoyée comprenne des images qui couvrent la totalité du ROI, nous devons utiliser le filtre suivant :
- ee.Filter.contains(leftField, rightValue, rightField, leftValue, maxError)
Crée un filtre unaire ou binaire qui passe si la géométrie de gauche contient la géométrie de droite (les géométries vides ne sont contenues dans rien).
leftField (Chaîne, par défaut : null) : Un sélecteur pour l’opérande gauche. Ne doit pas être spécifié si leftValue est spécifié.
rightValue (Object, default : null) : La valeur de l’opérande de droite. Ne doit pas être spécifié si rightField est spécifié.
rightField (String, default : null) : Un sélecteur pour l’opérande de droite. Ne doit pas être spécifié si rightValue est spécifié.
leftValue (Object, default : null) : La valeur de l’opérande gauche. Ne doit pas être spécifié si leftField est spécifié.
maxError (ErrorMargin, facultatif) : L’erreur maximale de reprojection autorisée pendant l’application du filtre.// Ce filtre va retourner les images qui couvrent entièrement la géométrie.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’)
.filter(ee.Filter. contains(‘.geo’, geometry));
Attention
Le filtre retournera les images qui couvrent toute la géométrie. La propriété ‘.geo‘ doit être incluse pour comparer les géométries des objets (Figure 55).Et si nous souhaitons extraire une partie spécifique de l’image, telle que définie par une entité géométrique ? La fonction clip, présentée ci-dessous peut nous aider.
- .clip(geometry)
Découpe une image sur une géométrie ou un objet.
geometry (Feature|Geometry|Object) : La géométrie ou l’entité à découper.Astuce
Cette méthode fonctionne sur une seule image, donc si vous voulez l’essayer avec une collection d’images, tout ce que vous avez à faire est de créer une fonction de découpage et de la faire correspondre à la collection d’images ; ainsi, elle passera par toutes les images et les découpera une par une (Figure 56).Pour couper une collection d’images par une collection d’éléments au lieu d’un seul élément géométrique, il suffit de remplacer la méthode .clip par la méthode .clipToCollection comme dans la figure suivante (Figure 57).
Filtrer les nuages
Lorsque nous utilisons l’imagerie optique, l’un des problèmes les plus apparents est celui des nuages. Dans cette partie, nous allons donc apprendre à filtrer les images avec des nuages en utilisant les propriétés de l’image (Figures 58 et 59).
Comment parvenir à filtrer les images en utilisant ces propriétés précalculées par les fournisseurs d’images ? Trois avenues s’offrent à nous :
- ee.Filter.lt(nom, opérateur, valeur)
Filtre sur les métadonnées afin d’identifier les images pour lesquelles la valeur est plus basse que la valeur seuil donnée.
name (Chaîne) : Le nom de la propriété sur laquelle le filtre doit porter.
value (Object) : La valeur seuil à comparer.
OU
ee.Filter.LessThan(leftField, rightValue, rightField, leftValue)
Crée un filtre unaire ou binaire qui passe si l’opérande gauche est inférieur à l’opérande droit.
leftField(String, default : null) : Un sélecteur pour l’opérande gauche. Ne doit pas être spécifié si leftValue est spécifié.
rightValue(Object, default : null) : La valeur de l’opérande de droite. Ne doit pas être spécifié si rightField est spécifié.
rightField(String, default : null) : Un sélecteur pour l’opérande de droite. Ne doit pas être spécifié si rightValue est spécifié.
leftValue(Object, default : null) : La valeur de l’opérande gauche. Ne doit pas être spécifié si leftField est spécifié.// Pour les images Landsat-8
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’).filter(ee.Filter. lt(‘CLOUD_COVER’, 10));
// ou
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’).filter(ee.Filter.lessThan(‘CLOUD_COVER’, 10));
// Pour les images Sentinel-2
var landsat8 = ee.ImageCollection(‘COPERNICUS/S2_SR’).filter(ee.Filter. lt(‘CLOUDY_PIXEL_PERCENTAGE’, 10));
// ou
var landsat8 = ee.ImageCollection(‘COPERNICUS/S2_SR’).filter(ee.Filter.lessThan(‘CLOUDY_PIXEL_PERCENTAGE’, 10));
Astuce
Vous pouvez utiliser ces types de filtres (greaterThan, greaterThanOrEquals, gt, gte, lessThanOrEquals, lte, neq, notEquals, and, or, eq, equals) pour filtrer tout type de métadonnées telles que l’orbite et la rangée des images (‘WRS_PATH’, ‘WRS_ROW’).Astuce
Vous pouvez utiliser ‘CLOUD_COVER_LAND’ pour filtrer les nuages dans les images Landsat. Cette statistique porte uniquement sur la proportion de nuages détectée aux endroits où il n’y a pas d’eau. - .sort(propriété, ascending)
Trie une collection en fonction de la propriété spécifiée.
propriété (Chaîne) : La propriété à trier.
ascending (booléen, facultatif) : Indique si le tri doit être effectué par ordre croissant ou décroissant. La valeur par défaut est true (ascendant).
// The filter will return images which have the least cloud coverage.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’). sort(‘CLOUD_COVER’)).first();
Et si l’on souhaite obtenir les dix images avec le moins de couvert nuageux ?
Voici comment s’y prendre :var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’).sort(‘CLOUD_COVER’, false).limit(10);
// Pour les images Sentinel-2 il suffit de remplacer ‘CLOUD_COVER’ avec ‘CLOUDY_PIXEL_PERCENTAGE’.
- .median()
Réduit une collection d’images en calculant la médiane de toutes les valeurs à chaque pixel à travers la pile de toutes les bandes correspondantes. Cela a l’avantage de supprimer les nuages (qui ont une valeur élevée) et les ombres (qui ont une valeur faible). Les bandes sont appariées par nom.// Le filtre renvoie une image dont chaque pixel est la valeur médiane pour chaque bande.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’).median();
Astuce
La médiane renvoie une seule image, et non une collection d’images. Elle est principalement utilisée à des fins de visualisation et pour créer une mosaïque sans nuage de collections d’images.Astuce
Plus la plage de temps utilisée dans le filtrage temporel est longue, moins l’image médiane sera nuageuse.Attention
Il existe de nombreux autres réducteurs que vous pouvez utiliser sur votre collection d’images, tels que sum, max, min, mean, etc. Par exemple, sum réduit une collection d’images en calculant la somme de toutes les valeurs à chaque pixel à travers la pile de toutes les bandes correspondantes.
Masquer les nuages
Dans cette section, nous divisons le masquage des nuages en trois parties pour une meilleure compréhension et aussi pour être spécifique aux données. Il faut différencier le fait de filtrer la collection versus le fait de détecter et masquer les nuages dans une image.
Attention
Sur l’imagerie Landsat
ee.Algorithms.Landsat.simpleCloudScore(image)
Calcule un score simple de probabilité de nuage dans la plage [0, 100] en utilisant une combinaison de luminosité, de température et de NDSI. Selon cette méthode, si un pixel a un score de nuages de 100, cela signifie que le pixel est couvert par des nuages avec une probabilité de 100 %. L’image utilisée doit être une image TOA (Top of the atmosphere, soit exoatmosphérique) et non une image radiométriquement corrigée.
Dans l’exemple ci-dessous, nous spécifions un pourcentage maximum pour les pixels nuageux de 10%. Ensuite, nous écrivons une fonction qui calcule le score de nuage pour chaque pixel de l’image et, en fonction du seuil que nous avons défini, elle renvoie uniquement les pixels dont le pourcentage de nuage est inférieur au seuil établi. La dernière étape de la fonction consiste à mettre à jour l’image originale et à masquer les pixels reconnus comme nuageux en utilisant updateMask et en lui passant le masque déjà créé. Ensuite, nous utilisons map pour exécuter la fonction que nous avons définie sur une collection d’images (Figure 61). Nous conservons toujours la ROI sur Montréal des scripts précédents.
var max_pixel_percentage = 10;
var cloudless = function (image){
var cloud_score = ee.Algorithms.Landsat.simpleCloudScore(image);
var mask = cloud_score.select([‘cloud’]).lt(max_pixel_percentage);
var masked = image.updateMask(mask);
return masked;
};
var cloudy_l8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_TOA’).filter(ee.Filter.bounds(montreal)).filter(ee.Filter.date(‘2019-01-01’, ‘2021-01-01’));
var cloudmasked_l8 = cloudy_l8.map(cloudless);
var vis = {‘bands’: [‘B4’,‘B3’, ‘B2’], ‘min’:0.04, ‘max’:0.17};
Map.addLayer(cloudy_l8.median(), vis, ‘Landsat-8 Image Collection Median (Cloudy)’);
Map.addLayer(cloudmasked_l8.median(), vis, ‘Landsat-8 Image Collection Median (Cloud Masked)’);
// Dans les lignes ci-dessous nous compilons une liste des cinq premières images de la collection et utilisons la cinquième pour la visualisation. Notez qu’il faut préalablement utiliser ee.Image() afin de la convertir en image GEE pour l’affichage.
Map.addLayer(ee.Image(cloudy_l8.toList(5).get(4)), vis, ‘Landsat-8 Image (Cloudy)’);
Map.addLayer(ee.Image(cloudmasked_l8.toList(5).get(4)), vis, ‘Landsat-8 Image (Cloud Masked)’);
Sur l’imagerie Sentinel-2
Afin de masquer les nuages dans les images Sentinel-2, nous utilisons un autre jeu de données disponible gratuitement dans GEE appelé « Sentinel-2 : Cloud Probability« .
L’exemple ci-dessous présente l’approche sur la région de Québec (Figure 62).
var s2_cloudProbe = ee.ImageCollection(‘COPERNICUS/S2_CLOUD_PROBABILITY’).filter(ee.Filter.bounds(quebec)).filter(ee.Filter.date(‘2019-05-01’, ‘2021-01-01’));
var s2_toa = ee.ImageCollection(‘COPERNICUS/S2’).filter(ee.Filter.bounds(quebec)).filter(ee.Filter.date(‘2019-05-01’, ‘2021-01-01’));
var max_pixel_percentage = 20;
// Les deux collections d’images proviennent de l’imagerie Sentinel-2, ce qui signifie que nous pouvons trouver les mêmes identifiants d’images pour une mesure spécifique du temps. La fonction ‘maskClouds’ prendra chaque image de la collection ‘Sentinel-2 : Cloud Probability’ et filtrera les images de la collection d’images TOA (Top of Atmosphere) sur la base de leur propriété ‘system:index’ qui indique les identifiants des images.
var maskClouds = function (image){
var mask = s2_cloudProbe.filter(ee.Filter.equals({leftField: ‘system:index’, rightValue: image.get(‘system:index’)})).first();
return image.updateMask(mask.gt(max_pixel_percentage).not());
}
var s2CloudMasked = s2_toa.map(maskClouds);
Méthode générale
Pour masquer les nuages avec une approche plus « générale », vous pouvez utiliser le masque binaire créé sur la base de la « bande d’évaluation de la qualité » (QA) dans le jeu de données. Cette approche n’est pas limité à l’imagerie Landsat ou Sentinel-2. L’autre avantage d’apprendre cette méthode générale est que vous serez également en mesure de masquer l’ombre des nuages, la neige, l’eau, etc.
Tout d’abord, nous devons savoir comment trouver cette bande dans les ensembles de données. La bande d’évaluation de la qualité (QA) porte des noms différents selon le jeu de données. Quelques exemples sont présentés dans les figures suivantes (Figure 63, 64 et 65).
Les exemples suivants présentent l’approche à prendre pour masquer les nuages en utilisant la bande QA, d’abord par un exemple facile à comprendre avec l’imagerie Landsat-5, puis nous passons à un niveau supérieur en utilisant l’imagerie MODIS.
- Exemple avec Landsat-5 (Figure 66)
var maskout_func = function(image){
// Tout d’abord, consultez les gammes de bits dans les catalogues. Comme vous pouvez le voir sur les figures précédentes, les nuages et les ombres des nuage sont respectivement dans les bits 3 et 4. La fonction ‘bitwiseAnd’ extrait les bits spécifiques du masque de bits (QA).
var qa = image.select(‘QA_PIXEL’);
var cloud = qa.bitwiseAnd(1<<3);
var cloud_shadow = qa.bitwiseAnd(1<<4);
// Le « 0 » dans un masque représente les pixels que nous voulons masquer. Ainsi, lorsque nous utilisons ‘neq’ (c’est-à-dire non égal) pour les valeurs 0, nous obtenons les pixels ayant la valeur 1. La fonction ‘or’ fonctionne comme un opérateur d’union. Cela signifie que si l’une des conditions est vraie, elle sera retournée comme sortie.
var mask = (cloud.neq(0)).or(cloud_shadow.neq(0));
return image.updateMask(mask.eq(0));};
var unmasked_l5 = ee.ImageCollection(‘LANDSAT/LT05/C02/T1_L2’).filter(ee.Filter.bounds(montreal)).filter(ee.Filter.date(‘2009-05-01’, ‘2011-01-01’));
var masked_l5 = unmasked_l5.map(maskout_func);
- Exemple avec MODIS
Cet exemple est un peu plus compliqué que le précédent bien qu’il ait une plus grande portée de généralisation et puisse être appliqué à n’importe quel ensemble de données ayant un masque binaire QA. Nous avons étendu nos méthodes de masquage des nuages à ce niveau car les masques de bits ne sont pas toujours identiques. Dans la figure suivante, on voit que les caractéristiques du masque QA de MODIS présente une gamme de bits pour le masquage des nuages et de leur ombre contrairement à Landsat-5 où pour les nuages l’on faisait directement appel aux bits 3 et 4 (Figures 67 et 68).// Nous utilisons une fonction utilitaire pour extraire des bits spécifiques du masque QA. Ce que nous avons ici est une plage de bits et ‘fromBit’ est le premier nombre de la plage et ‘toBit’ est le dernier nombre de la plage
function bitwiseExtract(value, fromBit, toBit) {
if (toBit === undefined) toBit = fromBit
var maskSize = ee.Number(1).add(toBit).subtract(fromBit)
var mask = ee.Number(1).leftShift(maskSize).subtract(1)
return value.rightShift(fromBit).bitwiseAnd(mask)}
function maskQuality(image) {
// Selectionner la bande QA
var QA = image.select(‘StateQA’);
// Ici, on peut spécifier le bit de départ et celui d’arrivée.
var cloud = bitwiseExtract(QA ,0 , 1);
var cloud_shadow = bitwiseExtract(QA ,2);
// Retourner une image masquée pour les ombres de nuages et les nuages
return image.updateMask(cloud.eq(0)).updateMask(cloud_shadow.eq(0));
}
var modis = ee.ImageCollection(‘MODIS/061/MOD09A1’).filterDate(‘2009-05-01′, ‘2011-01-01′).filterBounds(quebec);
var modis_masked = modis.map(maskQuality)
Astuce
Comme mentionné, vous pouvez appliquer cette méthode sur n’importe quel ensemble de données contenant la bande QA. Toutefois, dans l’imagerie Sentinel-2, si vous utilisez le masque binaire QA, le masque des nuages aura une résolution spatiale de 60 m, tandis que l’utilisation du jeu de données « Sentinel-2 Cloud Probability » vous donnera un masque des nuages de 10 m.
Pour une meilleure compréhension et plus d’explications sur les bitmasks et la façon de les utiliser pour masquer une image, vous pouvez consulter cette page (en anglais).
Autres transformations
- De la réflectance exoatmosphérique (TOA) de Sentinel-2 à la réflectance de surface (SR)
Comme vous le remarquez par la mise en évidence dans la figure ci-dessous (Figure 69), la réflectance de surface (SR) de l’imagerie Sentinel-2 (c’est-à-dire le niveau 2A) n’est pas produite pour le globe entier.Ainsi, nous utiliserons ici une technique développée par Yin et al. (2022) dans GEE pour convertir le TOA de Sentinel-2 en SR au cas où vous auriez besoin de ces données qui ne sont pas disponibles dans le catalogue de données de GEE (Figure 70).
// Notez l’importation du code de l’utilisateur « marcyinfeng »
var sr_func = require(‘users/marcyinfeng/utils:SIAC’);
var toa2sr = function(image){return sr_func.get_sur(image).multiply(10000).toInt();};
var s2_toa = ee.ImageCollection(‘COPERNICUS/S2’).filter(ee.Filter.bounds(montreal)).filter(ee.Filter.date(‘2019-05-01’, ‘2021-01-01’));
var s2_sr = s2_toa.map(toa2sr);
- De l’imagerie brute Landsat vers le composite TOA
L’exemple présenté ci-dessous permet de calculer un composite Landsat TOA à partir d’une collection de scènes Landsat brutes. Il applique un étalonnage TOA standard, puis attribue un score de nuages à chaque pixel à l’aide de l’algorithme SimpleLandsatCloudScore. Il sélectionne la gamme la plus basse possible de scores de nuages en chaque point, puis calcule les valeurs de percentile par bande à partir des pixels acceptés pour reconstituer un composite sans nuages (Figure 71).// L’intrant à la fonction « simpleComposite » est la donnée Landsat brute
var l8_filtered = ee.ImageCollection(‘LANDSAT/LC08/C02/T1’).filter(ee.Filter.bounds(montreal)).filter(ee.Filter.date(‘2019-05-01’, ‘2021-01-01’));
var viz1 = {bands:[‘B4’,‘B3’,‘B2’], min:4637, max:15346};
Map.addLayer(l8_filtered, viz1, ‘Landsat-8 Image Collection’);
// .
var composite = ee.Algorithms.Landsat.simpleComposite({
collection: l8_filtered,
asFloat: true
});
// Display a composite with a band combination chosen from: https://landsat.usgs.gov/how-do-landsat-8-band-combinations-differ-landsat-7-or-landsat-5 satellite-data
var viz2 = {bands: [‘B6’, ‘B5’, ‘B4’], max: [0.3, 0.4, 0.3]};
Map.addLayer(composite, viz2, ‘ee.Algorithms.Landsat.simpleComposite’);
Les « Reducers », ou réductions statistiques
Avec l’aide du calcul parallèle dans GEE, nous pouvons calculer des statistiques sur de grandes quantités de données en utilisant les reducer.
Les Reducers sur les collections d’images
Un reducer peut permettre, par exemple, de calculer la médiane d’une série chronologique d’images représentée par une collection d’images. Pour réduire une ImageCollection, utilisez imageCollection.reduce. Cela réduit la collection d’images à une image individuelle, comme illustré dans la figure qui suit (Figure 72).
Plus précisément, la sortie est calculée pixel par pixel, de sorte que chaque pixel de la sortie est composé de la valeur médiane de toutes les images collectées à cet endroit, comme dans la figure qui suit. Remarquez le suffixe s’étant ajouté au nom des bandes de l’image résultante (Figure 73).
Les reducers sur une image
L’application du reducer sur des images n’est pas différente des collections d’images, sauf que les bandes de l’image sont en entrée du reducer plutôt que les images de la collection. La sortie est également une image dont le nombre de bandes est égal au nombre de sorties du reducer.
Par exemple, pour calculer le maximum pour les bandes RVB sélectionnées d’une imagerie Landsat-8, on peut utiliser le reducer. Comme on peut le remarquer dans la figure suivante (Figure 74), contrairement au cas de la collection d’images, le reducer ne renvoie qu’une bande pour les valeurs maximales des pixels parmi les trois bandes RVB.
Les reducers sur une région, l’équivalent de statistiques zonales
Pour obtenir des statistiques sur les valeurs des pixels dans une région d’une image, utilisez la méthode reduceRegion.
Voici une représentation schématique de cette méthode (Figure 75).
Il est possible de traiter l’entièreté de l’image comme étant une région. Dans ce cas, l’algorithme nous fournira la valeur calculée pour toute la bande, par exemple la moyenne de chaque bande, tel que présenté dans l’image ci-dessous (Figure 76).
Cependant, l’utilité principale de la fonction reduceRegion est bien sur d’utiliser des géométries prédéfinies afin d’extraire des statistiques zonales propres à chacune des régions. Pour se faire, il faut ajouter un attribut « geometry » dans la fonction reduceRegion qui pointe vers la featureCollection d’intérêt (Figure 77).
Combiner les reducers
Si vous souhaitez effectuer plus d’un calcul statistique, vous devez utiliser plusieurs réducteurs imbriqués. L’exemple présenté dans la figure ci-dessous démontre comment combiner plusieurs réducteurs et les appliquer sur une image (Figure 78). Il existe une large gamme de reducer, pour en savoir plus, recherchez ee.Reducer dans « Docs ».
Production de graphiques
Dans cette section, l’objectif est de dessiner des graphiques à partir des données produites par nos codes. Chaque fonction accepte un type de données spécifique et comprend des méthodes permettant de réduire les données au format tabulaire selon différentes dispositions.
-
ui.Chart.image.series
Avec cette méthode, la date de l’image est tracée sur l’axe des x en fonction de la propriété system:time_start. Les bandes d’images définissent les séries. Les valeurs de l’axe des Y sont la réduction des images, par date, pour une seule région. La figure ci-dessous présente un résultat pour une série d’images avec les statistiques pour les bandes b1, b2 et b3 (Figure 78).Dans l’exemple qui suit, nous filtrons la collection d’images de réflectance de surface Landsat-8, puis nous calculons le NDVI pour chaque image de la collection. Nous dessinons ensuite un graphique basé sur la valeur moyenne des NDVI calculés dans une géométrie que nous avons définie précédemment. Pour le graphique, GEE prendra chaque NDVI et calculera la valeur moyenne des pixels NDVI à l’intérieur de la géométrie et retournera une seule valeur moyenne pour la région (Figure 79).
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’).filter(ee.Filter.date(‘2021-01-01’, ‘2022-01-01’)).filter(ee.Filter.bounds(geometry)).filter(ee.Filter.lessThan(‘CLOUD_COVER’, 20));
var ndvi = landsat8.map(function(image){var index = image.normalizedDifference([‘SR_B5’, ‘SR_B4’]);
return index.copyProperties(image, [‘system:time_start’]); // la propriété ‘system:time_start’est copié car elle est utilisée en axe X.
});
var chart = ui.Chart.image.series({imageCollection: ndvi, region: geometry, reducer: ee.Reducer.mean(),scale: 30, // résolution spatiale des images utilisées
xProperty: ‘system:time_start’});
print(chart);
-
ui.Chart.image.seriesByRegion
Cette fonction fonctionne comme la précédente mais avec une différence. Dans cette fonction, les séries sont définies par des régions. En utilisant cette méthode, vous devez rassembler toutes vos géométries sous forme de FeatureCollection et leur attribuer une étiquette (figure 80).Dans l’exemple suivant, nous avons une collection d’entités composée de quelques géométries définies sur des zones forestières et des terres cultivées dans le sud de la ville de Québec. Nous voulons mesurer la valeur moyenne dans ces deux classes et voir la différence NDVI dans le temps en dessinant un graphique utilisant les valeurs moyennes (Figure 81).
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’).filter(ee.Filter.date(‘2021-01-01’, ‘2022-01-01’)).filter(ee.Filter.bounds(geometry))
.filter(ee.Filter.lessThan(‘CLOUD_COVER’, 50));
var ndvi = landsat8.map(function(image){var index = image.normalizedDifference([‘SR_B5’, ‘SR_B4’]);return index.rename(‘NDVI’).copyProperties(image, [‘system:time_start’]); // Nous renommons la bande résultante NDVI afin d’être en mesure d’avoir cette information sur le graphique.
});
var regions = ee.FeatureCollection([ee.Feature(ee.Geometry(geometry1), {label: ‘forest’}), ee.Feature(ee.Geometry(geometry2), {label: ‘cropfield’})]);
var chart = ui.Chart.image.seriesByRegion({imageCollection: ndvi, regions: regions, reducer: ee.Reducer.mean(), band: ‘NDVI’,
scale:30, xProperty:‘system:time_start’, seriesProperty: ‘label’});
print(chart);
Astuce
Vous pouvez modifier le titre des axes et bien plus encore avec .setOptions. Il existe ici un guide très détaillé que vous pouvez utiliser pour personnaliser vos graphiques. L’exemple ci-dessous vous permet de voir comment il est possible d’ajuster les éléments d’affichage d’un graphique.
var chart = ui.Chart.image.seriesByRegion({imageCollection: ndvi, regions: regions, reducer: ee.Reducer.mean(), band: ‘NDVI’,
scale:30, xProperty:‘system:time_start’, seriesProperty: ‘label’})
.setOptions({title: ‘NDVI Mean Values For Forest and Cropfield’, hAxis: {title: ‘Date’, titleTextStyle: {italic: false, bold: true}},
vAxis: {title: ‘NDVI Mean Value’, titleTextStyle: {italic: false, bold: true}},});
Le résultat obtenu est le suivant (Figure 82) :
Exporter une image
Vous pouvez exporter les images de Earth Engine au format GeoTIFF ou TFRecord.
Vers Google Drive
Pour exporter une image vers Google Drive, utilisez la fonction Export.image.toDrive.
var landsat8 = ee.ImageCollection(‘LANDSAT/LC08/C02/T1_L2’).filter(ee.Filter.date(‘2021-01-01’, ‘2022-01-01’)).filter(ee.Filter.contains(‘.geo’, montreal.geometry()))
.filter(ee.Filter.lessThan(‘CLOUD_COVER’, 10));
var ndvi = landsat8.map(function(image){var index = image.normalizedDifference([‘SR_B5’, ‘SR_B4’]); return index.rename(‘NDVI’);});
Export.image.toDrive({
image: ndvi, //nom de la variable
description: ‘NDVI_Landsat-8’, // le nom que vous souhaitez pour votre données sur le Drive
folder: ‘GEE/EXPORT’, // Dossier sur votre Drive ou exporter l’image
region: montreal, scale: 30,
crs: ‘EPSG: 4326’, // CRS de sortie (Système de coordonnées)
maxPixels: 1e13, // Paramètre impliquant un nombre maximal de pixel en sortie, principalement pour la gestion de mémoire (ajuster au besoin).
});
Après avoir cliqué sur le bouton « Run », vous verrez une nouvelle tâche apparaître dans l’onglet du gestionnaire de tâches sur le côté droit de votre éditeur de code (Figure 83).
Une fenêtre de confirmation s’affiche si vous cliquez sur le bouton « Run » (Figure 84).
Vous devez alors cliquer sur le bouton « Run » dans la fenêtre qui s’affiche, et le processus d’exportation commencera.
Astuce
Export.image.toDrive({
image: ndvi, //nom de la variable
description: ‘NDVI_Landsat-8’, //le nom que vous souhaitez pour votre données sur le Drive
folder: ‘GEE/EXPORT’, // Dossier sur votre Drive ou exporter l’image
region: montreal,
scale: 30,
crs: ‘EPSG: 4326’, // CRS de sortie (Système de coordonnées)
maxPixels: 1e13, // Paramètre impliquant un nombre maximal de pixel en sortie, principalement pour la gestion de mémoire (ajuster au besoin).
fileDimensions: 512, // dimension des tuiles de sortie désirée
skipEmptyTiles: true // paramètre indiquant s’il faut oui ou non exporter les tuiles vides
});
Modèle informatique dans lequel le stockage des données et leur traitement sont externalisés sur des serveurs distants accessibles à la demande à partir de tout appareil bénéficiant d'une connexion Internet.
Tiré de l'OQLF (Voir)
Landsat 9 est un satellite d'observation de la Terre américain qui fait partie du programme Landsat. Le projet est géré conjointement par la NASA chargé du segment spatial et par le United States Geological Survey (USGS) qui développement le segment au sol et exploite les données. Ce satellite d'environ 3 tonnes, qui a été lancé le 27 septembre 2021 pour prendre la suite de satellites aux caractéristiques proches, dispose d'une caméra permettant de réaliser des images de la surface en lumière visible et proche infrarouge et d'un spectromètre en infrarouge thermique qui doit mesurer la température au sol. (Wikipédia, 2022)
Assemblage de plusieurs phototypes ou parties de phototypes en vue d'en faire une nouvelle image. (OQLF, 1993)
Landsat 8 est un satellite d'observation de la Terre américain lancé le 11 février 2013. Il s'agit du huitième satellite du programme Landsat et le septième à atteindre l’orbite avec succès. Initialement appelé Landsat Data Continuity Mission (LDCM), il s'agit d'une collaboration entre la NASA et le United States Geological Survey (USGS). Le Goddard Space Flight Center de la NASA à Greenbelt, dans le Maryland, assure le développement, l'ingénierie des systèmes de mission et l'acquisition du lanceur, tandis que l'USGS assure le développement des systèmes au sol et poursuit les opérations de la mission. (Wikipédia, 2023)
Donnée, valeur ou nombre entrant dans une opération arithmétique ou logique, ou une instruction. (OQLF, 2000)
GeoJSON (de l'anglais Geographic JSON, signifiant littéralement JSON géographique) est un format ouvert d'encodage d'ensemble de données géospatiales simples utilisant la norme JSON (JavaScript Object Notation).
Il permet de décrire des données de type point, ligne, chaîne de caractères, polygone, ainsi que des ensembles et sous-ensembles de ces types de données et d'y ajouter des attributs d'information qui ne sont pas spatiales. (Wikipédia, 2021)
Mode d'apprentissage par lequel un agent évalue et améliore ses performances et son efficacité sans que son programme soit modifié, en acquérant de nouvelles connaissances et aptitudes à partir de données et/ou en réorganisant celles qu'il possède déjà. (OQLF, 2020)
Le shapefile, ou « fichier de formes » est un format de fichier pour les systèmes d'informations géographiques (SIG). Initialement développé par ESRI pour ses logiciels commerciaux, ce format est désormais devenu un standard de facto, dont les spécifications sont ouvertes1, et est utilisé par un grand nombre de logiciels libres (MapServer, Grass, UDig, MapGuide Open Source (en), QGIS, GvSIG, etc.) comme propriétaires (VectorWorks, AutoCAD Map 3D, etc.). (Wikipédia, 2022)
Donnée qui renseigne sur la nature de certaines autres données dans le but d'en faciliter la compréhension et la gestion. (OQLF, 2020)
Indice de différence normalisée de la neige ou "Normalized Difference Snow Index". On le calcule en utilisant le ratio (VERT – INFRAROUGE ONDES COURTES) / (VERT + INFRAROUGE ONDES COURTES). (USGS, 2023)
Élément d'image (Picture Element) qui exprime le nombre de couleurs, en bits, pouvant être affiché.
Le nombre de couleurs s'obtient en procédant au calcul suivant : 2 exposant le nombre de bits par pixel, exposant le nombre de canaux de couleur (généralement trois). Ainsi, un pixel pouvant traiter 8 bits par pixel pourra afficher 16 777 216 couleurs différentes. (OQLF, 2022)
Relatif à la zone de l'atmosphère terrestre où l'air est suffisamment raréfié pour avoir un effet négligeable sur le mouvement des corps ou sur la propagation des ondes électromagnétiques. En d'autres mots, hors de l'atmosphère. (FranceTerme, 2007)
Qualifie un système ou un nombre qui respecte les règles de la numération à base 2 et qui est uniquement composé des chiffres 0 et 1. (OQLF, 1999)
Landsat 5 était un satellite en orbite basse lancé le 1er mars 1984 pour recueillir des images de la surface de la Terre. Dans la continuité du programme Landsat, Landsat 5 a été géré conjointement par l'U.S. Geological Survey (USGS) et la National Aeronautics and Space Administration (NASA). Les données de Landsat 5 ont été recueillies et distribuées par le Centre d'observation et de science des ressources terrestres (EROS) de l'USGS.
Après 29 ans dans l'espace, Landsat 5 a été officiellement mis hors service le 5 juin 2013. Vers la fin de sa mission, l'utilisation de Landsat 5 a été entravée par des pannes d'équipement, et il a été largement supplanté par Landsat 7 et Landsat 8. Les scientifiques de la mission ont prévu que le satellite rentrerait dans l'atmosphère terrestre et se désintégrerait vers 2034. (Wikipédia, 2022)
Le Moderate-Resolution Imaging Spectroradiometer (MODIS, que l'on peut traduire en français par « Radiomètre spectral pour imagerie de résolution moyenne ») est une série d'instruments d'observation scientifique couplés à un système embarqué satellitaire, lancé par la NASA à bord du satellite Terra en 1999, puis à bord du satellite Aqua (deux satellites de l'EOS - Earth Observing System, un programme de la NASA destiné à l'observation à long terme des sols, biosphère, atmosphère et océans de la Terre). (Wikipédia, 2021)
Unité élémentaire d'information manipulable par un ordinateur, appartenant au système binaire et ne pouvant ainsi que prendre la valeur 0 ou 1. (OQLF, 2022)
Sentinel-2 est une série de satellites d'observation de la Terre de l'Agence spatiale européenne développée dans le cadre du programme Copernicus dont les deux premiers exemplaires ont été mis en orbite en 2015 et 2017. L'objectif du programme est de fournir aux pays européens des données complètes et actualisées leur permettant d'assurer le contrôle et la surveillance de l'environnement. Les satellites Sentinel-2 constituent une des composantes spatiales de ce programme qui comprend également notamment les Sentinel-1 (observation radar tout temps) et Sentinel-3. Ils doivent fournir l'imagerie optique haute résolution permettant l'observation des sols (utilisation des sols, végétation, zones côtières, fleuves, etc.) ainsi que le traitement des situations d'urgence (catastrophes naturelles...). (Wikipédia, 2023)
Dans le cas de l'écart entre deux objets, la distance la plus petite ou l'écart angulaire le plus petit, permettant de les discriminer. (Conseil international de la langue francaise, 1980)
Les trois couleurs de base sur lesquelles repose un mode de composition de couleurs fondé sur le principe des couleurs additives. (OQLF, 1992)
Blocs de traitement qui sont contenus dans un autre bloc. (OQLF, 1997)
Mesure télédétectée par satellite de la « verdure » du couvert végétal. (OMS, 2011)
Le GeoTIFF est un standard du domaine public permettant d'ajouter des informations de géoréférencement à une image TIFF (projection, système de coordonnées, datation, ...). L'enregistrement des métadonnées de géoréférencement utilise la possibilité offerte par le format TIFF de pouvoir définir de l'information additionnelle sous forme de tags spécifiques. (Wikipédia, 2021)