NDVI, сопоставление функции с коллекцией, мозаика качества

Ранее вы узнали, как получить отдельные снимки Landsat, выполнив примерно следующее, где l8 и point – это импортированные данные, представляющие коллекцию Landsat 8 TOA и геометрию интересующей области:

Редактор кода (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()
);

Предположим, что теперь вы хотите вычислить нормализованный относительный индекс растительности (NDVI) на основе изображения Landsat. Растительность отражает свет в ближней инфракрасной (БИК) части электромагнитного спектра и поглощает свет в красной части (подробнее об отражении БИК-излучения растительностью). NDVI использует это для создания единого значения, примерно отражающего фотосинтетическую активность, происходящую в пикселе. Рассчитывается по формуле (NIR - red) / (NIR + red). В результате получается число от 1 до -1, где пиксели с высокой фотосинтетической активностью имеют высокий NDVI. Вот один из способов рассчитать NDVI в Earth Engine:

Редактор кода (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');

Результат должен выглядеть примерно так, как показано на рисунке 8. Обратите внимание, что мы используем функцию select(), о которой вы узнали в предыдущем разделе о маскировании, чтобы получить ближний инфракрасный и красный диапазоны, а затем вычисляем NDVI с помощью математических операторов изображений, которые вы также видели ранее в разделе о математике Image. Наконец, отобразите изображение с палитрой. В этом примере мы использовали названия цветов вместо шестнадцатеричных кодов. Подробнее о цветах CSS…

Tutorial_api_08_ndvi.png
Рисунок 8. NDVI для одной сцены Landsat. Синий цвет соответствует низкому значению NDVI, а зеленый – высокому.

Операция нормализованной разности настолько распространена в дистанционном зондировании, что в ee.Image есть функция быстрого доступа, которая позволяет упростить код из предыдущего примера:

Редактор кода (JavaScript)

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

Применение функции к коллекции

Предположим, что вы хотите добавить NDVI к каждому изображению в коллекции. В Earth Engine для этого нужно map() функцию к коллекции. Не путайте map() с объектом Map. Первый – это метод коллекции, который использует map в смысле параллельных вычислений, применяя функцию к каждому элементу коллекции. Функция определяет операции, которые будут применены к каждому элементу коллекции. Вы уже видели простую функцию в руководстве по JavaScript, но теперь мы создадим функцию, которая включает функциональность Earth Engine. Например, скопируйте предыдущий код NDVI в функцию, которая возвращает входное изображение с полосой NDVI:

Редактор кода (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');

Этот код может быть не столь эффективен для вычисления NDVI для одного изображения, но эту функцию можно использовать в качестве аргумента для map(), чтобы добавить полосу NDVI к каждому изображению в коллекции. Часто бывает полезно сначала протестировать функцию на одном изображении, чтобы убедиться, что она работает так, как вы ожидаете. Протестировав функцию на отдельном изображении и убедившись, что она работает правильно, вы можете применить ее ко всей коллекции:

Редактор кода (JavaScript)

var withNDVI = l8.map(addNDVI);

Чтобы убедиться, что это действительно добавляет полосу NDVI к каждому изображению в этой коллекции, вы можете добавить коллекцию withNDVI на карту и запросить случайное местоположение с помощью вкладки Inspector. Вы заметите, что у каждого изображения в коллекции теперь есть полоса NDVI.

Создание композитного изображения с самыми зелеными пикселями

Теперь, когда вы создали коллекцию изображений, в которой у каждого изображения есть полоса NDVI, мы можем изучить новый способ создания композитных изображений: qualityMosaic(). Вы могли заметить разрывы между траекториями Landsat, даже в медианном составном изображении. Частично это может быть связано с различиями в фенологии, поскольку изображения на соседних путях собираются в разное время (в частности, с интервалом в 8 дней). Один из способов минимизировать это – попытаться установить значения пикселей в композите примерно на одной и той же фенологической стадии, например во время максимальной зелени растений (когда листья находятся на стадии фотосинтеза). Если мы определим максимальную зелень по максимальному NDVI, мы можем использовать qualityMosaic(), чтобы создать композит, в котором каждый пиксель содержит максимальный пиксель NDVI из коллекции. Теперь вы можете использовать добавленный канал NDVI в коллекции withNDVI:

Редактор кода (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');

Результат выполнения этого кода должен выглядеть примерно так, как показано на рисунке 9. Сравните рисунок 9 с медианным составным изображением, показанным на рисунке 6. Обратите внимание, что составное изображение с самыми зелеными пикселями действительно намного зеленее. Однако при внимательном рассмотрении водоемов становится очевидной другая проблема. В частности, водоемы теперь выглядят мутными. Это связано с тем, как работает метод qualityMosaic(): в каждом местоположении исследуется весь временной ряд, а пиксель с максимальным значением в полосе NDVI устанавливается в качестве составного значения. Поскольку NDVI над облаками выше, чем над водой, водные области получают облачные пиксели, в то время как области с растительностью кажутся зелеными, потому что NDVI является самым высоким, когда растительность в пикселе фотосинтетически активна.

Tutorial_api_09_greenest.png
Рисунок 9. Композитное изображение Landsat 8 с самыми зелеными пикселями.

Теперь вы знаете несколько способов создания композитных и мозаичных изображений в Earth Engine. Вы можете создавать композитные изображения на основе последних значений, медианных значений или самых зеленых пикселей из изображений, отфильтрованных по времени и месту, или из всех изображений в коллекции. Вы научились выполнять вычисления на основе снимков и извлекать информацию. На следующей странице рассказывается о том, как получить информацию из Earth Engine, например в виде диаграммы или набора данных, экспортированного в папку Google Диска.