Коллекция изображений – это набор изображений Earth Engine. Например, коллекция всех изображений Landsat 8 – это ee.ImageCollection. Как и у изображения SRTM, с которым вы работали, у коллекций изображений также есть идентификатор. Как и в случае с отдельными изображениями, вы можете узнать идентификатор коллекции изображений, выполнив поиск в каталоге данных Earth Engine в редакторе кода и посмотрев страницу сведений о наборе данных. Например, введите "landsat 8 toa" и нажмите на первый результат, который должен соответствовать набору данных
USGS Landsat 8 Collection 1 Tier 1 TOA Reflectance.
Импортируйте этот набор данных с помощью кнопки Import (Импортировать) и переименуйте его в l8 или скопируйте идентификатор в конструктор коллекции изображений:
Редактор кода (JavaScript)
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
Фильтрация коллекций изображений
Стоит отметить, что эта коллекция представляет каждую сцену Landsat 8, собранную по всей Земле. Часто бывает полезно извлечь одно изображение или подмножество изображений, на которых можно протестировать алгоритмы. Чтобы ограничить коллекцию по времени или пространству, отфильтруйте ее. Например, чтобы отфильтровать коллекцию по изображениям, охватывающим определенное местоположение, сначала определите интересующую вас область с помощью точки (или линии, или многоугольника), используя инструменты рисования геометрии. Переместитесь к интересующей вас области, наведите указатель мыши на Geometry Imports (Импорт геометрии) (если у вас уже определена одна или несколько геометрий) и нажмите +new layer (+новый слой) (если у вас нет импорта, перейдите к следующему шагу). Выберите инструмент рисования точек (
) и поставьте точку в интересующей вас области. Укажите название импорта: point. Теперь отфильтруйте коллекцию l8, чтобы получить только те изображения, которые пересекают точку, а затем добавьте второй фильтр, чтобы ограничить коллекцию только изображениями, полученными в 2015 году:
Редактор кода (JavaScript)
var spatialFiltered = l8.filterBounds(point); print('spatialFiltered', spatialFiltered); var temporalFiltered = spatialFiltered.filterDate('2015-01-01', '2015-12-31'); print('temporalFiltered', temporalFiltered);
Здесь filterBounds() и filterDate() – это сокращенные методы для более общего метода filter() в коллекциях изображений, который принимает ee.Filter() в качестве аргумента. Чтобы узнать больше об этих методах, откройте вкладку Docs (Документы) в редакторе кода. Аргумент для filterBounds() – это оцифрованная точка, а аргументы для filterDate() – две даты, выраженные в виде строк.
Обратите внимание, что вы можете print() отфильтрованные коллекции. За один раз можно напечатать не более 5000 объектов, поэтому вы не сможете, например, распечатать всю коллекцию l8. После выполнения метода print() вы можете проверить напечатанные коллекции в консоли. Обратите внимание, что если вы развернете ImageCollection с помощью значка , а затем развернете список
features, то увидите список изображений, каждое из которых также можно развернуть и проверить. Это один из способов узнать идентификатор отдельного изображения. Другой, более программный способ получить отдельные изображения для анализа – отсортировать коллекцию, чтобы получить самое последнее, самое старое или оптимальное изображение относительно некоторого свойства метаданных. Например, изучая объекты изображений в коллекциях печатных изображений, вы могли заметить свойство метаданных CLOUD_COVER. Вы можете использовать это свойство, чтобы получить наименее облачное изображение в 2015 году в интересующей вас области:
Редактор кода (JavaScript)
// This will sort from least to most cloudy. var sorted = temporalFiltered.sort('CLOUD_COVER'); // Get the first (least cloudy) image. var scene = sorted.first();
Теперь вы можете показать изображение.
Отступление: отображение RGB-изображений
Когда на карту добавляется многоканальное изображение, Earth Engine выбирает первые три канала и по умолчанию отображает их как красный, зеленый и синий, растягивая их в соответствии с типом данных, как описано выше. Обычно это не дает нужного результата. Например, если вы добавите на карту изображение Landsat (scene в предыдущем примере), результат будет неудовлетворительным:
Редактор кода (JavaScript)
Map.centerObject(scene, 9); Map.addLayer(scene, {}, 'default RGB');
Обратите внимание, что сначала карта центрируется по изображению с коэффициентом масштабирования 9. Затем изображение показывается с пустым объектом ({}) для параметра visParams (подробности см. в документации по Map.addLayer()). В результате изображение отображается с визуализацией по умолчанию: первые три полосы сопоставляются с R, G, B соответственно и растягиваются до [0, 1], поскольку полосы имеют тип данных float. Это означает, что прибрежный аэрозольный канал (B1) отображается красным, синий канал (B2) – зеленым, а зеленый канал (B3) – синим. Чтобы получить полноцветную композицию, нужно указать Earth Engine, что для красного, зеленого и синего каналов должны использоваться каналы Landsat 8 B4, B3 и B2 соответственно. Укажите, какие диапазоны использовать, с помощью свойства bands объекта visParams. Подробнее о каналах Landsat можно узнать в этом справочном материале.
Также необходимо указать значения min и max, подходящие для отображения отражательной способности типичных объектов на поверхности Земли. Хотя списки можно использовать для указания разных значений для каждого диапазона, здесь достаточно указать 0.3 как max и использовать значение по умолчанию, равное нулю, для параметра min. Объединение параметров визуализации в один объект и отображение:
Редактор кода (JavaScript)
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3}; Map.addLayer(scene, visParams, 'true-color composite');
Результат должен выглядеть примерно так, как показано на рисунке 5. Обратите внимание, что этот код присваивает объект параметров визуализации переменной для возможного использования в будущем. Как вы скоро узнаете, этот объект будет полезен при визуализации коллекций изображений.
Попробуйте визуализировать разные диапазоны. Ещё одна популярная комбинация – B5, B4 и B3. Она называется композитным изображением в условных цветах. Другие интересные композитные изображения в условных цветах описаны здесь.
Поскольку Earth Engine предназначен для крупномасштабного анализа, вы не ограничены работой только с одной сценой. Теперь давайте отобразим всю коллекцию в виде композитного RGB-изображения.
Показ коллекций изображений
Добавление коллекции изображений на карту похоже на добавление изображения на карту. Например, если использовать изображения 2016 года в коллекции l8 и объекте visParams, определенных ранее,
Редактор кода (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');
Обратите внимание, что теперь вы можете уменьшить масштаб и увидеть непрерывную мозаику, где собраны снимки Landsat (т.е. над сушей). Обратите внимание, что если вы откроете вкладку Inspector (Инспектор) и нажмете на изображение, то в разделе Pixels (Пиксели) появится список значений пикселей (или диаграмма), а в разделе Objects (Объекты) – список объектов изображения.
Если вы достаточно уменьшили масштаб, то, вероятно, заметили на мозаике облака. При добавлении ImageCollection на карту он отображается как композит последних значений, то есть отображаются только самые последние пиксели (как при вызове mosaic() в коллекции). Поэтому между путями, полученными в разное время, могут быть разрывы. По этой же причине многие области могут выглядеть облачными. На следующей странице вы узнаете, как изменить способ объединения изображений, чтобы избавиться от облаков.