Komponowanie, maskowanie i mozaikowanie

Po wczytaniu kolekcji współczynników odbicia TOA z Landsat 8 do zmiennej o nazwie l8 zobaczysz, że ten kod daje kompozycję ostatnich wartości:

Edytor kodu (JavaScript)

var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31');
Map.addLayer(landsat2016, visParams, 'l8 collection');

Jednym z problemów z tym obrazem jest to, że jest na nim dużo chmur. Zamiast pobierać ostatni piksel z kolekcji (gdy dodajesz kolekcję do mapy, Earth Engine niejawnie wywołuje na niej funkcję mosaic()), możesz zredukować ImageCollection (więcej informacji o redukowaniu kolekcji obrazów).

Komponowanie z użyciem reduktorów

Reduktory zostały po raz pierwszy przedstawione w sekcji Uzyskiwanie statystyk w regionie obrazu. To była redukcja przestrzenna. Zmniejszenie kolekcji obrazów do obrazu jest redukcją czasową, gdy kolekcja reprezentuje obrazy w czasie. Typ używanego obiektu Reducer określa, jak Earth Engine obsługuje nakładające się piksele. Landsat 8 odwiedza to samo miejsce na Ziemi co 16 dni. Oznacza to, że w ciągu 6 miesięcy powstanie około 12 zdjęć (i więcej, jeśli sceny będą się nakładać). Każdy piksel na mapie pochodzi ze stosu pikseli – po jednym z każdego obrazu w wyświetlanej kolekcji.

Samo dodanie kolekcji do mapy powoduje wybranie najnowszego piksela – tego z ostatniego obrazu w stosie. To zachowanie można zmienić za pomocą reduktorów Earth Engine. Na przykład zamiast pobierać najnowszy piksel ze stosu, Earth Engine może wybrać wartość mediany w stosie. Dzięki temu można usunąć chmury (które mają wysoką wartość) i cienie (które mają niską wartość). Gdy kolekcja obrazów jest redukowana za pomocą reduktora mediany, wartością złożoną jest mediana w każdym paśmie w czasie. Na przykład przy użyciu scen Landsat z 2016 roku:

Edytor kodu (JavaScript)

// Get the median over time, in each band, in each pixel.
var median = l8.filterDate('2016-01-01', '2016-12-31').median();

// Make a handy variable of visualization parameters.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};

// Display the median composite.
Map.addLayer(median, visParams, 'median');

Nowością w tym kodzie jest metoda median() zastosowana do kolekcji obrazów. Podobnie jak metody filtrowania, jest to skrót do bardziej ogólnej metody reduce() w kolekcjach obrazów, która przyjmuje ee.Reducer() jako argument. Aby zobaczyć listę wszystkich reduktorów Earth Engine, zapoznaj się z pakietem ee.Reducer na karcie Dokumentacja w edytorze kodu. Jeśli rozważasz użycie reduktora w przypadku kolekcji obrazów, pamiętaj, że dane wyjściowe to obraz, więc reduktory z danymi wyjściowymi innymi niż liczbowe, np. histogram lub toList, nie będą działać z kolekcją obrazów.

Tutorial_api_06_median_composite
Rysunek 6. Złożona mediana Landsat 8.

Po pomniejszeniu obrazu mediany powinien on wyglądać mniej więcej tak jak na rysunku 6. Powinno to wyglądać znacznie lepiej niż utworzona wcześniej kompozycja ostatnich wartości. Warto teraz cofnąć się o krok i zastanowić, co zostało zrobione, aby utworzyć tę medianę. Earth Engine wczytał całą kolekcję Landsat 8 dla kontynentalnych Stanów Zjednoczonych i obliczył medianę dla każdego piksela. To bardzo duża ilość danych. Oczywiście możesz obliczyć roczne mediany, najpierw filtrując kolekcję, tak jak wcześniej. Chodzi o to, że gdyby trzeba było pobrać wszystkie te zdjęcia i utworzyć z nich kompozycję, byłoby to duże przedsięwzięcie. Dzięki Earth Engine wynik otrzymasz w kilka sekund.

Więcej informacji o tworzeniu kompozycji i mozaik znajdziesz tutaj.

Zamaskowanie

Chociaż kompozycja mediany jest ulepszeniem w stosunku do kompozycji ostatniej wartości, możesz chcieć zamaskować części obrazu. Maskowanie pikseli na obrazie sprawia, że stają się one przezroczyste i są wykluczane z analizy. Każdy piksel w każdym paśmie obrazu ma maskę. Te z wartością maski 0 lub mniejszą będą przezroczyste. Wyrenderowane zostaną te, które mają maskę o wartości powyżej 0. Maskę obrazu ustawia się za pomocą wywołania takiego jak image1.mask(image2). To wywołanie pobiera wartości image2 i tworzy z nich maskę image1. Wszystkie piksele w image2, które mają wartość 0, będą przezroczyste w image1.

