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

Палитра NDVI

Свойства снимка:

Сохранение скриптов

Сохраняем скрипт нажатием Save в центральной панели редактора:

Всего за время работы я сохранил три скрипта. Это видно во вкладке "Scripts" левой панели редактора:

Для скачивания текущего скрипта выберем из списка Get Link пункт Manage Links

Подтвердим выбор скрипта и нажмем Download:

Что делать дальше?

  • Читать документацию на сайте разработчиков.
  • Знакомиться с примерами, которые можно найти во вкладке Scripts редактора кода:



Комментарии

comments powered by Disqus