Zbiór danych GSW zawiera wiele warstw danych, które przedstawiają dane dotyczące wód powierzchniowych na różne sposoby. Zaczniemy od wizualizacji warstwy występowania wody, która zawiera podsumowanie informacji o tym, gdzie i jak często w okresie od marca 1984 r. do października 2015 r. występowała woda na powierzchni.
W tej części samouczka:
- dodać warstwę mapy do wizualizacji występowania wód powierzchniowych;
- pokazywać, jak wysyłać zapytania o wartości warstwy mapy;
- dodawać niestandardowe style, aby ulepszyć wizualizację,
- utworzyć binarną warstwę maski wody za pomocą wartości progowej,
- wyśrodkować mapę na interesujących częściach świata,
- pokazać, jak przekształcić skrypt, aby był bardziej czytelny i łatwiejszy w utrzymaniu.
Tworzenie wizualizacji podstawowej
Zacznij od skopiowania tych instrukcji do edytora kodu:
Edytor kodu (JavaScript)
var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); Map.addLayer(occurrence);
Pierwsza instrukcja odwołuje się do obiektu Image Earth Engine dla zbioru danych GSW i przechowuje go w zmiennej o nazwie gsw
.
Drugie wyrażenie wybiera jedną warstwę zbioru danych GSW i zapisuje ją w zmiennej o nazwie occurrence
.
Trzecie stwierdzenie dodaje obraz wystąpienia do interaktywnej mapy w edytorze kodu.
Kliknij przycisk „Uruchom” w edytorze kodu. Po kilku sekundach powinna się wyświetlić mapa z szarym kolorem wzdłuż linii brzegowej, podobnie jak na rysunku 1.

W większości obszarów zbiór danych GSW jest przejrzysty, ponieważ lokalizacje, w których nie zebrano zdjęć z satelity Landsat (np. obszary oceaniczne) lub w których w ciągu 32 lat nie wykryto wody, są zamaskowane.
Sprawdzanie wartości
Aby sprawdzić wartości warstwy występowania wody, użyjemy karty inspektora w edytorze kodu. Najpierw kliknij kartę inspektora, a potem kliknij mapę, aby wybrać lokalizację. Karta inspektora wyświetli informacje o każdej warstwie, która znajduje się w miejscu kliknięcia.

W przykładzie powyżej wartość warstwy o nazwie value
wynosi 98. Jednostki to punkty procentowe, więc w przybliżeniu w 98% przypadków lokalizacja została sklasyfikowana jako pokryta wodą.
Wartość jest średnią wartości występowania wód powierzchniowych w poszczególnych miesiącach, co normalizuje zmienność sezonową, jak opisano w
Przewodniku dla użytkowników danych (wersja 2)
.
Refaktoryzacja w celu ulepszenia kodu
Nasz skrypt zawiera tylko 2 instrukcje, ale już teraz możemy go przekształcić, aby był łatwiejszy do odczytania i utrzymania w przyszłości.
Obecnie instrukcja Map.addLayer()
przekazuje jeden argument occurrence
, czyli obiekt obrazu Earth Engine, który chcemy wyświetlić na mapie. Metoda Map.addLayer()
umożliwia jednak przekazywanie do niej dodatkowych argumentów. Aby szybko sprawdzić, jakie argumenty są dostępne, umieść kursor po nawiasie otwierającym i naciśnij skrót klawiszowy „Pokaż sugestie kodu”, aby wyświetlić dokument pomocy dotyczący metody addLayer
. (Skróty klawiszowe można wyświetlić, wybierając menu Pomoc –> Skróty).

