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

Wcześniej dowiedzieliśmy się, jak uzyskać poszczególne sceny Landsat, wykonując na przykład te czynności, gdzie l8point 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, że chcesz obliczyć obraz znormalizowanego różnicowego wskaźnika wegetacji (NDVI) na podstawie obrazu Landsat. Roślinność odbija światło w zakresie bliskiej podczerwieni (NIR) widma elektromagnetycznego i pochłania światło w zakresie czerwonym (więcej informacji o odbiciu światła NIR przez roślinność). NDVI używa tego do utworzenia pojedynczej wartości, która w przybliżeniu odzwierciedla aktywność fotosyntetyczną zachodzącą w pikselu. Oblicza się go w następujący sposób: (NIR – czerwony) / (NIR + czerwony). W wyniku tego otrzymujemy liczbę z zakresu od 1 do -1, gdzie 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ć podobnie do tego na rysunku 8. Zauważ, że do uzyskania pasm NIR i czerwonego używamy funkcji select(), o której pisaliśmy w poprzedniej sekcji dotyczącej maskowania. Następnie obliczamy NDVI za pomocą operatorów matematycznych obrazu, które znasz już z sekcji dotyczącej Imagematematyki. Na koniec wyświetl obraz z paletą. W palecie użyliśmy nazw kolorów zamiast ciągów szesnastkowych. (Szczegółowe informacje znajdziesz w tym zewnętrznym artykule na temat kolorów CSS).

Tutorial_api_08_ndvi.png
Rysunek 8. NDVI dla pojedynczej sceny Landsat. Niebieski oznacza niski, a zielony wysoki wskaźnik NDVI.

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

Edytor kodu (JavaScript)

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

Mapowanie funkcji na kolekcję

Załóżmy, że chcesz dodać NDVI do każdego obrazu w kolekcji obrazów. W Earth Engine można to zrobić, map() funkcję w kolekcji. Nie myl obiektu map() z obiektem Map. Pierwsza z nich to metoda w kolekcji, która używa funkcji mapkontekście obliczeń równoległych, czyli stosuje funkcję do każdego elementu w kolekcji. Funkcja określa operacje, które będą stosowane do każdego elementu w kolekcji. W samouczku dotyczącym JavaScriptu pojawiła się prosta funkcja, ale teraz utworzymy funkcję, która będzie zawierać funkcje Earth Engine. Na przykład skopiuj 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 tej funkcji można użyć jako argumentu w funkcji map(), aby dodać pasmo NDVI do każdego obrazu w kolekcji. Często warto najpierw przetestować funkcję na jednym obrazie, aby upewnić się, że działa zgodnie z oczekiwaniami. Po przetestowaniu funkcji na pojedynczym obrazie i upewnieniu się, że działa zgodnie z Twoimi oczekiwaniami, możesz zastosować ją do całej kolekcji:

Edytor kodu (JavaScript)

var withNDVI = l8.map(addNDVI);

Aby sprawdzić, czy w każdym obrazie w tej kolekcji znajduje się pasmo NDVI, możesz dodać withNDVI kolekcję do mapy i sprawdzić losową lokalizację na karcie Narzędzie do sprawdzania. Każdy obraz w kolekcji powinien mieć teraz pasmo o nazwie NDVI.

Tworzenie kompozycji z najbardziej zielonych pikseli

Teraz, gdy masz już kolekcję obrazów, w której każdy obraz ma pasmo NDVI, możemy poznać nowy sposób tworzenia kompozycji: qualityMosaic(). Możesz zauważyć nieciągłości między ścieżkami Landsat, nawet w kompozycji mediany pikseli. Częściowo może to wynikać z różnic w fenologii, ponieważ obrazy na sąsiednich ścieżkach są zbierane w różnych terminach (dokładnie z 8-dniowym odstępem). Jednym ze sposobów na zminimalizowanie tego problemu jest próba ustawienia wartości pikseli w kompozycji na podstawie danych z mniej więcej tego samego etapu fenologicznego, np. okresu maksymalnej zieleni roślin (gdy liście są rozwinięte i aktywne fotosyntetycznie). Jeśli maksymalną zieloność zdefiniujemy jako maksymalny wskaźnik NDVI, możemy użyć funkcji qualityMosaic(), aby utworzyć kompozycję, w której każdy piksel zawiera piksel o maksymalnym wskaźniku NDVI z kolekcji. Teraz możesz korzystać z dodatkowego 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 działania tego kodu powinien wyglądać podobnie do tego na rysunku 9. Porównując rysunek 9 ze średnią kompozycją pikseli przedstawioną na rysunku 6, można zauważyć, że kompozycja pikseli o największej ilości zieleni jest rzeczywiście znacznie bardziej zielona. Jednak dokładne zbadanie zbiorników wodnych powinno ujawnić inny problem. W szczególności zbiorniki wodne są teraz zamglone. Wynika to ze sposobu działania metody qualityMosaic(): w każdej lokalizacji analizowany jest cały ciąg czasowy, a piksel o najwyższej wartości w paśmie NDVI jest ustawiany jako wartość złożona. Ponieważ wskaźnik NDVI jest wyższy w przypadku chmur niż wody, obszary wodne są pokryte pikselami chmur, a obszary porośnięte roślinnością są zielone, ponieważ wskaźnik NDVI jest najwyższy, gdy roślinność w pikselu jest aktywna fotosyntetycznie.

Tutorial_api_09_greenest.png
Rysunek 9. Kompozycja najbardziej zielonych pikseli z Landsata 8.

Znasz już kilka sposobów łączenia i mozaikowania obrazów w Earth Engine. Możesz tworzyć kompozycje z ostatnich wartości, mediany lub najbardziej zielonych pikseli na podstawie obrazów filtrowanych według czasu i miejsca lub wszystkich obrazów w kolekcji. Wiesz już, jak przeprowadzać obliczenia na podstawie zdjęć i wyodrębniać informacje. Na następnej stronie znajdziesz informacje o tym, jak uzyskać dane z Earth Engine, np. w postaci wykresu lub zbioru danych wyeksportowanego do folderu na Dysku Google.