Composition, masquage et mosaïque

Une fois la collection de réflectance TOA Landsat 8 chargée dans une variable appelée l8, vous avez vu que le code suivant génère un composite de valeur récente :

Éditeur de code (JavaScript)

var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31');
Map.addLayer(landsat2016, visParams, 'l8 collection');

L'un des problèmes de cette image composite est qu'elle est pleine de nuages. Au lieu de simplement prendre le dernier pixel de la collection (lorsque vous ajoutez une collection à la carte, Earth Engine appelle implicitement mosaic()), vous pouvez réduire le ImageCollection (en savoir plus sur la réduction des collections d'images).

Composer avec des réducteurs

Vous avez découvert les réducteurs pour obtenir des statistiques dans une région d'image. Il s'agissait d'une réduction spatiale. Réduire une collection d'images à une seule image est une réduction temporelle lorsque la collection représente des images au fil du temps. Le type de Reducer que vous utilisez définit la façon dont Earth Engine gère les pixels qui se chevauchent. Landsat 8 survole un même endroit de la Terre tous les 16 jours. Cela signifie qu'il y aura environ 12 images sur une période de six mois (et plus si les scènes se chevauchent). Chaque pixel de la carte est dérivé d'une pile de pixels, un pour chaque image de la collection affichée.

Si vous ajoutez simplement la collection à la carte, le pixel le plus récent sera sélectionné, c'est-à-dire celui de l'image la plus récente de la pile. Ce comportement peut être modifié à l'aide des réducteurs Earth Engine. Par exemple, au lieu de prendre le pixel le plus récent de la pile, Earth Engine peut être configuré pour choisir la valeur médiane de la pile. Cela permet de supprimer les nuages (qui ont une valeur élevée) et les ombres (qui ont une valeur faible). Lorsqu'une collection d'images est réduite à l'aide du réducteur de médiane, la valeur composite correspond à la médiane de chaque bande au fil du temps. Par exemple, en utilisant des scènes Landsat en 2016 :

Éditeur de code (JavaScript)

// Get the median over time, in each band, in each pixel.
var median = l8.filterDate('2016-01-01', '2016-12-31').median();

// Make a handy variable of visualization parameters.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};

// Display the median composite.
Map.addLayer(median, visParams, 'median');

La nouveauté de ce code est la méthode median() appliquée à une collection d'images. Comme les méthodes de filtrage, il s'agit d'un raccourci pour la méthode reduce() plus générale sur les collections d'images, qui prend un ee.Reducer() comme argument. Consultez le package ee.Reducer dans l'onglet Docs de l'éditeur de code pour afficher la liste de tous les réducteurs Earth Engine. Lorsque vous envisagez d'utiliser un réducteur pour une collection d'images, notez que la sortie est une image. Par conséquent, les réducteurs avec des sorties non numériques, par exemple les réducteurs histogram ou toList, ne fonctionneront pas avec une collection d'images.

Tutorial_api_06_median_composite
Figure 6. Composite médian Landsat 8.

Lorsque vous effectuez un zoom arrière sur la composition médiane, vous devriez voir quelque chose de semblable à la figure 6. Le résultat devrait être nettement meilleur que le composite de valeurs récentes que vous avez créé précédemment. À ce stade, il convient de prendre du recul et de réfléchir à ce qui a été fait pour créer cette composition médiane. Earth Engine a chargé l'ensemble de la collection Landsat 8 sur le territoire continental des États-Unis et a calculé la médiane pour chaque pixel. Cela représente beaucoup de données ! Bien sûr, vous pouvez calculer les médianes annuelles en filtrant d'abord la collection, comme vous l'avez fait précédemment. Le point est que si vous deviez télécharger toutes ces images et créer ce composite, ce serait un gros projet. Avec Earth Engine, vous obtenez un résultat en quelques secondes.

Pour en savoir plus sur la composition et la mosaïque, cliquez ici.

Masquage

Bien que le composite médian soit une amélioration par rapport au composite de valeur récente, vous pouvez masquer des parties de l'image. Masquer des pixels dans une image les rend transparents et les exclut de l'analyse. Chaque pixel de chaque bande d'une image comporte un masque. Ceux dont la valeur de masque est inférieure ou égale à 0 seront transparents. Ceux dont le masque a une valeur supérieure à 0 seront affichés. Le masque d'une image est défini à l'aide d'un appel tel que image1.mask(image2). Cet appel prend les valeurs de image2 et les définit comme masque de image1. Tous les pixels de image2 dont la valeur est 0 seront rendus transparents dans image1.

Par exemple, supposons que vous souhaitiez masquer tous les pixels d'eau dans le composite médian. Un masque d'eau peut être créé à l'aide de l'ensemble de données décrit par Hansen et al. (2013), qui se trouve dans le catalogue de données Earth Engine. (Pour en savoir plus sur l'ensemble de données Hansen et al., consultez ce tutoriel.) Dans cet ensemble de données, l'eau a la valeur 2, la terre a la valeur 1 et "aucune donnée" a la valeur 0. Utilisez un peu de logique pour créer une image de masque qui contient des zéros là où il n'y a pas de terre :

Éditeur de code (JavaScript)

// Load or import the Hansen et al. forest change dataset.
var hansenImage = ee.Image('UMD/hansen/global_forest_change_2015');

// Select the land/water mask.
var datamask = hansenImage.select('datamask');

// Create a binary mask.
var mask = datamask.eq(1);

// Update the composite mask with the water mask.
var maskedComposite = median.updateMask(mask);
Map.addLayer(maskedComposite, visParams, 'masked');

Ce code contient quelques nouveautés qui méritent d'être expliquées en détail. Tout d'abord, la fonction select() est utile pour extraire les bandes d'intérêt d'une image. Ici, nous ne sélectionnons que la bande qui nous intéresse : datamask. La prochaine nouveauté est l'opérateur logique eq(), qui signifie "égal à". Nous utilisons eq(1) pour créer une image binaire dans laquelle tous les pixels qui n'ont pas la valeur 1 dans la bande datamask (ceux qui sont de l'eau ou sans données) obtiennent la valeur 0 dans l'image résultante.

Grâce à ce masquage, tous les pixels de la composition médiane qui se trouvent sur terre (selon le jeu de données Hansen et al.) sont visibles, mais ceux qui se trouvent sur l'eau (ou qui sont des données manquantes) sont transparents et seront exclus de toute analyse que vous effectuerez sur l'image maskedComposite.

Mosaïque

En combinant les concepts de collections d'images, d'opérateurs logiques, de masquage et de composition, vous pouvez obtenir des résultats cartographiques intéressants. Par exemple, supposons que vous souhaitiez une image dans laquelle les pixels de terre sont affichés en vraies couleurs et tous les autres pixels en bleu. Vous pouvez faire quelque chose comme :

Éditeur de code (JavaScript)

// Make a water image out of the mask.
var water = mask.not();

// Mask water with itself to mask all the zeros (non-water).
water = water.mask(water);

// Make an image collection of visualization images.
var mosaic = ee.ImageCollection([
  median.visualize(visParams),
  water.visualize({palette: '000044'}),
]).mosaic();

// Display the mosaic.
Map.addLayer(mosaic, {}, 'custom mosaic');

Ce code comporte de nombreux éléments. Analysons-le. Tout d'abord, nous utilisons l'opérateur logique not() pour inverser le masque que nous avons créé précédemment. Plus précisément, not() transforme tous les zéros en un et tous les non-zéros en zéro. Il n'est pas tout à fait correct d'appeler cette variable water, car elle inclut également des pixels nodata, mais cela convient dans le contexte cartographique actuel. L'étape suivante consiste à masquer l'eau avec elle-même. L'image obtenue contient des pixels d'eau (valeur 1) et tout le reste est masqué. La dernière étape consiste à combiner les images avec mosaic(). Comme mosaic() fonctionne sur une collection d'images, nous transmettons une liste d'images que nous souhaitons combiner dans le constructeur de collection d'images, puis nous appelons mosaic() comme dernière étape. L'ordre des images dans cette liste est important. Plus précisément, l'image de sortie contiendra le dernier pixel non masqué de la pile d'images de la collection d'entrée. Dans ce cas, cela fonctionne, car la couche d'eau est la dernière image (en haut) de la collection et ne contient que des pixels non masqués où de l'eau est présente.

Notez que les images de la collection sont des images de visualisation. Lorsque vous appelez visualize() sur une image, celle-ci est transformée en image à trois bandes et 8 bits en fonction des paramètres de visualisation que vous transmettez. Les paramètres de visualisation par défaut fonctionnent correctement pour les images 8 bits à trois bandes. Vous n'avez donc pas besoin de paramètres de visualisation lorsque vous ajoutez l'image à la carte. Le résultat doit ressembler à la figure 7.

Tutorial_api_07_mosaic.png
Figure 7. Mosaïque personnalisée qui donne une couleur uniforme aux zones d'eau.

À ce stade, vous avez découvert des méthodes pour visualiser des collections d'images sous forme de composites de valeurs récentes, des méthodes pour composer des collections d'images à l'aide de réducteurs, et des méthodes pour créer des composites personnalisés en masquant et en mosaïquant une collection d'images. Sur la page suivante, découvrez comment ajouter un indice de végétation à chaque image d'une collection et comment utiliser cet indice pour créer un composite "pixel le plus vert".