NDVI, mapowanie funkcji na kolekcję, mozaikowanie jakościowe

Wcześniej dowiedziałeś się, jak uzyskać poszczególne sceny Landsat, wykonując coś takiego, gdzie l8 i point to importy reprezentujące kolekcję Landsat 8 TOA i geometrię obszaru zainteresowania:

Edytor kodu (JavaScript)

// Define a point of interest. Use the UI Drawing Tools to import a point
// geometry and name it "point" or set the point coordinates with the
// ee.Geometry.Point() function as demonstrated here.
var point = ee.Geometry.Point([-122.292, 37.9018]);

// Import the Landsat 8 TOA image collection.
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');

// Get the least cloudy image in 2015.
var image = ee.Image(
  l8.filterBounds(point)
    .filterDate('2015-01-01', '2015-12-31')
    .sort('CLOUD_COVER')
    .first()
);

Załóżmy teraz, że chcesz obliczyć obraz znormalizowanego różnicowego wskaźnika wegetacji (NDVI) na podstawie obrazu Landsat. Roślinność odbija światło w bliskiej podczerwieni (NIR) i pochłania światło w czerwonej części widma elektromagnetycznego (więcej informacji o odbiciu światła w bliskiej podczerwieni przez roślinność). NDVI wykorzystuje te dane do utworzenia pojedynczej wartości, która w przybliżeniu odzwierciedla aktywność fotosyntetyczną zachodzącą w pikselu. Obliczenia są wykonywane według wzoru (NIR – czerwony) / (NIR + czerwony). W wyniku otrzymujemy liczbę z zakresu od 1 do -1, przy czym piksele o wysokiej aktywności fotosyntetycznej mają wysoki wskaźnik NDVI. Oto jeden ze sposobów obliczania NDVI w Earth Engine:

Edytor kodu (JavaScript)

// Compute the Normalized Difference Vegetation Index (NDVI).
var nir = image.select('B5');
var red = image.select('B4');
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI');

// Display the result.
Map.centerObject(image, 9);
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white', 'green']};
Map.addLayer(ndvi, ndviParams, 'NDVI image');

Wynik powinien wyglądać mniej więcej tak jak na rysunku 8. Zwróć uwagę, że używamy funkcji select(), którą poznaliśmy w poprzedniej sekcji dotyczącej maskowania, aby uzyskać pasma NIR i czerwone, a następnie obliczyć NDVI za pomocą operatorów matematycznych obrazu, które również widzieliśmy wcześniej w sekcji dotyczącej matematyki Image. Na koniec wyświetl obraz z paletą. W tym przypadku w palecie użyliśmy nazw kolorów zamiast ciągów szesnastkowych. (Szczegółowe informacje znajdziesz w tym zewnętrznym dokumencie na temat kolorów CSS).

Tutorial_api_08_ndvi.png
Rysunek 8. NDVI dla pojedynczej sceny Landsat. Niebieski oznacza niską, a zielony wysoką wartość NDVI.

Operacja znormalizowanej różnicy jest tak powszechna w teledetekcji, że w ee.Image dostępna jest funkcja skrótu, która przydaje się do uproszczenia kodu w poprzednim przykładzie:

Edytor kodu (JavaScript)

var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');

Mapowanie funkcji na kolekcję

Załóżmy teraz, że chcesz dodać NDVI do każdego obrazu w kolekcji obrazów. W Earth Engine można to zrobić, stosując funkcję map() do kolekcji. Nie należy mylić map() z obiektem Map. Pierwsza z nich to metoda w kolekcji, która używa map w sensie obliczeń równoległych, aby zastosować funkcję do każdego elementu w kolekcji. Funkcja definiuje operacje, które zostaną zastosowane do każdego elementu w kolekcji. W samouczku JavaScriptu pokazaliśmy prostą funkcję, ale teraz utworzymy funkcję, która zawiera funkcje Earth Engine. Możesz na przykład skopiować poprzedni kod NDVI do funkcji, która zwraca obraz wejściowy z pasmem NDVI:

Edytor kodu (JavaScript)

var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
  return image.addBands(ndvi);
};

