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 tego, gdzie i jak często występowały wody powierzchniowe w całym okresie od marca 1984 r. do października 2015 r.
W tej części samouczka:
- dodać warstwę mapy do wizualizacji występowania wód powierzchniowych,
- pokazują, jak wysyłać zapytania o wartości warstwy mapy,
- dodać styl niestandardowy, aby poprawić wizualizację;
- utworzyć binarną warstwę maski wody przy użyciu wartości progowej,
- wyśrodkować mapę na interesujących częściach świata,
- pokaż, jak refaktoryzować skrypt, aby był bardziej czytelny i łatwiejszy w utrzymaniu.
Tworzenie podstawowej wizualizacji
Zacznij od skopiowania do edytora kodu tych instrukcji:
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 zapisuje go w zmiennej o nazwie gsw.
Druga instrukcja wybiera pojedynczą warstwę zbioru danych GSW i zapisuje ją w zmiennej o nazwie occurrence.
Trzecia instrukcja dodaje obraz występowania do interaktywnej mapy edytora kodu.
Kliknij przycisk „Run” (Uruchom) w edytorze kodu. Po kilku sekundach powinna pojawić się mapa z szarym kolorem wzdłuż linii brzegowych, podobna do tej na rysunku 1.
W większości obszarów zbiór danych GSW jest przezroczysty, ponieważ lokalizacje, w których nie zebrano zdjęć Landsat (np. obszary oceaniczne) lub w których nie wykryto wody w żadnej obserwacji w ciągu 32 lat, 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 następnie kliknij mapę, aby wybrać lokalizację. Na karcie inspektora wyświetlą się 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 są wyrażone w punktach procentowych, więc przez około 98% czasu lokalizacja była klasyfikowana jako pokryta wodą.
Wartość jest średnią z miesięcznych wartości występowania wód powierzchniowych, która jest normalizowana pod kątem zmian sezonowych, zgodnie z opisem w
Przewodniku użytkownika danych (wersja 2)
.
Refaktoryzacja w celu ulepszenia kodu
Nasz skrypt zawiera tylko 2 instrukcje, ale już teraz możemy go zrefaktoryzować, aby ostateczna wersja była łatwiejsza do odczytania i utrzymania w przyszłości.
Obecnie instrukcja Map.addLayer() przekazuje pojedynczy argument occurrence, który jest obiektem obrazu Earth Engine, który chcemy wyświetlić na mapie. Metoda Map.addLayer() umożliwia jednak przekazywanie 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 dotyczące 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 metody Map.addLayer można przekazać 5 argumentów: eeObject, visParams, name, shown i opacity.
W naszym obecnym skrypcie przekazujemy pojedynczą zmienną occurrence, która jest interpretowana jako pierwszy argument, eeObject.
Aby przekazać zarówno obiekt zmiennej, jak i dodatkowy argument, który nazywa warstwę, możemy refaktoryzować kod tak, aby używał „argumentów nazwanych” (eeObject i name), które są przekazywane do metody z poziomu
struktury danych JSON
, jak pokazano poniżej:
Edytor kodu (JavaScript)
Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});
Uruchom kod ponownie, aby upewnić się, że po zmianach wprowadzonych w ramach refaktoryzacji nadal działa. Wynikowa mapa powinna pozostać niezmieniona.
Dodawanie parametrów wizualizacji
Następnie ulepszymy domyślne parametry wizualizacji, które sprawiają, że woda wydaje się szara. Dodaj nową instrukcję, która tworzy zmienną VIS_OCCURRENCE i przekazuje 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 czerwony powinien być używany dla wartości minimalnej 0%, a niebieski dla wartości maksymalnej 100%.
Dodanie .updateMask(occurrence.divide(100)) powoduje, że krycie/przezroczystość pikseli jest ustawiana na podstawie wartości wystąpienia.
Uruchom skrypt ponownie i zobacz, jak zmiany stylu wpłynęły na wyniki.
Obszary wodne są teraz niebieskie. Postęp!
Tworzenie warstwy progu
Obraz występowania wody zawiera informacje o tym, jak często można spodziewać się wody, przy użyciu zakresu wartości od 0 do 100%. Często przydaje się jednak zdefiniowanie binarnej warstwy wody (tj. „woda” lub „nie woda”) na podstawie określonego procentu 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ę progu 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 za pomocą operatora porównania „większe niż” .gt(90), a następnie ustawiamy wcześniej zamaskowane obszary na zero za pomocą 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ższą instrukcję przed innymi instrukcjami Map.addLayer.
Edytor kodu (JavaScript)
Map.addLayer({ eeObject: water_mask, visParams: VIS_WATER_MASK, name: '90% occurrence water mask' });
Odwiedzanie ciekawych miejsc na świecie
Odkrywanie świata przez przesuwanie i powiększanie widoku jest świetną zabawą, ale świat jest duży i czasem warto od razu przejść do konkretnej lokalizacji. Oto kilka stwierdzeń, które stanowią niewielką próbkę interesujących lokalizacji pod względem wód powierzchniowych. Odkomentuj tylko jedną instrukcję naraz, a skrypt przejdzie do tej lokalizacji po uruchomieniu.
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 kilka przykładów interesujących lokalizacji. Możesz też dodać własne.
Refaktoryzacja, jeszcze raz…
Zanim przejdziemy do kolejnej warstwy zbioru danych GSW, przeprowadzimy jeszcze trochę refaktoryzacji kodu. W szczególności pogrupujemy podobne instrukcje i dodamy komentarze, które podzielą nasz kod na sekcje dotyczące zasobów, stałych, obliczeń, centrowania mapy i dodawania warstw mapy.
Oto ostateczny, zrefaktoryzowany skrypt:
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 z czasem zmieniało się występowanie wody.