Vorkommen von Wasser (1984–2015)

Das GSW-Dataset enthält viele Daten-Layers, in denen die Oberflächenwasserdaten auf unterschiedliche Weise dargestellt werden. Wir beginnen mit der Visualisierung der Wasservorkommensschicht, die eine Zusammenfassung der Orte und der Häufigkeit von Oberflächenwasser im gesamten Zeitraum zwischen März 1984 und Oktober 2015 enthält.

In diesem Abschnitt der Anleitung wird Folgendes behandelt:

  1. eine Kartenebene zum Visualisieren des Vorkommens von Oberflächenwasser hinzuzufügen,
  2. wie Werte der Kartenebene abgefragt werden,
  3. Benutzerdefinierte Formatierung 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 das Skript umgestaltet werden kann, um es lesbarer und wartungsfreundlicher 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-Bildobjekt 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 des Ereignisses der interaktiven Karte im Code-Editor hinzugefügt.

Klicken Sie im Code-Editor auf die Schaltfläche „Ausführen“. Nach einigen Sekunden sollte eine Karte mit grauer Küstenlinie angezeigt werden, ähnlich wie in Abbildung 1.

Standardvisualisierung
Abbildung 1. Standardvisualisierung der Datenebene „Global Surface Water Occurrence“ (Globales Vorkommen von Oberflächenwasser).

In den meisten Gebieten ist der GSW-Datensatz transparent, da Orte, an denen entweder keine Landsat-Bilder aufgenommen wurden (z.B. Meeresgebiete) oder an denen in den 32 Jahren bei keiner Beobachtung Wasser festgestellt wurde, maskiert sind.

Werte prüfen

Um die Werte der Wasservorkommensschicht zu untersuchen, verwenden wir den Tab „Inspector“ des Code-Editors. Klicken Sie zuerst auf den Tab „Inspector“ und dann auf die Karte, um einen Ort auszuwählen. Auf dem Tab „Inspector“ werden Informationen zu den einzelnen Ebenen angezeigt, die an der Stelle vorhanden sind, auf die Sie geklickt haben.

Tab „Inspector“
Abbildung 2. Beispiel für die Ausgabe des Tabs „Inspector“

Im obigen Beispiel ist der Wert der Ebene mit dem Namen value 98. Die Einheiten sind Prozentpunkte. Der Standort wurde also in etwa 98% der Zeit als wasserbedeckt eingestuft. Der Wert ist der Durchschnitt der monatlichen Werte für das Vorkommen von Oberflächenwasser. Dadurch werden saisonale Schwankungen normalisiert, wie im beschrieben.

Refactoring zur Verbesserung Ihres Codes

Unser Script enthält nur zwei Anweisungen, aber wir haben bereits die Möglichkeit, den Code so umzugestalten, dass das endgültige Script leichter zu lesen und zu warten ist. Derzeit wird mit der Anweisung Map.addLayer() ein einzelnes Argument occurrence übergeben, das das Earth Engine-Bildobjekt ist, das auf der Karte angezeigt werden soll. Die Methode Map.addLayer() ermöglicht jedoch auch, zusätzliche Argumente zu übergeben. 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 die Hilfedokumentation 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 Skript übergeben wir eine einzelne Variable occurrence, die als erstes Argument eeObject interpretiert wird. Um sowohl das Variablenobjekt als auch ein zusätzliches Argument, das die Ebene benennt, zu übergeben, können wir den Code so umgestalten, dass „benannte Argumente“ (eeObject und name) verwendet werden, die innerhalb einer JSON-Datenstruktur an die Methode übergeben werden, wie unten dargestellt:

Code-Editor (JavaScript)

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

Führen Sie den Code noch einmal aus, um zu prüfen, ob er nach den Refactoring-Änderungen weiterhin funktioniert. Die resultierende Karte sollte unverändert bleiben.

Visualisierungsparameter hinzufügen

Als Nächstes werden wir die Standardvisualisierungsparameter verbessern, die dazu führen, dass das Wasser grau dargestellt wird. Fügen Sie eine neue Anweisung hinzu, mit der eine Variable VIS_OCCURRENCE erstellt und als zusätzliches Argument an die Methode „addLayer“ übergeben wird.

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 für einen Mindestwert von 0% Rot und für einen Höchstwert von 100 % Blau verwendet werden soll. Durch das Hinzufügen von .updateMask(occurrence.divide(100)) wird die Deckkraft/Transparenz der Pixel basierend auf dem Häufigkeitswert festgelegt.

Führen Sie das Skript noch einmal aus und sehen Sie sich die überarbeiteten Ergebnisse an, die sich aus den Änderungen am Stil ergeben.

Vorkommen von Oberflächenwasser
Abbildung 4. Screenshot des Wasserauftretens im Paraná-Delta in der Nähe von Buenos Aires. Der Endpunkt für den Mindestwert von 0% ist transparent rot und der Endpunkt für den Höchstwert ist blau.

Die Wasserflächen sind jetzt blau. Fortschritt!

Schwellenwertebene erstellen

Das Bild zur Wasserhäufigkeit enthält Informationen dazu, wie oft Wasser erwartet wird, wobei ein Wertebereich von 0 bis 100 % verwendet wird. Oftmals ist es jedoch sinnvoll, eine binäre Wasserschicht (d. h. „Wasser“ im Vergleich zu „Nicht-Wasser“) basierend auf einem bestimmten Prozentsatz des Vorkommens (d. h. einem Schwellenwert) zu definieren. Wir verwenden diese einfache binäre Ebene als saubere Hintergrundebene, über die andere GSW-Ebenen gelegt werden können. Diese Schwellenwert-Ebene 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 Formatierungsinformationen 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 Wassermaske mit 90% für das Paraná-Delta in der Nähe von Buenos Aires.

Reisen zu interessanten Orten

Es macht Spaß, die Welt zu erkunden, indem man schwenkt und zoomt. Da die Welt aber sehr groß ist, kann es manchmal hilfreich sein, 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 enthalten. Entfernen Sie einfach die Kommentarzeichen für eine der Anweisungen. Wenn das Script ausgeführt wird, wird es dann an dieser Stelle fortgesetzt.

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. Sie können auch eigene hinzufügen.

Nochmal refaktorieren…

Bevor wir zur nächsten Ebene des GSW-Datasets übergehen, werden wir noch etwas Code-Refactoring durchführen. Wir fassen ähnliche Anweisungen zusammen und fügen Kommentare hinzu, um den Code in Abschnitte für Assets, Konstanten, Berechnungen, Zentrieren der Karte und Hinzufügen von Kartenlayern 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 sehen Sie sich an, wie sich das Vorkommen von Wasser im Laufe der Zeit verändert hat.