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. Растительность отражает свет в ближней инфракрасной (NIR) области электромагнитного спектра и поглощает свет в красной ( Узнайте больше об отражении NIR растительностью ). NDVI использует это для создания единого значения, приблизительно отражающего фотосинтетическую активность, происходящую в пикселе. Расчет производится по формуле (NIR - красный) / (NIR + красный). Результатом является число от 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 на карту и запросить случайное местоположение с помощью вкладки «Инспектор» . Вы должны заметить, что теперь каждое изображение в коллекции имеет диапазон с именем 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 Диска.