NDVI, mappage d'une fonction sur une collection, mosaïque de qualité

Vous avez vu précédemment comment obtenir des scènes Landsat individuelles en procédant comme suit, où l8 et point sont des importations représentant la collection Landsat 8 TOA et une géométrie de zone d'intérêt :

Éditeur de code (JavaScript)

// Define a point of interest. Use the UI Drawing Tools to import a point
// geometry and name it "point" or set the point coordinates with the
// ee.Geometry.Point() function as demonstrated here.
var point = ee.Geometry.Point([-122.292, 37.9018]);

// Import the Landsat 8 TOA image collection.
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');

// Get the least cloudy image in 2015.
var image = ee.Image(
  l8.filterBounds(point)
    .filterDate('2015-01-01', '2015-12-31')
    .sort('CLOUD_COVER')
    .first()
);

Supposons maintenant que vous souhaitiez calculer une image d'indice de végétation par différence normalisée (NDVI) à partir de l'image Landsat. La végétation réfléchit la lumière dans la partie proche infrarouge (PIR) du spectre électromagnétique et absorbe la lumière dans la partie rouge (en savoir plus sur la réflectance PIR de la végétation). Le NDVI utilise ces informations pour créer une valeur unique reflétant approximativement l'activité photosynthétique se produisant au niveau d'un pixel. Le calcul est le suivant : (NIR - rouge) / (NIR + rouge). Le résultat est un nombre compris entre 1 et -1, où les pixels présentant une activité photosynthétique élevée ont un NDVI élevé. Voici une façon de calculer le NDVI dans Earth Engine :

Éditeur de code (JavaScript)

// Compute the Normalized Difference Vegetation Index (NDVI).
var nir = image.select('B5');
var red = image.select('B4');
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI');

// Display the result.
Map.centerObject(image, 9);
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white', 'green']};
Map.addLayer(ndvi, ndviParams, 'NDVI image');

Le résultat doit ressembler à la figure 8. Notez que nous utilisons la fonction select() que vous avez découverte dans la section précédente sur le masquage pour obtenir les bandes NIR et rouge, puis que nous calculons le NDVI à l'aide d'opérateurs mathématiques d'image que vous avez également vus précédemment dans la section sur les calculs mathématiques Image. Enfin, affichez l'image avec une palette. Ici, nous avons utilisé des noms de couleur au lieu de chaînes hexadécimales dans la palette. (Pour en savoir plus, consultez cette référence externe sur les couleurs CSS.)

Tutorial_api_08_ndvi.png
Figure 8. NDVI pour une seule scène Landsat. Le bleu correspond à un NDVI faible et le vert à un NDVI élevé.

L'opération de différence normalisée est si courante en télédétection qu'il existe une fonction de raccourci sur un ee.Image qui permet de simplifier le code de l'exemple précédent :

Éditeur de code (JavaScript)

var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');

Mapper une fonction sur une collection

Supposons maintenant que vous souhaitiez ajouter le NDVI à chaque image d'une collection d'images. Pour ce faire, dans Earth Engine, vous devez appliquer une fonction à la collection à l'aide de map(). Ne confondez pas map() avec l'objet Map. La première est une méthode sur une collection et utilise map au sens du calcul parallèle, qui consiste à appliquer une fonction à chaque élément d'une collection. La fonction définit les opérations qui seront appliquées à chaque élément de la collection. Vous avez vu une fonction simple dans le tutoriel JavaScript, mais nous allons maintenant créer une fonction qui inclut des fonctionnalités Earth Engine. Par exemple, copiez le code NDVI précédent dans une fonction qui renvoie l'image d'entrée avec une bande NDVI :

Éditeur de code (JavaScript)

var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
  return image.addBands(ndvi);
};

// Test the addNDVI function on a single image.
var ndvi = addNDVI(image).select('NDVI');

Ce code n'est peut-être pas aussi efficace pour calculer le NDVI d'une seule image, mais cette fonction peut être utilisée comme argument pour map() afin d'ajouter une bande NDVI à chaque image de la collection. Il est souvent utile de tester d'abord une fonction sur une seule image pour s'assurer qu'elle se comporte comme prévu. Une fois que vous avez testé la fonction sur une image individuelle et déterminé qu'elle fait ce que vous voulez, vous pouvez la mapper sur la collection :

Éditeur de code (JavaScript)

var withNDVI = l8.map(addNDVI);

Pour vérifier que cela ajoute bien une bande NDVI à chaque image de cette collection, vous pouvez ajouter la collection withNDVI à la carte et interroger un emplacement aléatoire à l'aide de l'onglet Inspecteur. Vous devriez remarquer que chaque image de la collection comporte désormais une bande appelée NDVI.

Créer une image composite des pixels les plus verts

Maintenant que vous avez créé une collection d'images dans laquelle chaque image comporte une bande NDVI, nous pouvons explorer une nouvelle façon de créer des composites : qualityMosaic(). Vous avez peut-être remarqué des discontinuités entre les chemins Landsat, même dans la composition de pixels médiane. Cela peut être dû en partie à des différences de phénologie, car les images des chemins adjacents sont collectées à des moments différents (plus précisément, à huit jours d'intervalle). Une façon de minimiser ce problème consiste à essayer de définir des valeurs de pixels dans le composite à partir d'un stade phénologique à peu près identique, par exemple au moment où les plantes sont les plus vertes (lorsque les feuilles sont présentes et actives sur le plan de la photosynthèse). Si nous définissons la verdure maximale par le NDVI maximal, nous pouvons utiliser qualityMosaic() pour créer un composite dans lequel chaque pixel contient le pixel NDVI maximal de la collection. Vous pouvez maintenant utiliser la bande NDVI ajoutée dans votre collection withNDVI :

Éditeur de code (JavaScript)

// Make a "greenest" pixel composite.
var greenest = withNDVI.qualityMosaic('NDVI');

// Display the result.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};
Map.addLayer(greenest, visParams, 'Greenest pixel composite');

Le résultat de ce code doit ressembler à la figure 9. En comparant la figure 9 à la composition médiane de la figure 6, on constate que la composition de pixels la plus verte est effectivement beaucoup plus verte. Cependant, un examen attentif des plans d'eau devrait faire apparaître un autre problème. Plus précisément, les plans d'eau apparaissent désormais troubles. Cela est dû au fonctionnement de la méthode qualityMosaic() : à chaque emplacement, l'intégralité de la série temporelle est examinée, et le pixel ayant la valeur maximale dans la bande NDVI est défini comme valeur composite. Comme l'indice NDVI est plus élevé sur les nuages que sur l'eau, les zones d'eau obtiennent des pixels nuageux, tandis que les zones végétalisées apparaissent toutes en vert, car l'indice NDVI est le plus élevé lorsque la végétation dans le pixel est active sur le plan de la photosynthèse.

Tutorial_api_09_greenest.png
Figure 9. Composite de pixels les plus verts Landsat 8.

Vous avez maintenant vu plusieurs façons de composer et de mosaïquer des images dans Earth Engine. Vous pouvez créer des composites de valeur récente, de valeur médiane ou de pixel le plus vert à partir d'images filtrées par date et par lieu, ou de toutes les images de la collection. Vous avez appris à effectuer des calculs sur l'imagerie et à extraire des informations. La page suivante présente les différentes façons d'extraire des informations d'Earth Engine, par exemple sous la forme d'un graphique ou d'un ensemble de données exporté vers votre dossier Google Drive.