Compositing, Maskierung und Mosaik

Wenn die Landsat 8 TOA-Reflexionssammlung in eine Variable namens l8 geladen wird, führt der folgende Code zu einem Composite mit aktuellen Werten:

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

Eines der Probleme mit diesem zusammengesetzten Bild ist, dass es voller Wolken ist. Anstatt nur das letzte Pixel in der Sammlung zu nehmen (wenn Sie der Karte eine Sammlung hinzufügen, ruft Earth Engine implizit mosaic() dafür auf), können Sie die ImageCollection reduzieren (Weitere Informationen zum Reduzieren von Bildersammlungen).

Compositing mit Reducern

Sie haben Reducer bereits kennengelernt, als es darum ging, Statistiken für eine Bildregion zu erhalten. Das war eine räumliche Reduzierung. Das Reduzieren einer Bildersammlung auf ein Bild ist eine zeitliche Reduzierung, wenn die Sammlung Bilder im Zeitverlauf darstellt. Der Typ des verwendeten Reducer bestimmt, wie die Earth Engine mit überlappenden Pixeln umgeht. Landsat 8 besucht alle 16 Tage denselben Ort auf der Erde. Das bedeutet, dass es über einen Zeitraum von 6 Monaten etwa 12 Bilder gibt (und mehr, wenn sich die Szenen überschneiden). Jedes Pixel auf der Karte wird aus einem Stapel von Pixeln abgeleitet – jeweils eines aus jedem Bild in der angezeigten Sammlung.

Wenn Sie die Sammlung einfach der Karte hinzufügen, wird das neueste Pixel ausgewählt, also das Pixel aus dem neuesten Bild im Stapel. Dieses Verhalten kann mithilfe von Earth Engine-Reduzierern geändert werden. Anstatt beispielsweise das neueste Pixel aus dem Stack zu nehmen, kann die Earth Engine angewiesen werden, den Medianwert im Stack auszuwählen. Dies hat den Vorteil, dass Wolken (die einen hohen Wert haben) und Schatten (die einen niedrigen Wert haben) entfernt werden. Wenn eine Bildersammlung mit dem Median-Reducer reduziert wird, ist der zusammengesetzte Wert der Medianwert in jedem Band im Zeitverlauf. Beispiel mit Landsat-Szenen aus dem Jahr 2016:

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

Neu in diesem Code ist die Methode median(), die auf eine Bildersammlung angewendet wird. Wie die Filtermethoden ist dies eine Abkürzung für die allgemeinere reduce()-Methode für Bildsammlungen, die ein ee.Reducer() als Argument verwendet. Eine Liste aller Earth Engine-Reducer finden Sie im Paket ee.Reducer auf dem Tab Docs des Code-Editors. Wenn Sie einen Reducer für eine Bildersammlung in Betracht ziehen, beachten Sie, dass die Ausgabe ein Bild ist. Reducer mit nicht numerischen Ausgaben, z. B. histogram- oder toList-Reducer, funktionieren daher nicht mit einer Bildersammlung.

Tutorial_api_06_median_composite
Abbildung 6. Landsat 8-Median-Komposit.

Wenn Sie die Ansicht des Median-Kompositbilds verkleinern, sollte es in etwa wie in Abbildung 6 aussehen. Das sollte deutlich besser aussehen als die zuvor erstellte Komposition mit den letzten Werten. An dieser Stelle lohnt es sich, einen Schritt zurückzutreten und zu überlegen, was getan wurde, um dieses Median-Komposit zu erstellen. Earth Engine hat die gesamte Landsat 8-Sammlung für die kontinentalen USA geladen und den Median für jedes Pixel berechnet. Das sind eine Menge Daten! Natürlich können Sie auch jährliche Medianwerte berechnen, indem Sie die Sammlung zuerst filtern, wie Sie es zuvor getan haben. Der Punkt ist, dass es ein großes Projekt wäre, wenn Sie alle diese Bilder herunterladen und dieses zusammengesetzte Bild erstellen müssten. Mit der Earth Engine erhalten Sie das Ergebnis in Sekundenschnelle.

Weitere Informationen zum Compositing und Mosaicking

Maskieren

Obwohl das Median-Komposit eine Verbesserung gegenüber dem Komposit mit aktuellen Werten darstellt, möchten Sie möglicherweise Teile des Bildes maskieren. Wenn Sie Pixel in einem Bild maskieren, werden diese Pixel transparent und von der Analyse ausgeschlossen. Jedes Pixel in jedem Band eines Bildes hat eine Maske. Diejenigen mit einem Maskenwert von 0 oder darunter sind transparent. Diejenigen mit einer Maske mit einem Wert über 0 werden gerendert. Die Maske eines Bildes wird mit einem Aufruf wie image1.mask(image2) festgelegt. Bei diesem Aufruf werden die Werte von image2 als Maske für image1 verwendet. Alle Pixel in image2 mit dem Wert 0 werden in image1 transparent dargestellt.

