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:
- eine Kartenebene zum Visualisieren des Vorkommens von Oberflächenwasser hinzuzufügen,
- wie Werte der Kartenebene abgefragt werden,
- Benutzerdefinierte Formatierung hinzufügen, um die Visualisierung zu verbessern
- eine binäre Wassermaskenebene mit einem Schwellenwert erstellen,
- die Karte auf interessante Teile der Welt zentrieren und
- 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.

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.

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.

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.

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

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.