NDVI, Mapping a Function over a Collection, Quality Mosaicking

Bisher haben Sie gelernt, wie Sie einzelne Landsat-Szenen abrufen können, indem Sie beispielsweise Folgendes tun, wobei l8 und point Importe sind, die die Landsat 8-TOA-Sammlung und eine Geometrie für das Untersuchungsgebiet darstellen:

Code-Editor (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()
);

Angenommen, Sie möchten ein NDVI-Bild (Normalized Difference Vegetation Index) aus dem Landsat-Bild berechnen. Vegetation reflektiert Licht im nahen Infrarotbereich (NIR) des elektromagnetischen Spektrums und absorbiert Licht im roten Bereich (Weitere Informationen zur NIR-Reflexion von Vegetation). Anhand dieses Werts wird ein einzelner Wert erstellt, der in etwa die photosynthetische Aktivität eines Pixels widerspiegelt. Die Berechnung lautet: (NIR – Rot) / (NIR + Rot). Das Ergebnis ist eine Zahl zwischen 1 und -1. Pixel mit hoher photosynthetischer Aktivität haben einen hohen NDVI. So können Sie den NDVI in Earth Engine berechnen:

Code-Editor (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');

Das Ergebnis sollte in etwa so aussehen wie in Abbildung 8. Beachten Sie, dass wir die select()-Funktion verwenden, die Sie im vorherigen Abschnitt zum Maskieren kennengelernt haben, um die NIR- und Rotbänder abzurufen. Anschließend berechnen wir den NDVI mit mathematischen Bildoperatoren, die Sie auch im Abschnitt zu Image-Mathematik gesehen haben. Stellen Sie das Bild schließlich mit einer Palette dar. Hier haben wir Farbnamen anstelle von Hexadezimalstrings in der Palette verwendet. Weitere Informationen finden Sie in dieser externen Referenz zu CSS-Farben.

Tutorial_api_08_ndvi.png
Abbildung 8. NDVI für eine einzelne Landsat-Szene. Blau steht für einen niedrigen und Grün für einen hohen NDVI.

Die Operation für die normalisierte Differenz ist in der Fernerkundung so weit verbreitet, dass es eine Abkürzungsfunktion für ein ee.Image gibt, mit der sich der Code im vorherigen Beispiel vereinfachen lässt:

Code-Editor (JavaScript)

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

Funktion auf eine Sammlung anwenden

Angenommen, Sie möchten NDVI jedem Bild in einer Bildsammlung hinzufügen. In Earth Engine können Sie dazu eine Funktion map(). Verwechseln Sie map() nicht mit dem Map-Objekt. Ersteres ist eine Methode für eine Sammlung und verwendet map im Sinne der parallelen Verarbeitung, bei der eine Funktion auf jedes Element in einer Sammlung angewendet wird. Die Funktion definiert die Vorgänge, die auf jedes Element in der Sammlung angewendet werden. Im JavaScript-Tutorial haben Sie bereits eine einfache Funktion gesehen. Jetzt erstellen wir eine Funktion, die Earth Engine-Funktionen enthält. Kopieren Sie beispielsweise den vorherigen NDVI-Code in eine Funktion, die das Eingabebild mit einem NDVI-Band zurückgibt:

Code-Editor (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');

Dieser Code ist möglicherweise nicht so effizient für die Berechnung des NDVI für ein einzelnes Bild, aber diese Funktion kann als Argument für map() verwendet werden, um jeder Abbildung in der Sammlung ein NDVI-Band hinzuzufügen. Oft ist es hilfreich, eine Funktion zuerst auf einem einzelnen Bild zu testen, um sicherzugehen, dass sie sich wie erwartet verhält. Nachdem Sie die Funktion für ein einzelnes Bild getestet und festgestellt haben, dass sie Ihren Anforderungen entspricht, können Sie sie der Sammlung zuordnen:

Code-Editor (JavaScript)

var withNDVI = l8.map(addNDVI);

Wenn Sie prüfen möchten, ob tatsächlich jedem Bild in dieser Sammlung ein NDVI-Band hinzugefügt wird, können Sie die withNDVI-Sammlung der Karte hinzufügen und mit dem Tab Inspector einen zufälligen Ort abfragen. Jedes Bild in der Sammlung hat jetzt ein Band namens NDVI.

Zusammengesetztes Bild mit den grünsten Pixeln erstellen

Nachdem Sie eine Bildsammlung erstellt haben, in der jedes Bild ein NDVI-Band hat, können wir eine neue Methode zum Erstellen von Composites ausprobieren: qualityMosaic(). Möglicherweise haben Sie Unregelmäßigkeiten zwischen Landsat-Pfaden bemerkt, selbst im Median-Pixel-Composite. Ein Grund dafür könnten Unterschiede in der Phänologie sein, da Bilder auf benachbarten Pfaden zu unterschiedlichen Zeiten (insbesondere im Abstand von 8 Tagen) aufgenommen werden. Eine Möglichkeit, dies zu minimieren, besteht darin, Pixelwerte im Composite aus ungefähr derselben phänologischen Phase zu verwenden, z. B. der Zeit der maximalen Grünheit von Pflanzen (wenn die Blätter vorhanden und photosynthetisch aktiv sind). Wenn wir die maximale Grünheit durch den maximalen NDVI definieren, können wir qualityMosaic() verwenden, um ein Composite zu erstellen, in dem jedes Pixel das Pixel mit dem maximalen NDVI aus der Sammlung enthält. Sie können das hinzugefügte NDVI-Band jetzt in Ihrer withNDVI-Sammlung verwenden:

Code-Editor (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');

Das Ergebnis dieses Codes sollte in etwa wie in Abbildung 9 aussehen. Wenn Sie Abbildung 9 mit dem in Abbildung 6 dargestellten Median-Composite vergleichen, sehen Sie, dass das grünste Pixel-Composite tatsächlich viel grüner ist. Bei genauerer Betrachtung von Gewässern sollte jedoch ein anderes Problem deutlich werden. Konkret sind Gewässer jetzt bewölkt. Das liegt an der Funktionsweise der Methode qualityMosaic(): An jedem Ort wird die gesamte Zeitreihe untersucht und der Pixel mit dem Maximalwert im NDVI-Band wird als zusammengesetzter Wert festgelegt. Da der NDVI über Wolken höher ist als über Wasser, werden Wasserflächen als bewölkte Pixel dargestellt, während vegetationsbedeckte Gebiete alle grün erscheinen, da der NDVI am höchsten ist, wenn die Vegetation im Pixel photosynthetisch aktiv ist.

Tutorial_api_09_greenest.png
Abbildung 9. Landsat 8-Composite mit den grünsten Pixeln.

Sie haben nun verschiedene Möglichkeiten kennengelernt, Bilder in Earth Engine zusammenzufügen und zu mosaizieren. Sie können Composites mit dem letzten Wert, dem Median oder dem grünsten Pixel aus Bildern erstellen, die nach Zeit und Ort gefiltert wurden, oder aus allen Bildern in der Sammlung. Sie haben gelernt, wie Sie Berechnungen mit den Bildern durchführen und Informationen extrahieren. Auf der nächsten Seite wird beschrieben, wie Sie Informationen aus Earth Engine abrufen können, z. B. als Diagramm oder als Dataset, das in Ihren Google Drive-Ordner exportiert wird.