NDVI, Mapping a Function over a Collection, Quality Mosaicking

Sie haben bereits gelernt, wie Sie einzelne Landsat-Szenen abrufen können, indem Sie Folgendes tun, wobei l8 und point Importe sind, die die Landsat 8-TOA-Sammlung und eine Geometrie des Interessenbereichs 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 jetzt 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). Der NDVI verwendet diese Werte, um einen einzelnen Wert zu erstellen, der ungefähr die photosynthetische Aktivität an einem Pixel widerspiegelt. Die Berechnung lautet (NIR – Rot) ÷ (NIR + Rot). Das Ergebnis ist eine Zahl zwischen 1 und -1, wobei Pixel mit hoher photosynthetischer Aktivität einen hohen NDVI haben. 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 ungefähr wie in Abbildung 8 aussehen. Beachten Sie, dass wir die Funktion select() verwenden, die Sie im vorherigen Abschnitt zur Maskierung kennengelernt haben, um die NIR- und roten Bänder abzurufen. Anschließend berechnen wir den NDVI mit mathematischen Operatoren für Bilder, die Sie ebenfalls im Abschnitt zur Image-Mathematik gesehen haben. Stellen Sie das Bild schließlich mit einer Palette dar. Hier haben wir Farbnamen anstelle von Hex-Strings 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 zur Berechnung der normalisierten Differenz ist in der Fernerkundung so weit verbreitet, dass es eine Kurzfunktion 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 den NDVI zu jedem Bild in einer Bildersammlung hinzufügen. In Earth Engine können Sie dazu eine Funktion auf die Sammlung map(). Verwechseln Sie map() nicht mit dem Objekt Map. Ersteres ist eine Methode für eine Sammlung und verwendet map im Sinne des parallelen Computings, um eine Funktion auf jedes Element in einer Sammlung anzuwenden. Die Funktion definiert die Vorgänge, die auf jedes Element in der Sammlung angewendet werden. Sie haben im JavaScript-Tutorial eine einfache Funktion gesehen, aber 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 jedem Bild in der Sammlung ein NDVI-Band hinzuzufügen. Es ist oft hilfreich, eine Funktion zuerst an einem einzelnen Bild zu testen, um sicherzustellen, dass sie sich wie erwartet verhält. Nachdem Sie die Funktion an einem einzelnen Bild getestet und festgestellt haben, dass sie das gewünschte Ergebnis liefert, können Sie sie auf die Sammlung anwenden:

Code-Editor (JavaScript)

var withNDVI = l8.map(addNDVI);

Um zu prüfen, ob dadurch tatsächlich ein NDVI-Band in jedes Bild in dieser Sammlung eingefügt wird, können Sie die Sammlung withNDVI der Karte hinzufügen und einen zufälligen Ort über den Tab Inspector abfragen. Sie sollten sehen, dass jedes Bild in der Sammlung jetzt ein Band mit dem Namen NDVI hat.

Pixel-Komposit mit den grünsten Pixeln erstellen

Nachdem Sie eine Bildersammlung erstellt haben, in der jedes Bild ein NDVI-Band hat, können wir uns eine neue Methode zum Erstellen von Kompositen ansehen: qualityMosaic(). Möglicherweise sind Ihnen Unstetigkeiten zwischen Landsat-Pfaden aufgefallen, sogar im Median-Pixel-Komposit. Ein Grund dafür könnten Unterschiede in der Phänologie sein, da Bilder in benachbarten Pfaden zu unterschiedlichen Zeiten (genauer gesagt im Abstand von 8 Tagen) aufgenommen wurden. Eine Möglichkeit, dies zu minimieren, besteht darin, Pixelwerte im Kompositbild aus ungefähr derselben phänologischen Phase festzulegen, z. B. der Zeit der maximalen Grünfärbung 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 mit qualityMosaic() ein Komposit erstellen, bei dem jedes Pixel das Pixel mit dem maximalen NDVI aus der Sammlung enthält. Jetzt können Sie das hinzugefügte NDVI-Band 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 Median-Komposit in Abbildung 6 vergleichen, sehen Sie, dass das Komposit mit den grünsten Pixeln tatsächlich viel grüner ist. Eine genauere Untersuchung der Gewässer sollte jedoch ein anderes Problem aufzeigen. Insbesondere Gewässer erscheinen jetzt trüb. Das liegt an der Funktionsweise der Methode qualityMosaic(): An jedem Standort wird die gesamte Zeitreihe untersucht und das Pixel mit dem höchsten Wert im NDVI-Band wird als zusammengesetzter Wert festgelegt. Da der NDVI über Wolken höher ist als über Wasser, werden Wasserflächen mit wolkigen Pixeln dargestellt, während bewachsene Flächen 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-Kompositbild mit den grünsten Pixeln.

Sie haben nun mehrere Möglichkeiten kennengelernt, Bilder in Earth Engine zu kombinieren und Mosaike zu erstellen. Sie können Composites mit dem neuesten Wert, dem Medianwert 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 für die Bilder durchführen und Informationen extrahieren. Auf der nächsten Seite werden Möglichkeiten beschrieben, wie Sie Informationen aus der Earth Engine abrufen können, z. B. als Diagramm oder als Datensatz, der in Ihren Google Drive-Ordner exportiert wird.