Для использования Google Earth Engine нужно иметь аккаунт в Goolge, заполнить регистрационную форму и ждать письма подтверждения. Если окажется, что вместо формы на указанной странице написано нечто вроде "We're glad you're interested. Keep an eye on your inbox ...", то можно сразу приступать к работе.
Самый простой способ познакомится с Earth Engine — начать использовать JavaScript API. Краткое введение в JavaScript есть здесь. Мы постараемся быть еще короче.
Идем в редактор кода (Code Editor) и набираем в центральном окне (New Script)
print('Hello World!');
Жмем Run и получаем в консоли:
Еще немного JavaScript:
- Определение переменной начинается с
var
:
var new_variable = ...
- Любая операция в JavaScript оканчивается
;
. - Строка комментария начинается с
//
.
Все вместе это работает так:
// Создадим числовую переменную number.
var number = 2;
print('The answer is:', number);
Структуры данных
Для хранения географических данных Earth Engine использует типы Image
и Feature
. Растровые данные Image
— изображения или снимки — состоят из каналов (bands) и словаря свойств. Векторные данные Feature
, или попросту векторы, состоят из описания геометрии объекта (Geometry
) и словаря свойств. Стек снимков (например, временной ряд из снимков) хранится в коллекции снимков ImageCollection
. Коллекция векторов Feature
называется FeatureCollection
.
Основными типами данных в Earth Engine являются Dictionary
, List
, Array
, Date
, Number
и String
. Важно запомнить, что все это — серверные объекты и они не находятся на вашей (клиентской) машине.
Серверные классы
Имена серверных классов начинаются с ee.
. Представим себе ee.объект
как контейнер для объекта, размещенный на сервере.
// Зададим строку и поместим ее в EE-контейнер.
var aString = 'To the cloud!';
var eeString = ee.String(aString);
print('Where to?', eeString);
В примере мы сначала задаем обычную строку, а затем помещаем ее в серверный контейнер, но можно сделать и все сразу:
// Зададим строку на сервере.
var serverString = ee.String('This is on the server.');
Действия
Есть несколько способов сделать что-либо с помощью API:
- вызвать метод, привязанный к объекту;
- вызвать алгоритм;
- вызвать специальную функцию Code Editor;
- создать и вызвать собственную функцию.
Отображение на карте
Карта Map
— объект, на котором данные располагаются слоями (layer). Возьмем
хранящийся на сервере (ee.Image
) снимок спутника Landsat-8 и добавим его на карту в качестве нового слоя Map.addLayer()
:
// Загрузим снимок.
var image = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_177026_20140728');
// Центрируем карту по снимку.
Map.centerObject(image, 8);
// Покажем снимок на карте.
Map.addLayer(image);
Не слишком красиво? Настроим отображение снимка:
// Загрузим снимок.
var image = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_177026_20140728');
// Параметры отображения снимка.
var vizParams = {bands: ['B4', 'B3', 'B2'], min: 0, max: 0.3};
// Центрируем карту и покажем снимок.
Map.centerObject(image, 8);
Map.addLayer(image, vizParams, 'Landsat 8 Natural Colors');
В переменной vizParams
задаем отображаемые каналы снимка (bands
). Сейчас нам нужны каналы, соответствующие основным цветам: красному ('B4'
), зеленому ('B3'
) и синему ('B2'
). Обозначения каналов Landsat-8 можно посмотреть здесь.
Параметры min
и max
указывают границы отражательной способности (reflectance) объектов на поверхности Земли. Границы для каждого из каналов можно задать списком.
Кстати, vizParams
— это словарь, то есть объект, состоящий из пар ключ:значение. Ключи здесь: bands
, min
и max
, а значения — список ['B4', 'B3', 'B2']
и числа 0 и 0.3.
Импорт готовой коллекции
В каталоге Earth Engine Data Catalog хранятся готовые коллекции снимков и векторов. Наберем в поле поиска ‘Landsat 8’ и увидим множество вариантов:
Кликнем "USGS Landsat 8 Collection 1 Tier 1 TOA Reflectance". В новом окне появится информация о выбранной коллекции. Нажмем Import, чтобы импортировать ее.
Текст вверху скрипта сообщает, что импортированная коллекция сохранена в серверной переменной imageCollection
. Имя переменной можно изменить.
Фильтрация и сортировка коллекции
Выберем из коллекции снимки определенной местности. Для этого в нужном месте поставим на карте маркер. Как только это будет сделано, в скрипт импортируется объект-точка.
Переименуем точку в mypoint
и отфильтруем по ней коллекцию. Применим к коллекции два фильтра: снимки должны покрывать заданную точку (.filterBounds
) и быть сделаны в определенном интервале дат (.filterDate
).
Результат отсортируем по мере увеличения облачности и выберем из коллекции первый, самый безоблачный снимок.
var start = ee.Date('2014-06-01');
var finish = ee.Date('2014-10-01');
var filteredCollection = imageCollection
.filterBounds(mypoint)
.filterDate(start, finish)
.sort('CLOUD_COVER', true);
var image = filteredCollection.first();
Снимки коллекции представляют собой список, хранящийся в ее свойстве features
. Снимок удобно выбирать по ID. В нашем первом примере с картой мы так и поступили.
Добавим к скрипту уже известный код визуализации:
var vizParams = {bands: ['B4', 'B3', 'B2'], min: 0, max: 0.3};
Map.centerObject(image, 8);
Map.addLayer(image, vizParams, 'Landsat 8 Natural Colors');
Работа с каналами
В качестве примера работы с отдельными каналами снимка, расчитаем NDVI. Для этого создадим и применим функцию:
// Функция для вычисления NDVI Landsat-8
var getNDVI = function(image) {
return image.normalizedDifference(['B5', 'B4']);
};
// Вычислим NDVI.
var ndvi = getNDVI(image);
Как вывести результат на карту мы уже знаем:
// Покажем результат.
Map.centerObject(image, 8);
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white', 'green']};
Map.addLayer(ndvi, ndviParams, 'NDVI Image');
Небольшие изменения коснулись диапазона значений NDVI и палитры изображения. Подробнее о настройках отображения снимков написано здесь.
Итогом наших усилий станет карта, состоящая из двух слоев:
Загрузка пользовательских данных
Пользовательские данные загружаются во вкладке Assets левой панели редактора кода:
Загрузим векторные границы города в виде шейпфайла dp.shp в проекции EPSG 4326. Вот как это выглядит:
Загруженные данные импортируем в скрипт:
и получим:
Дальше совсем просто: обрежем ndvi
методом clip
и отобразим результат на карте:
var clipped = ndvi.clip(dp);
Map.centerObject(mypoint, 11);
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white', 'green']};
Map.addLayer(clipped, ndviParams);
Экспорт результатов
Следующий код экспортирует NDVI на Google Drive пользователя:
Export.image.toDrive({
image: clipped,
description: 'NDVIToCOGeoTiff',
scale: 30,
fileFormat: 'GeoTIFF'
});
После выполнения кода во вкладке "Tasks" правой панели редактора будет создана новая задача:
Жмем Run для запуска задачи. Вскоре появится окошко, где можно задать параметры изображения:
Скачанный с Google Drive снимок можно посмотреть в QGIS:
Свойства снимка:
Сохранение скриптов
Сохраняем скрипт нажатием Save в центральной панели редактора:
Всего за время работы я сохранил три скрипта. Это видно во вкладке "Scripts" левой панели редактора:
Для скачивания текущего скрипта выберем из списка Get Link пункт Manage Links
Подтвердим выбор скрипта и нажмем Download:
Что делать дальше?
- Читать документацию на сайте разработчиков.
- Знакомиться с примерами, которые можно найти во вкладке Scripts редактора кода:
Комментарии
comments powered by Disqus