Если коллекция Landsat 8 TOA reflectance загружена в переменную l8, то следующий код позволяет получить композитное изображение с последними значениями:
Редактор кода (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');
Одна из проблем с этим композитным изображением заключается в том, что на нем много облаков. Вместо того чтобы просто взять последний пиксель в коллекции (когда вы добавляете коллекцию на карту, Earth Engine неявно вызывает для нее mosaic()), вы можете уменьшить ImageCollection (подробнее об уменьшении коллекций изображений).
Композиция с редукторами
Вы впервые познакомились с редукторами для получения статистики в области изображения. Это было пространственное сокращение. Преобразование коллекции изображений в одно изображение – это временное преобразование, когда коллекция представляет изображения за определенный период времени. Тип используемого Reducer определяет, как Earth Engine обрабатывает перекрывающиеся пиксели. Landsat 8 посещает одно и то же место на Земле каждые 16 дней. Это значит, что за шесть месяцев будет сделано примерно 12 снимков (и больше, если сцены перекрываются). Каждый пиксель на карте получен из набора пикселей – по одному из каждого изображения в отображаемой коллекции.
Если просто добавить коллекцию на карту, будет выбран самый последний пиксель – из последнего изображения в стеке. Это поведение можно изменить с помощью редукторов Earth Engine. Например, вместо того чтобы взять самый последний пиксель из стека, Earth Engine можно указать выбрать медианное значение в стеке. Это позволяет удалить облака (которые имеют высокое значение) и тени (которые имеют низкое значение). Когда коллекция изображений уменьшается с помощью медианного редуктора, составное значение представляет собой медиану в каждой полосе за определенный период времени. Например, при использовании снимков Landsat за 2016 год:
Редактор кода (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');
Новым в этом коде является метод median(), примененный к коллекции изображений.
Как и методы фильтрации, это сокращение для более общего метода reduce() в коллекциях изображений, который принимает ee.Reducer() в качестве аргумента. Список всех редукторов Earth Engine можно найти в пакете ee.Reducer на вкладке Docs (Документы) редактора кода. При выборе редуктора для коллекции изображений обратите внимание, что на выходе получается изображение, поэтому редукторы с нечисловыми выходными данными, например histogram или toList, не будут работать с коллекцией изображений.
Когда вы уменьшите масштаб медианного композита, вы должны увидеть что-то похожее на рисунок 6. Это должно выглядеть значительно лучше, чем композит недавних значений, который вы сделали ранее. На этом этапе стоит сделать шаг назад и подумать, что было сделано для создания медианного композита. Earth Engine загрузил всю коллекцию Landsat 8 по континентальной части США и рассчитал медиану для каждого пикселя. Это очень большой объем информации. Конечно, вы можете вычислить годовые медианы, сначала отфильтровав коллекцию, как вы делали ранее. Если бы вам пришлось скачивать все эти снимки и составлять из них композитное изображение, это заняло бы много времени. С Earth Engine вы получите результат за секунды!
Подробнее о композиции и мозаике…
Маски
Хотя медианный композит является улучшением по сравнению с композитом недавнего значения, вы можете замаскировать части изображения. Маскирование пикселей на изображении делает их прозрачными и исключает из анализа. У каждого пикселя в каждой полосе изображения есть маска. Пиксели со значением маски 0 или меньше будут прозрачными. Отрисовываются только те пиксели, у которых значение маски больше нуля. Маска изображения задается с помощью вызова image1.mask(image2). Этот вызов принимает значения image2 и делает их маской image1. Все пиксели в image2, имеющие значение 0, станут прозрачными в image1.
Например, предположим, что вы хотите замаскировать все пиксели воды в медианном композите. Маску воды можно создать с помощью набора данных, описанного в статье Hansen et al. (2013), который находится в Data Catalog Earth Engine. Подробнее о наборе данных Хансена и др. рассказывается в этом руководстве. В этом наборе данных вода имеет значение 2, суша – 1, а "нет данных" – 0. Используйте логику, чтобы создать изображение маски, в котором нули будут там, где нет суши:
Редактор кода (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');
В этом коде есть несколько новых элементов, о которых стоит рассказать подробнее. Во-первых, функция select() позволяет извлечь из изображения нужные диапазоны. Здесь мы выбираем только нужный диапазон: datamask. Далее следует логический оператор eq(), который означает "равно". Мы используем eq(1), чтобы создать бинарное изображение, в котором все пиксели, не имеющие значения 1 в полосе datamask (то есть вода или отсутствие данных), получают значение 0 в результирующем изображении.
В результате маскирования все пиксели медианного композитного изображения, которые находятся над сушей (согласно набору данных Хансена и др.), видны, а те, которые находятся над водой (или nodata), прозрачны и будут исключены из любого анализа, который вы проводите на изображении maskedComposite.
Мозаика
Объединяя концепции коллекций изображений, логических операторов, маскирования и композитинга, вы можете получать интересные картографические результаты. Например, если вы хотите получить изображение, на котором пиксели суши отображаются в естественных цветах, а все остальные пиксели – синим, вы можете сделать следующее:
Редактор кода (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');
В этом коде много всего, поэтому давайте разберем его. Сначала мы используем логический оператор not(), чтобы инвертировать маску, которую мы создали ранее. В частности, not() превращает все нули в единицы, а все ненулевые значения – в нули. Называть эту переменную water не совсем правильно, поскольку она также включает некоторые пиксели nodata, но в данном картографическом контексте это допустимо. Теперь нужно замаскировать воду самой водой. В результате получается изображение, в котором все пиксели воды равны 1, а все остальное замаскировано. Последний шаг – объединить изображения с помощью mosaic(). Поскольку mosaic() работает с коллекцией изображений, мы передаем список изображений, которые хотим объединить, в конструктор коллекции изображений, а затем вызываем mosaic() в качестве последнего шага. Порядок изображений в списке имеет значение. В частности, выходное изображение будет содержать последний немаскированный пиксель из стека изображений во входной коллекции. В данном случае это работает, потому что слой воды является последним (верхним) изображением в коллекции и содержит только немаскированные пиксели, где есть вода.
Обратите внимание, что изображения в коллекции являются визуализациями. При вызове visualize() для изображения оно преобразуется в трехполосное 8-битное изображение в соответствии с переданными вами параметрами визуализации. Параметры визуализации по умолчанию подходят для 3-канальных 8-битных изображений, поэтому при добавлении изображения на карту параметры визуализации не требуются. Результат должен выглядеть как на рисунке 7.
На данный момент вы видели способы визуализации коллекций изображений в виде композитов с недавними значениями, методы компоновки коллекций изображений с использованием редукторов и методы создания пользовательских композитов путем маскирования и мозаики коллекции изображений. На следующей странице вы узнаете, как добавить индекс растительности к каждому изображению в коллекции и использовать его для создания композитного изображения с самыми зелеными пикселями.