Загрузив коллекцию отражательной способности Landsat 8 TOA в переменную 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 дней. Это означает, что за 6 месяцев будет получено примерно 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
на вкладке «Документация» редактора кода. При выборе редуктора для коллекции изображений обратите внимание, что выходными данными является изображение, поэтому редукторы с нечисловыми выходными данными, например, редукторы histogram
или toList
, не будут работать с коллекцией изображений.

При уменьшении масштаба медианного композита вы должны увидеть что-то вроде рисунка 6. Это должно выглядеть значительно лучше, чем недавний композит значений, который вы сделали ранее. На этом этапе стоит сделать шаг назад и рассмотреть, что было сделано для создания этого медианного композита. Earth Engine загрузил всю коллекцию Landsat 8 по континентальной части США и рассчитал медиану для каждого пикселя. Это очень много данных! Конечно, вы можете вычислить годовые медианы, предварительно отфильтровав коллекцию, как вы делали ранее . Дело в том, что если бы вам пришлось загружать все эти снимки и создавать этот композит, это был бы большой проект. С Earth Engine вы получаете результат за считанные секунды!
Подробнее о композиции и мозаике можно узнать здесь .
Маскировка
Хотя медианный композитный метод является улучшением по сравнению с композитным методом на основе недавних значений, может возникнуть необходимость замаскировать части изображения. Маскирование пикселей на изображении делает их прозрачными и исключает их из анализа. Каждый пиксель в каждой полосе изображения имеет маску. Пиксели со значением маски 0 или ниже будут прозрачными. Пиксели со значением маски выше 0 будут визуализированы. Маска изображения задаётся с помощью вызова типа image1.mask(image2)
. Этот вызов принимает значения image2
и делает их маской для image1
. Все пиксели в image2
со значением 0 будут сделаны прозрачными в image1
.
Например, предположим, что вы хотите замаскировать все пиксели воды в медианном композите. Маску воды можно создать с помощью набора данных, описанного Хансеном и др. (2013) , который находится в каталоге данных 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_2015'); // 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 в результирующем изображении.
В результате такого маскирования все пиксели в медианном композите, находящиеся над сушей (согласно набору данных Хансена и др. ), видны, но те, которые находятся над водой (или не содержат данных), прозрачны и будут исключены из любого анализа, который вы выполните на maskedComposite
изображении.
Мозаика
Комбинируя концепции коллекций изображений, логических операторов, маскирования и композитинга, можно добиться интересных картографических результатов. Например, предположим, что вам нужно изображение, на котором пиксели суши отображаются в режиме True Color, а все остальные пиксели — синим цветом. Вы можете сделать следующее:
Редактор кода (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()
изображение преобразуется в 3-канальное 8-битное изображение в соответствии с переданными параметрами визуализации. Параметры визуализации по умолчанию отлично подходят для 3-канальных 8-битных изображений, поэтому при добавлении изображения на карту параметры визуализации не требуются. Результат должен выглядеть так, как показано на рисунке 7.

К этому моменту вы познакомились со способами визуализации коллекций изображений в виде композитов с недавними значениями, методами создания композитов с использованием редукторов и методами создания пользовательских композитов путем маскирования и мозаики коллекции изображений. На следующей странице вы узнаете, как добавить индекс растительности к каждому изображению в коллекции и использовать его для создания композита «самый зеленый пиксель».