Vorkommen von Wasser (1984–2015)

Das GSW-Dataset enthält viele Datenebenen, die die Oberflächenwasserdaten auf unterschiedliche Weise darstellen. Wir beginnen mit der Visualisierung der Ebene „Water Occurrence“, die eine Zusammenfassung darüber liefert, wo und wie oft im gesamten Zeitraum zwischen März 1984 und Oktober 2015 Oberflächenwasser aufgetreten ist.

In diesem Abschnitt der Anleitung wird Folgendes beschrieben:

  1. eine Kartenebene zur Visualisierung des Oberflächenwasservorkommens hinzufügen,
  2. wie Sie Werte der Kartenebene abfragen,
  3. benutzerdefinierte Stile hinzufügen, um die Visualisierung zu verbessern,
  4. eine binäre Wassermaskenebene mit einem Schwellenwert erstellen,
  5. die Karte auf interessante Teile der Welt zentrieren und
  6. zeigen, wie Sie das Script refaktorieren, um es besser lesbar und wartbar zu machen.

Einfache Visualisierung erstellen

Kopieren Sie zuerst die folgenden Anweisungen in den Code-Editor:

Code-Editor (JavaScript)

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');
Map.addLayer(occurrence);

Die erste Anweisung verweist auf das Earth Engine-Image-Objekt für das GSW-Dataset und speichert es in einer Variablen namens gsw. Mit der zweiten Anweisung wird eine einzelne Ebene des GSW-Datasets ausgewählt und in einer Variablen namens occurrence gespeichert. Mit der dritten Anweisung wird das Bild mit den Vorkommen der interaktiven Karte des Code-Editors hinzugefügt.

Klicken Sie im Code-Editor auf „Run“ (Ausführen). Nach einigen Sekunden sollte eine Karte mit grauer Färbung entlang der Küstenlinien angezeigt werden, ähnlich wie in Abbildung 1.

Standardvisualisierung
Abbildung 1. Standardvisualisierung der Datenebene für das globale Vorkommen von Oberflächenwasser.

In den meisten Gebieten ist das GSW-Dataset transparent, da Orte, an denen entweder keine Landsat-Bilder aufgenommen wurden (z.B. Meeresgebiete) oder an denen in den 32 Jahren kein Wasser erkannt wurde, ausgeblendet werden.

Werte prüfen

Um die Werte der Ebene für das Wasservorkommen zu untersuchen, verwenden wir den Tab „Inspector“ des Code-Editors. Klicken Sie zuerst auf den Tab „Prüfen“ und dann auf die Karte, um einen Ort auszuwählen. Auf dem Tab „Inspector“ werden Informationen zu jeder Ebene angezeigt, die an der Stelle vorhanden ist, auf die Sie geklickt haben.

Tab „Inspector“
Abbildung 2. Beispiel für die Ausgabe auf dem Tab „Inspector“.

Im obigen Beispiel ist der Wert der Ebene value 98. Die Einheiten sind Prozentpunkte. Der Standort wurde also in etwa 98 % der Zeit als von Wasser bedeckt klassifiziert. Der Wert ist der Durchschnitt der monatlichen Werte für das Vorkommen von Oberflächenwasser, der im Vergleich zu saisonalen Schwankungen normalisiert wird, wie im Nutzerhandbuch (v2) beschrieben.

Refaktorierung zur Verbesserung Ihres Codes

Unser Script enthält nur zwei Anweisungen, aber wir haben bereits die Möglichkeit, den Code zu refaktorieren, damit unser endgültiges Script im Laufe der Zeit leichter zu lesen und zu verwalten ist. Derzeit wird mit der Map.addLayer()-Anweisung ein einzelnes Argument occurrence übergeben. Das ist das Earth Engine-Bildobjekt, das auf der Karte angezeigt werden soll. Die Methode Map.addLayer() lässt jedoch auch zusätzliche Argumente zu. Wenn Sie schnell sehen möchten, welche Argumente verfügbar sind, setzen Sie den Cursor hinter die öffnende Klammer und drücken Sie die Tastenkombination für „Codevorschläge anzeigen“, um das Hilfedokument für die Methode addLayer aufzurufen. (Tastenkombinationen können über das Menü „Hilfe“ -> „Tastenkombinationen“ aufgerufen werden.)

Map.addLayer-Argumente
Abbildung 3. Screenshot mit den Argumenten der Methode „addLayer“

Die Tastenkombinationen zeigen, dass fünf Argumente an Map.addLayer übergeben werden können: eeObject, visParams, name, shown und opacity. In unserem aktuellen Script übergeben wir eine einzelne Variable occurrence, die als erstes Argument eeObject interpretiert wird. Um sowohl das Variablenobjekt als auch ein zusätzliches Argument zu übergeben, das die Ebene benennt, können wir den Code so refaktorieren, dass „benannte Argumente“ (eeObject und name) verwendet werden, die innerhalb einer JSON-Datenstruktur an die Methode übergeben werden, wie unten gezeigt:

Code-Editor (JavaScript)

Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});