// Test the addNDVI function on a single image.
var ndvi = addNDVI(image).select('NDVI');

Ten kod może nie być tak wydajny w przypadku obliczania NDVI dla pojedynczego obrazu, ale tę funkcję można wykorzystać jako argument dla map(), aby dodać pasmo NDVI do każdego obrazu w kolekcji. Często warto najpierw przetestować funkcję na pojedynczym obrazie, aby upewnić się, że działa zgodnie z oczekiwaniami. Po przetestowaniu funkcji na pojedynczym obrazie i stwierdzeniu, że działa zgodnie z oczekiwaniami, możesz ją zmapować na kolekcję:

Edytor kodu (JavaScript)

var withNDVI = l8.map(addNDVI);

Aby sprawdzić, czy rzeczywiście dodaje to pasmo NDVI do każdego obrazu w tej kolekcji, możesz dodać kolekcję withNDVI do mapy i sprawdzić losową lokalizację na karcie Inspektor. Zauważysz, że każdy obraz w kolekcji ma teraz pasmo o nazwie NDVI.

Tworzenie kompozycji pikseli o najbardziej zielonym odcieniu

Teraz, gdy masz już kolekcję obrazów, w której każdy obraz ma pasmo NDVI, możemy poznać nowy sposób tworzenia obrazów wielospektralnych: qualityMosaic(). Możesz zauważyć przerwy między ścieżkami Landsat, nawet w kompozycji pikseli mediany. Jednym z powodów mogą być różnice w fenologii wynikające z tego, że zdjęcia na sąsiednich ścieżkach zostały zebrane w różnych momentach (konkretnie w odstępie 8 dni). Jednym ze sposobów na zminimalizowanie tego efektu jest próba ustawienia wartości pikseli w kompozycji z mniej więcej tego samego etapu fenologicznego, na przykład czasu maksymalnej zieloności roślin (gdy liście są na drzewach i są aktywne fotosyntetycznie). Jeśli maksymalną zieleń określimy za pomocą maksymalnego NDVI, możemy użyć funkcji qualityMosaic(), aby utworzyć obraz wielospektralny, w którym każdy piksel zawiera piksel o maksymalnym NDVI z kolekcji. Teraz możesz użyć dodanego pasma NDVI w kolekcji withNDVI:

Edytor kodu (JavaScript)

// Make a "greenest" pixel composite.
var greenest = withNDVI.qualityMosaic('NDVI');

// Display the result.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};
Map.addLayer(greenest, visParams, 'Greenest pixel composite');

Wynik tego kodu powinien wyglądać mniej więcej tak jak na rysunku 9. Porównując rysunek 9 z medianą kompozytu pokazaną na rysunku 6, można zauważyć, że kompozyt z najbardziej zielonym pikselem jest rzeczywiście znacznie bardziej zielony. Jednak dokładne przyjrzenie się zbiornikom wodnym powinno ujawnić inny problem. W szczególności zbiorniki wodne wyglądają teraz na mętne. Wynika to ze sposobu działania metody qualityMosaic(): w każdej lokalizacji sprawdzany jest cały ciąg czasowy, a piksel o maksymalnej wartości w paśmie NDVI jest ustawiany jako wartość złożona. Ponieważ NDVI jest wyższy nad chmurami niż nad wodą, obszary wodne mają piksele chmur, a obszary porośnięte roślinnością są zielone, ponieważ NDVI jest najwyższy, gdy roślinność w pikselu jest aktywna fotosyntetycznie.

Tutorial_api_09_greenest.png
Rysunek 9. Landsat 8 greenest pixel composite.

Znasz już kilka sposobów tworzenia kompozycji i mozaik obrazów w Earth Engine. Możesz tworzyć kompozycje z najnowszymi wartościami, medianą lub najbardziej zielonymi pikselami z obrazów przefiltrowanych według czasu i miejsca lub wszystkich obrazów w kolekcji. Wiesz już, jak wykonywać obliczenia na zdjęciach i wyodrębniać informacje. Na następnej stronie opisujemy sposoby pobierania informacji z Earth Engine, na przykład w postaci wykresu lub zbioru danych wyeksportowanego do folderu Dysku Google.