Для использования 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