Führen Sie den Code noch einmal aus, um sicherzustellen, dass er nach den Refaktorierungsänderungen noch funktioniert. Die resultierende Karte sollte unverändert bleiben.

Visualisierungsparameter hinzufügen

Als Nächstes verbessern wir die Standardvisualisierungsparameter, die das Wasser grau erscheinen lassen. Fügen Sie eine neue Anweisung hinzu, die eine Variable VIS_OCCURRENCE erstellt, und übergeben Sie sie als zusätzliches Argument an die Methode „addLayer“.

Code-Editor (JavaScript)

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};

Code-Editor (JavaScript)

Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

Die in der JSON-Struktur VIS_OCCURRENCE gespeicherten Visualisierungsparameter geben an, dass Rot für einen Mindestwert von 0 % und Blau für einen Höchstwert von 100 % verwendet werden soll. Durch das Hinzufügen von .updateMask(occurrence.divide(100)) wird die Deckkraft/Transparenz der Pixel basierend auf dem Vorkommenswert festgelegt.

Führen Sie das Script noch einmal aus und sehen Sie sich die überarbeiteten Ergebnisse der Stiländerungen an.

Oberflächenwasser
Abbildung 4. Screenshot des Wasservorkommens im Paraná-Delta in der Nähe von Buenos Aires, mit einer transparenten roten Farbe für den Endpunkt des Mindestwerts von 0 % und einer durchgehenden blauen Farbe für den Endpunkt des Höchstwerts.

Die Wasserflächen sind jetzt blau. Fortschritt!

Schwellenwertebene erstellen

Das Bild zum Wasservorkommen enthält Informationen darüber, wie oft Wasser zu erwarten ist. Dabei wird ein Wertebereich von 0 bis 100 % verwendet. Es ist jedoch oft nützlich, eine binäre Wasserschicht zu definieren (d.h. „Wasser“ oder „kein Wasser“) basierend auf einem bestimmten Prozentsatz des Auftretens (d. h. einem Schwellenwert) klassifiziert. Wir verwenden diese einfache binäre Ebene als saubere Hintergrundebene, über der andere GSW-Ebenen platziert werden können. Diese Schwellenwertebene kann mit den folgenden Anweisungen erstellt werden, wobei ein Schwellenwert von 90 % verwendet wird, um Wasser und Nicht-Wasser zu trennen.

Zuerst definieren wir eine neue Visualisierungsvariable VIS_WATER_MASK, die Stilinformationen für die Wassermaske enthält:

Code-Editor (JavaScript)

var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

Anschließend berechnen wir eine Wassermaskenebene mit dem Vergleichsoperator „größer als“ (.gt(90)) und setzen die zuvor maskierten Bereiche mit der Methode .unmask() auf null:

Code-Editor (JavaScript)

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

Fügen Sie die Ebene schließlich der Karte hinzu. Damit diese Ebene unter allen anderen Ebenen gerendert wird, fügen Sie die folgende Anweisung vor allen anderen Map.addLayer-Anweisungen ein.

Code-Editor (JavaScript)

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask'
});
90 % Wassermaske
Abbildung 5. Screenshot einer 90-%-Wassermaske für das Paraná-Delta in der Nähe von Buenos Aires.

Interessante Orte auf der ganzen Welt besuchen

Es macht Spaß, die Welt durch Schwenken und Zoomen zu erkunden, aber die Welt ist groß und manchmal ist es hilfreich, direkt zu einem bestimmten Ort zu springen. Hier finden Sie eine Reihe von Aussagen, die eine kleine Auswahl interessanter Orte in Bezug auf Oberflächenwasser darstellen. Entfernen Sie einfach die Kommentarzeichen für eine der Anweisungen. Ihr Script wird dann bei der Ausführung an diesen Ort weitergeleitet.

Code-Editor (JavaScript)

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

Dies ist nur eine kleine Auswahl interessanter Orte. Du kannst auch eigene hinzufügen.

Refaktorieren, noch einmal…

Bevor wir zur nächsten Ebene des GSW-Datasets übergehen, werden wir noch ein wenig Code-Refaktorierung vornehmen. Konkret fassen wir ähnliche Anweisungen zusammen und fügen einige Kommentare hinzu, um den Code in Abschnitte für Assets, Konstanten, Berechnungen, Zentrierung der Karte und Hinzufügen von Kartenebenen zu unterteilen.

Hier ist das endgültige refaktorierte Skript:

Code-Editor (JavaScript)

//////////////////////////////////////////////////////////////
// Asset List
//////////////////////////////////////////////////////////////

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');

//////////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////////

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};
var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

//////////////////////////////////////////////////////////////
// Calculations
//////////////////////////////////////////////////////////////

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

//////////////////////////////////////////////////////////////
// Initialize Map Location
//////////////////////////////////////////////////////////////

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

//////////////////////////////////////////////////////////////
// Map Layers
//////////////////////////////////////////////////////////////

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask',
  shown: false
});
Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

Im nächsten Abschnitt erfahren Sie, wie sich das Wasservorkommen im Laufe der Zeit verändert hat.