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

Auparavant, vous avez appris à 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 de l'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 (NIR) du spectre électromagnétique et absorbe la lumière dans la partie rouge (en savoir plus sur la réflectance NIR de la végétation). Le NDVI l'utilise 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). Cela donne un nombre compris entre 1 et -1, où les pixels ayant 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 nous calculons le NDVI à l'aide des opérateurs mathématiques d'image que vous avez également vus précédemment dans la section sur les mathématiques Image. Enfin, affichez l'image avec une palette. Ici, nous avons utilisé des noms de couleurs au lieu de chaînes hexadécimales dans la palette. (Pour en savoir plus, consultez cette documentation externe sur les couleurs CSS.)

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

L'opération de différence normalisée est si omniprésente dans la télédétection qu'il existe une fonction de raccourci sur un ee.Image qui est utile pour 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 l'indice NDVI à chaque image d'une collection d'images. Dans Earth Engine, vous pouvez map() une fonction sur la collection. Ne confondez pas map() avec l'objet Map. Le premier est une méthode sur une collection et utilise map dans le sens du calcul parallèle d'application d'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 la fonctionnalité 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 l'indice NDVI d'une seule image, mais cette fonction peut être utilisée comme argument de 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 que vous avez 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 place bien une bande NDVI dans chaque image de cette collection, vous pouvez ajouter la collection withNDVI à la carte et interroger un emplacement aléatoire avec l'onglet Inspecteur. Vous devriez remarquer que chaque image de la collection comporte désormais une bande appelée NDVI.

Créer un composite de 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 médiane des pixels. Cela peut s'expliquer en partie par 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). Pour minimiser ce problème, vous pouvez essayer de définir les valeurs de pixels dans la composition à partir d'une phase phénologique à peu près identique, par exemple au moment où les plantes sont les plus vertes (lorsque les feuilles sont présentes et photosynthétiquement actives). Si nous définissons la verdure maximale par l'indice 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 présentée dans la figure 6, on constate que la composition de pixels la plus verte est effectivement beaucoup plus verte. Toutefois, un examen approfondi des plans d'eau devrait révéler un autre problème. Plus précisément, les plans d'eau apparaissent désormais nuageux. 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é au-dessus des nuages que de l'eau, les zones d'eau sont associées à des pixels nuageux, tandis que les zones végétales apparaissent toutes en vert, car l'indice NDVI est le plus élevé lorsque la végétation du pixel est photosynthétiquement active.

Tutorial_api_09_greenest.png
Figure 9. Composite de pixels les plus verts de 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 médiane ou de pixel le plus vert à partir d'images filtrées par heure et lieu, ou de toutes les images de la collection. Vous avez appris à effectuer des calculs sur les images et à extraire des informations. La page suivante explique comment 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.