Załóżmy na przykład, że chcesz zamaskować wszystkie piksele wody w medianie obrazu złożonego. Maskę wody można utworzyć za pomocą zbioru danych opisanego przez Hansena i in. (2013), który znajduje się w katalogu danych Earth Engine. (Więcej informacji o zbiorze danych Hansena i in. znajdziesz w tym samouczku). W tym zbiorze danych woda ma wartość 2, ląd – 1, a „brak danych” – 0. Użyj odrobiny logiki, aby utworzyć obraz maski, który ma zera tam, gdzie nie ma lądu:

Edytor kodu (JavaScript)

// Load or import the Hansen et al. forest change dataset.
var hansenImage = ee.Image('UMD/hansen/global_forest_change_2025_v1_13');

// Select the land/water mask.
var datamask = hansenImage.select('datamask');

// Create a binary mask.
var mask = datamask.eq(1);

// Update the composite mask with the water mask.
var maskedComposite = median.updateMask(mask);
Map.addLayer(maskedComposite, visParams, 'masked');

W tym kodzie jest kilka nowych elementów, które warto omówić szczegółowo. Po pierwsze, funkcja select() jest przydatna do wyodrębniania interesujących pasm z obrazu. Tutaj wybieramy tylko pasmo, które nas interesuje: datamask. Kolejną nowością jest operator logiczny eq(), który oznacza „równa się”. Używamy eq(1), aby utworzyć obraz binarny, w którym wszystkie piksele, które nie mają wartości 1 w paśmie datamask (czyli te, które są wodą lub nie zawierają danych), otrzymują wartość 0 w obrazie wynikowym.

W wyniku tego maskowania wszystkie piksele w obrazie złożonym z median, które znajdują się nad lądem (według zbioru danych Hansena i in.), są widoczne, ale te nad wodą (lub nodata) są przezroczyste i zostaną wykluczone z analizy obrazu maskedComposite.

Mozaikowanie

Łącząc koncepcje kolekcji obrazów, operatorów logicznych, maskowania i kompozycji, możesz uzyskać ciekawe wyniki kartograficzne. Załóżmy na przykład, że chcesz uzyskać obraz, na którym piksele lądu są wyświetlane w rzeczywistych kolorach, a wszystkie pozostałe piksele są wyświetlane na niebiesko. Możesz zrobić coś takiego:

Edytor kodu (JavaScript)

// Make a water image out of the mask.
var water = mask.not();

// Mask water with itself to mask all the zeros (non-water).
water = water.mask(water);

// Make an image collection of visualization images.
var mosaic = ee.ImageCollection([
  median.visualize(visParams),
  water.visualize({palette: '000044'}),
]).mosaic();

// Display the mosaic.
Map.addLayer(mosaic, {}, 'custom mosaic');

W tym kodzie dużo się dzieje, więc przeanalizujmy go. Najpierw używamy operatora logicznego not(), aby odwrócić utworzoną wcześniej maskę. Konkretnie not() zamienia wszystkie zera na jedynki, a wszystkie wartości niezerowe na zera. Nazwanie tej zmiennej water nie jest do końca poprawne, ponieważ zawiera ona również piksele bez danych, ale w obecnym kontekście kartograficznym jest to dopuszczalne. Następnie musimy zamaskować „wodę” nią samą. W ten sposób powstaje obraz, na którym wszystkie piksele wody mają wartość 1, a wszystko inne jest zamaskowane. Ostatnim krokiem jest połączenie obrazów z mosaic(). Ponieważ mosaic() działa na kolekcji obrazów, przekazujemy listę obrazów, które chcemy połączyć, do konstruktora kolekcji obrazów, a następnie wywołujemy mosaic() jako ostatni krok. Kolejność obrazów na tej liście jest ważna. Obraz wyjściowy będzie zawierał ostatni niezamaskowany piksel ze stosu obrazów w kolekcji wejściowej. W tym przypadku to działa, ponieważ warstwa wody jest ostatnim (górnym) obrazem w kolekcji i zawiera tylko niezamaskowane piksele, w których występuje woda.

Pamiętaj, że obrazy w kolekcji to obrazy wizualizacji. Gdy wywołasz funkcję visualize() na obrazie, zostanie on przekształcony w 3-pasmowy, 8-bitowy obraz zgodnie z przekazanymi parametrami wizualizacji. Domyślne parametry wizualizacji działają dobrze w przypadku 3-pasmowych, 8-bitowych obrazów, więc nie potrzebujesz parametrów wizualizacji, gdy dodajesz obraz do mapy. Wynik powinien wyglądać jak na rysunku 7.

Tutorial_api_07_mosaic.png
Rysunek 7. Niestandardowa mozaika, która sprawia, że obszary wodne mają jednolity kolor.

Na tym etapie znasz już sposoby wizualizacji kolekcji obrazów jako kompozycji najnowszych wartości, metody tworzenia kompozycji kolekcji obrazów za pomocą reduktorów oraz metody tworzenia niestandardowych kompozycji przez maskowanie i mozaikowanie kolekcji obrazów. Na następnej stronie dowiesz się, jak dodać indeks roślinności do każdego obrazu w kolekcji i użyć go do utworzenia kompozytu „najbardziej zielonego piksela”.