Angenommen, Sie möchten alle Wasserpixel in der Median-Kompositdarstellung maskieren. Eine Wassermaske kann mit dem von Hansen et al. (2013) beschriebenen Dataset erstellt werden, das im Earth Engine-Data Catalog enthalten ist. (Weitere Informationen zum Hansen et al.-Dataset finden Sie in dieser Anleitung.) In diesem Dataset hat Wasser den Wert 2, Land den Wert 1 und „Keine Daten“ den Wert 0. Verwenden Sie ein wenig Logik, um ein Maskenbild zu erstellen, das überall dort Nullen enthält, wo es kein Land gibt:

Code-Editor (JavaScript)

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

// 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');

In diesem Code gibt es einige neue Dinge, die wir uns genauer ansehen sollten. Erstens ist die Funktion select() nützlich, um die relevanten Bänder aus einem Bild zu extrahieren. Hier wählen wir nur das Band aus, das uns interessiert: datamask. Die nächste Neuerung ist der logische Operator eq(), der für „ist gleich“ steht. Wir verwenden eq(1), um ein Binärbild zu erstellen, in dem alle Pixel, die im Band datamask nicht den Wert 1 haben (also Wasser oder keine Daten sind), im resultierenden Bild den Wert 0 erhalten.

Durch diese Maskierung sind alle Pixel im Median-Komposit, die sich über Land befinden (gemäß dem Datensatz von Hansen et al.), sichtbar. Die Pixel über Wasser (oder ohne Daten) sind jedoch transparent und werden von allen Analysen ausgeschlossen, die Sie am Bild maskedComposite vornehmen.

Mosaik

Durch die Kombination der Konzepte von Bildsammlungen, logischen Operatoren, Maskierung und Compositing können Sie interessante kartografische Ergebnisse erzielen. Angenommen, Sie möchten ein Bild, in dem Landpixel in Echtfarben und alle anderen Pixel in Blau angezeigt werden. Dann können Sie so vorgehen:

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

In diesem Code passiert eine Menge. Sehen wir uns die einzelnen Teile an. Zuerst verwenden wir den logischen Operator not(), um die zuvor erstellte Maske umzukehren. Konkret wandelt not() alle Nullen in Einsen und alle Werte ungleich Null in Nullen um. Es ist nicht ganz korrekt, diese Variable water zu nennen, da sie auch einige Pixel ohne Daten enthält. Im vorliegenden kartografischen Kontext ist das aber in Ordnung. Als Nächstes maskieren Sie „water“ mit sich selbst. Das Ergebnis ist ein Bild, in dem alle Wasserpixel den Wert 1 haben und alles andere maskiert ist. Im letzten Schritt werden die Bilder mit mosaic() kombiniert. Da mosaic() mit einer Bildersammlung arbeitet, übergeben wir eine Liste von Bildern, die wir kombinieren möchten, an den Konstruktor der Bildersammlung und rufen dann im letzten Schritt mosaic() auf. Die Reihenfolge der Bilder in dieser Liste ist wichtig. Das Ausgabebild enthält das letzte unmaskierte Pixel aus dem Bildstapel in der Eingabesammlung. In diesem Fall funktioniert das, weil die Wasserebene das letzte (oberste) Bild in der Sammlung ist und nur unmaskierte Pixel enthält, wo Wasser vorkommt.

Die Bilder in der Sammlung sind Visualisierungsbilder. Wenn Sie visualize() für ein Bild aufrufen, wird es gemäß den von Ihnen übergebenen Visualisierungsparametern in ein 3-Band-8-Bit-Bild umgewandelt. Die Standardvisualisierungsparameter sind für 3-Band-8-Bit-Bilder geeignet. Sie benötigen also keine Visualisierungsparameter, wenn Sie das Bild der Karte hinzufügen. Das Ergebnis sollte wie in Abbildung 7 aussehen.

Tutorial_api_07_mosaic.png
Abbildung 7. Benutzerdefiniertes Mosaik, das Wasserflächen in einer einheitlichen Farbe darstellt.

Sie haben nun Möglichkeiten kennengelernt, Bildersammlungen als Composites mit den neuesten Werten zu visualisieren, Methoden zum Erstellen von Composites aus Bildersammlungen mithilfe von Reducern und Methoden zum Erstellen benutzerdefinierter Composites durch Maskieren und Mosaikieren einer Bildersammlung. Auf der nächsten Seite erfahren Sie, wie Sie jedem Bild in einer Sammlung einen Vegetationsindex hinzufügen und mit dem Index ein „Greenest Pixel“-Komposit erstellen.