Skróty klawiszowe pokazują, że do funkcji Map.addLayer
można przekazać 5 argumentów: eeObject
, visParams
, name
, shown
i opacity
.
W naszym obecnym skrypcie przekazujemy jedną zmienną occurrence
, która jest interpretowana jako pierwszy argument, eeObject
.
Aby przekazać zarówno obiekt zmiennej, jak i dodatkowy argument, który określa nazwę warstwy, możemy zmodyfikować kod, aby używać „argumentów nazwanych” (eeObject
i name
), które są przekazywane do metody w
strukturze danych JSON
, jak pokazano poniżej:
Edytor kodu (JavaScript)
Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});
Uruchom kod ponownie, aby sprawdzić, czy po zmianach w refaktoryzacji nadal działa. Wynikowa mapa powinna pozostać bez zmian.
Dodawanie parametrów wizualizacji
Następnie będziemy pracować nad ulepszeniem domyślnych parametrów wizualizacji, które sprawiają, że woda wygląda na szarą. Dodaj nowe wyrażenie, które tworzy zmiennąVIS_OCCURRENCE
, i przekaż ją jako dodatkowy argument do metody addLayer.
Edytor kodu (JavaScript)
var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] };
Edytor kodu (JavaScript)
Map.addLayer({ eeObject: occurrence.updateMask(occurrence.divide(100)), name: 'Water Occurrence (1984-2015)', visParams: VIS_OCCURRENCE });
Parametry wizualizacji przechowywane w strukturze JSON VIS_OCCURRENCE
wskazują, że dla minimalnej wartości 0% należy użyć koloru czerwonego, a dla maksymalnej wartości 100% – niebieskiego.
Dodanie .updateMask(occurrence.divide(100))
powoduje, że krycie/przezroczystość pikseli jest ustawiana na podstawie wartości wystąpienia.
Uruchom ponownie skrypt i wyświetl zmienione wyniki po wprowadzeniu zmian w stylu.

Obszary wodne są teraz niebieskie. Postęp!
Tworzenie warstwy progowej
Obraz występowania wody zawiera informacje o tym, jak często można się jej spodziewać, w zakresie wartości od 0 do 100%. Często jednak przydatne jest zdefiniowanie binarnej warstwy wody (czyli „woda” lub „nie woda”) na podstawie określonego odsetka występowania (czyli wartości progowej). Użyjemy tej prostej warstwy binarnej jako czystej warstwy tła, na której można umieścić inne warstwy GSW. Tę warstwę progową można utworzyć za pomocą tych instrukcji, które używają wartości progowej 90% do oddzielenia wody od innych elementów.
Najpierw definiujemy nową zmienną wizualizacji VIS_WATER_MASK
, która będzie przechowywać informacje o stylu maski wody:
Edytor kodu (JavaScript)
var VIS_WATER_MASK = { palette: ['white', 'black'] };
Następnie obliczamy warstwę maski wody, używając operatora porównania „większe niż” .gt(90)
, a potem ustawiamy wcześniej zamaskowane obszary na zero, używając metody .unmask()
:
Edytor kodu (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);
Na koniec dodaj warstwę do mapy. Aby ta warstwa była renderowana pod wszystkimi innymi warstwami, umieść poniższe oświadczenie przed wszystkimi innymi oświadczeniami Map.addLayer
.
Edytor kodu (JavaScript)
Map.addLayer({ eeObject: water_mask, visParams: VIS_WATER_MASK, name: '90% occurrence water mask' });

Podróżowanie do interesujących miejsc na świecie
Odkrywanie świata przez przesuwanie i powiększanie jest świetną zabawą, ale świat jest duży i czasami warto przejść bezpośrednio do konkretnej lokalizacji. Oto kilka stwierdzeń, które zawierają niewielką próbkę ciekawych lokalizacji pod względem wód powierzchniowych. Wystarczy, że odkomentujesz jedno z tych stwierdzeń, a skrypt po uruchomieniu przejdzie do tej lokalizacji.
Edytor kodu (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
To tylko niewielka próbka ciekawych lokalizacji. Możesz dodać własne.
Refaktoryzacja, znowu…
Zanim przejdziemy do kolejnej warstwy zbioru danych GSW, przeprowadzimy jeszcze trochę refaktoryzacji kodu. Pogrupujemy podobne instrukcje i dodamy komentarze, które podzielą kod na sekcje dotyczące zasobów, stałych, obliczeń, wyśrodkowania mapy i dodawania warstw mapy.
Oto ostateczna wersja przekształconego skryptu:
Edytor kodu (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 });
W następnej sekcji dowiesz się, jak zmieniała się z czasem obecność wody.