Начните работу с Earth Engine

Это руководство по началу работы предназначено для быстрого начала программирования с помощью API JavaScript Earth Engine. Вводный обзор JavaScript и более подробные упражнения с API Earth Engine см. в учебных пособиях . Рекомендуемый стиль кодирования JavaScript см. в Руководстве по стилю JavaScript Google .

Google Earth Engine позволяет пользователям запускать алгоритмы на основе изображений с географической привязкой и векторов, хранящихся в инфраструктуре Google. API Google Earth Engine предоставляет библиотеку функций, которые можно применять к данным для отображения и анализа. Каталог общедоступных данных Earth Engine содержит большое количество общедоступных наборов изображений и векторных данных. Частные активы также можно создавать в личных папках пользователей.

Как использовать эти документы

Документация Earth Engine предназначена для людей, знакомых с анализом геопространственных данных. Документы в основном структурированы по типам данных. Например, левая панель навигации содержит ссылки на разделы или страницы, посвященные важным типам данных, таким как Image , ImageCollection , Feature , FeatureCollection , Geometry , Reducer , Chart , Join и Array . В этом руководстве описано только достаточно информации об этих типах, чтобы вы могли начать работу. Есть также разделы, посвященные машинному обучению , специализированным алгоритмам или алгоритмам, специфичным для датчиков ( например, алгоритмы Landsat ), общедоступным приложениям , управлению данными (активами) и важной информации о внутренней работе Earth Engine . Прежде чем погрузиться в это, начните здесь!

Редактор кода

Редактор кода — это интерактивная среда для разработки приложений Earth Engine (рис. 1). На центральной панели имеется редактор кода JavaScript. Над редактором расположены кнопки сохранения текущего скрипта, его запуска и очистки карты. Кнопка «Получить ссылку» генерирует уникальный URL-адрес сценария в адресной строке. Карта на нижней панели содержит слои, добавленные скриптом. Вверху находится поле поиска наборов данных и мест. Левая панель содержит примеры кода, ваши сохраненные сценарии, ссылку на API с возможностью поиска и менеджер активов для личных данных. На правой панели есть инспектор для запроса карты, консоль вывода и менеджер длительно выполняющихся задач. Кнопка в правом верхнем углу содержит ссылки на это руководство и другие ресурсы для получения помощи. Дополнительные сведения см. в руководстве по редактору кода и в руководстве «Помощь» .

Редактор кода
Рис. 1. Редактор кода Earth Engine на code.earthengine.google.com.

Открытие и запуск кода в редакторе кода

Приведенные ниже шаги демонстрируют, как открыть Earth Engine и выполнить собственный скрипт, отображающий изображение. Для достижения наилучших результатов вы можете установить последнюю версию Chrome, веб-браузера Google, доступную здесь .

  1. Откройте редактор кода Earth Engine здесь: code.earthengine.google.com .
  2. Перейдите на вкладку «Сценарии» , расположенную в крайнем левом углу редактора кода. Там вы найдете коллекцию примеров скриптов, которые получают доступ, отображают и анализируют данные Earth Engine.
  3. В разделе «Коллекция изображений» выберите пример «Фильтрованная композиция». Вы увидите скрипт на центральной консоли. Нажмите кнопку «Выполнить» , чтобы выполнить скрипт. В примере «Фильтрованное соединение» выбираются изображения Landsat 7, которые пересекаются или находятся в пределах границ Колорадо и Юты. Затем он отображает полноцветную композицию выбранных изображений. В примерах представлены часто используемые методы, такие как filter() , clip() и Map.addLayer() .

Структуры данных Earth Engine

Двумя наиболее фундаментальными структурами географических данных в Earth Engine являются Image и Feature соответствующие типам растровых и векторных данных соответственно. Изображения состоят из полос и словаря свойств. Объекты состоят из Geometry и словаря свойств. Стек изображений (например, временной ряд изображений) обрабатывается ImageCollection . Коллекция функций обрабатывается FeatureCollection . Другие фундаментальные структуры данных в Earth Engine включают Dictionary , List , Array , Date , Number и String (подробнее об основных типах данных можно узнать из этого руководства . Важно помнить, что все это объекты на стороне сервера , и манипулирование ими не осуществляется так же, как объектами JavaScript на стороне клиента ( подробнее ).

Алгоритмы Earth Engine

Существует несколько способов запуска операций в API:

  • Вызов методов, прикрепленных к объектам.
  • Вызов алгоритмов.
  • Вызов специальных функций редактора кода.
  • Определение новых функций.

На вкладке «Документы» редактора кода перечислены методы каждого класса API. Например, класс Image имеет метод add() :

Редактор кода (JavaScript)

var image3 = image1.add(image2);

Этот метод добавляет полосы image2 к полосам image1 . Категория ee.Algorithms содержит список поддерживаемых в настоящее время алгоритмов для специализированной или предметной обработки. Например, чтобы создать топографические слои из входной цифровой модели рельефа (DEM):

Редактор кода (JavaScript)

var terrainImage = ee.Algorithms.Terrain(dem);

Специальные функции редактора кода включают методы Map и Export , которые управляют тем, как слои добавляются на панель карты или экспортируются на Google Диск соответственно. Функции также можно создавать в JavaScript, используя

Редактор кода (JavaScript)

var myFunction = function(args) {
  // do something
  return something;
};

Как показано в разделе «Сопоставление» , определяемые пользователем функции полезны для создания пользовательских функций или изменения элементов коллекции с помощью:

Редактор кода (JavaScript)

var collection2 = collection1.map(aFunction);

Следующие разделы иллюстрируют эти концепции для различных простых случаев использования.

'Привет, мир!' JavaScript

Вывод информации на консоль — это основная задача для получения информации об объекте, отображения числового результата вычисления, отображения метаданных объекта или помощи при отладке. Знаменитая надпись «Hello World!» пример в редакторе кода:

Редактор кода (JavaScript)

print('Hello world!');

Скопируйте эту строку в редактор кода Code Editor и нажмите «Выполнить» . Обратите внимание, что выходные данные отображаются на вкладке «Консоль » справа от редактора кода. В качестве примера, более подходящего для дистанционного зондирования, ниже распечатываются метаданные изображения Landsat 8:

Редактор кода (JavaScript)

print(ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318'));

Внимательно проверьте вывод в консоли, чтобы увидеть метаданные, доступные для изображений Landsat.

Добавление данных на карту

Помимо вывода информации на консоль, добавление данных на Map — это способ визуализации географических данных. Для этого используйте Map.addLayer() . В следующем примере создается экземпляр Image (о том, как найти эти изображения, будет рассказано позже) с помощью ee.Image() , добавляется на карту с помощью Map.addLayer() и карта центрируется над изображением:

Редактор кода (JavaScript)

// Load an image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Center the map on the image.
Map.centerObject(image, 9);

// Display the image.
Map.addLayer(image);

Второй параметр Map.centerObject() — это уровень масштабирования, где более высокие числа указывают на больший масштаб (большее увеличение). Параметры функций Map подробно описаны в справочнике по API, доступном на вкладке «Документация» . Если внешний вид изображения неудовлетворительный, настройте параметры отображения с помощью дополнительного аргумента Map.addLayer() . Например:

Редактор кода (JavaScript)

// Load the image from the archive.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Define visualization parameters in an object literal.
var vizParams = {bands: ['B5', 'B4', 'B3'], min: 0.02, max: 0.4, gamma: 1.3};

// Center the map on the image and display.
Map.centerObject(image, 9);
Map.addLayer(image, vizParams, 'Landsat 8 false color');

Обратите внимание, что параметры визуализации определяются литералом объекта, который включает в себя список отображаемых полос, минимальное и максимальное значение отражательной способности и значение гаммы. (Подробнее о диапазонах Landsat можно узнать здесь . Подробнее о визуализации изображений можно узнать здесь ).

Используйте Map.addLayer() чтобы добавить на карту объекты и коллекции объектов. Например,

Редактор кода (JavaScript)

var counties = ee.FeatureCollection('TIGER/2018/Counties');
Map.addLayer(counties, {}, 'counties');

Поиск изображений, коллекций изображений и коллекций объектов

Изображения, коллекции изображений и коллекции объектов можно обнаружить с помощью поиска в каталоге данных Earth Engine. Например, если ввести «Landsat 8» в поле поиска, появится список наборов растровых данных. (Полный список наборов данных Earth Engine можно найти в Каталоге данных Earth Engine ). Нажмите на имя набора данных, чтобы получить краткое описание, информацию о временной доступности, поставщике данных и идентификаторе коллекции. Нажмите кнопку «Импорт» , чтобы автоматически создать раздел «Импорт» в верхней части скрипта с переменной для этой коллекции.

Либо скопируйте идентификатор коллекции и вставьте его в свой код. Например, выберите результат TOA уровня 1 в поиске «Landsat 8» и скопируйте идентификатор следующим образом:

Редактор кода (JavaScript)

var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');

Поскольку это коллекция множества изображений, охватывающих поверхность Земли, для поиска отдельного изображения в коллекции требуется фильтрация, чтобы сузить поиск. Альтернативно, коллекцию изображений можно свести к одному изображению, используя методы композиции и мозаики. Подробнее о фильтрации и композиции (см. Сокращение ) в следующих разделах.

Коллекции объектов также доступны через Каталог данных. Их представленность меньше, чем в коллекциях изображений, но вы найдете международные границы, границы переписи населения, водоразделы и охраняемые территории, и это лишь некоторые из них. Узнайте больше об импорте собственных наборов векторных данных здесь .

Фильтрация и сортировка

Часто бывает необходимо отфильтровать коллекцию по пространству и/или времени, чтобы ограничить количество результатов. Например, рассмотрим задачу сортировки коллекции сцен Landsat 8, чтобы найти безоблачную сцену для Сан-Франциско. Во-первых, необходимо определить интересующую область. Для этого часто бывает полезна точка. Активируйте вкладку «Инспектор» в правой части редактора кода и щелкните рядом с центром интересующей вас области, скопируйте координаты с вкладки «Инспектор» , затем создайте Point используя:

Редактор кода (JavaScript)

var point = ee.Geometry.Point(-122.262, 37.8719);

Постройте даты начала и окончания:

Редактор кода (JavaScript)

var start = ee.Date('2014-06-01');
var finish = ee.Date('2014-10-01');

Отфильтруйте коллекцию Landsat 8, используя точку и даты, затем отсортируйте ее по свойству метаданных (обнаруженному во время проверки метаданных сцены Landsat 8):

Редактор кода (JavaScript)

var filteredCollection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterBounds(point)
  .filterDate(start, finish)
  .sort('CLOUD_COVER', true);

Эту коллекцию можно смело распечатать и просмотреть. (Если в коллекции слишком много изображений, ее печать будет либо очень медленной, либо по истечении времени ожидания, либо вернет ошибку). Обратите внимание, что изображения в коллекции представляют собой List , хранящийся в свойстве 'features' ImageCollection . Идентификатор любого изображения в коллекции можно скопировать в конструктор Image как указано выше. Альтернативно, получите первое изображение (самая низкая облачность):

Редактор кода (JavaScript)

var first = filteredCollection.first();

Получите доступ ко всем функциям фильтрации Earth Engine, используя filter() с аргументом ee.Filter . (Использованные выше методы filterBounds() и filterDate() являются сокращенными). Например, следующий пример создает Filter , использует его для фильтрации FeatureCollection и отображает результат:

Редактор кода (JavaScript)

// Load a feature collection.
var featureCollection = ee.FeatureCollection('TIGER/2016/States');

// Filter the collection.
var filteredFC = featureCollection.filter(ee.Filter.eq('NAME', 'California'));

// Display the collection.
Map.setCenter(-119.604, 37.798, 6);
Map.addLayer(filteredFC, {}, 'California');

Математика группы

Выполняйте математические операции над изображениями, используя методы Image . Это может включать рекомбинацию полос (спектральные индексы), дифференцирование изображений или математические операции, такие как умножение на константу. Например, вычислите разницу между изображениями нормализованного индекса растительности (NDVI) с разницей в 20 лет:

Редактор кода (JavaScript)

// This function gets NDVI from Landsat 5 imagery.
var getNDVI = function(image) {
  return image.normalizedDifference(['B4', 'B3']);
};

// Load two Landsat 5 images, 20 years apart.
var image1 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_19900604');
var image2 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_20100611');

// Compute NDVI from the scenes.
var ndvi1 = getNDVI(image1);
var ndvi2 = getNDVI(image2);

// Compute the difference in NDVI.
var ndviDifference = ndvi2.subtract(ndvi1);

Обратите внимание на использование определяемой пользователем function в этом примере. Подробнее о функциях в следующем разделе.

Сопоставление (что делать вместо цикла for)

Используйте map() для перебора элементов коллекции. (Циклы for НЕ являются правильным способом сделать это в Earth Engine, и их следует избегать). Функция map() может быть применена к ImageCollection , FeatureCollection или List и принимает function в качестве аргумента. Аргументом функции является элемент коллекции, с которой она сопоставляется. Это полезно для одинакового изменения каждого элемента коллекции, например добавления. Например, следующий код добавляет полосу NDVI к каждому изображению в ImageCollection :

Редактор кода (JavaScript)

// This function gets NDVI from Landsat 8 imagery.
var addNDVI = function(image) {
  return image.addBands(image.normalizedDifference(['B5', 'B4']));
};

// Load the Landsat 8 TOA data, filter by location and date.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterBounds(ee.Geometry.Point(-122.262, 37.8719))
  .filterDate('2014-06-01', '2014-10-01');

// Map the function over the collection.
var ndviCollection = collection.map(addNDVI);

Другая распространенная задача — добавление нового свойства (или «атрибута» или «поля») к объектам в FeatureCollection . В следующем примере новое свойство представляет собой вычисление, включающее два существующих атрибута:

Редактор кода (JavaScript)

// This function creates a new property that is the sum of two existing properties.
var addField = function(feature) {
  var sum = ee.Number(feature.get('property1')).add(feature.get('property2'));
  return feature.set({'sum': sum});
};

// Create a FeatureCollection from a list of Features.
var features = ee.FeatureCollection([
  ee.Feature(ee.Geometry.Point(-122.4536, 37.7403),
    {property1: 100, property2: 100}),
    ee.Feature(ee.Geometry.Point(-118.2294, 34.039),
    {property1: 200, property2: 300}),
]);

// Map the function over the collection.
var featureCollection = features.map(addField);

// Print a selected property of one Feature.
print(featureCollection.first().get('sum'));

// Print the entire FeatureCollection.
print(featureCollection);

Обратите внимание на приведение к ee.Number необходимое для того, чтобы значение свойства распознавалось как число для использования метода add() ). Тип коллекции можно изменить с помощью map() . Например:

Редактор кода (JavaScript)

// This function returns the image centroid as a new Feature.
var getGeom = function(image) {
  return ee.Feature(image.geometry().centroid(), {foo: 1});
};

// Load a Landsat 8 TOA collection.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterBounds(ee.Geometry.Point(-122.262, 37.8719))
  .filterDate('2014-06-01', '2014-10-01');

// Map the function over the ImageCollection.
var featureCollection = ee.FeatureCollection(collection.map(getGeom));

// Print the collection.
print(featureCollection);

Обратите внимание на добавленное свойство ( foo ) для каждого объекта, созданного из центроида изображения. В последней строке приведение делает результирующую коллекцию распознаваемой как FeatureCollection .

Сокращение

Сокращение — это способ агрегирования данных во времени, пространстве, диапазонах, массивах и других структурах данных в Earth Engine. Для этой цели в API существуют различные методы. Например, чтобы создать композицию ImageCollection , используйте reduce() чтобы уменьшить изображения в коллекции до одного изображения. Простой пример — создание медианной совокупности пяти сцен с наименьшей облачностью в коллекции Landsat 8, определенной ранее:

Редактор кода (JavaScript)

// Load a Landsat 8 TOA collection.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  // Filter by date and location.
  .filterBounds(ee.Geometry.Point(-122.262, 37.8719))
  .filterDate('2014-01-01', '2014-12-31')
  // Sort by increasing cloudiness.
  .sort('CLOUD_COVER');

// Compute the median of each pixel for each band of the 5 least cloudy scenes.
var median = collection.limit(5).reduce(ee.Reducer.median());

Сокращение также является способом получить статистику изображения в регионах, определенных Feature или FeatureCollection . Предположим, что задача состоит в том, чтобы вычислить средние значения пикселей в интересующей области. Используйте для этой цели reduceRegion() . Например:

Редактор кода (JavaScript)

// Load and display a Landsat TOA image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');
Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 0.3});

// Create an arbitrary rectangle as a region and display it.
var region = ee.Geometry.Rectangle(-122.2806, 37.1209, -122.0554, 37.2413);
Map.addLayer(region);

// Get a dictionary of means in the region.  Keys are bandnames.
var mean = image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region,
  scale: 30
});

Узнайте больше о редукторах из документа «Редукторы».

Маскировка

Каждый пиксель в ee.Image имеет как значение, так и маску, которая находится в диапазоне от 0 (нет данных) до 1. Замаскированные пиксели (в которых маска == 0) рассматриваются как отсутствие данных. Пиксели с 0 < маской ≤ 1 имеют значение, но для числовых вычислений оно взвешивается по маске.

Вы можете сделать пиксели прозрачными или исключить их из анализа с помощью масок. Пиксели маскируются, когда значение маски равно нулю. Продолжая пример разграничения изображений, используйте маску для отображения областей повышенного и пониженного NDVI в интервале разности:

// This function gets NDVI from Landsat 5 imagery.
var getNDVI = function(image) {
  return image.normalizedDifference(['B4', 'B3']);
};

// Load two Landsat 5 images, 20 years apart.
var image1 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_19900604');
var image2 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_20100611');

// Compute NDVI from the scenes.
var ndvi1 = getNDVI(image1);
var ndvi2 = getNDVI(image2);

// Compute the difference in NDVI.
var ndviDifference = ndvi2.subtract(ndvi1);
// Load the land mask from the SRTM DEM.
var landMask = ee.Image('CGIAR/SRTM90_V4').mask();

// Update the NDVI difference mask with the land mask.
var maskedDifference = ndviDifference.updateMask(landMask);

// Display the masked result.
var vizParams = {min: -0.5, max: 0.5, palette: ['FF0000', 'FFFFFF', '0000FF']};
Map.setCenter(-122.2531, 37.6295, 9);
Map.addLayer(maskedDifference, vizParams, 'NDVI difference');

В этом примере обратите внимание, что маска разницы NDVI обновляется маской земли с помощью updateMask() . Это устанавливает маску пикселей разности NDVI в маску земли, если маска разности NDVI не равна нулю.

Маскирование также полезно для исключения данных из анализа. Рассмотрим пример reduceRegion() из раздела Сокращение . Предположим, что задача состоит в том, чтобы вычислить среднее сезонное значение NDVI для округа Санта-Клара, штат Калифорния, исключая облачные пиксели. В следующем примере демонстрируется несколько концепций: фильтрация, сопоставление, уменьшение и использование облачной маски:

Редактор кода (JavaScript)

// This function gets NDVI from a Landsat 8 image.
var addNDVI = function(image) {
  return image.addBands(image.normalizedDifference(['B5', 'B4']));
};

// This function masks cloudy pixels.
var cloudMask = function(image) {
  var clouds = ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud']);
  return image.updateMask(clouds.lt(10));
};

// Load a Landsat collection, map the NDVI and cloud masking functions over it.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterBounds(ee.Geometry.Point([-122.262, 37.8719]))
  .filterDate('2014-03-01', '2014-05-31')
  .map(addNDVI)
  .map(cloudMask);

// Reduce the collection to the mean of each pixel and display.
var meanImage = collection.reduce(ee.Reducer.mean());
var vizParams = {bands: ['B5_mean', 'B4_mean', 'B3_mean'], min: 0.02, max: 0.4};
Map.addLayer(meanImage, vizParams, 'mean');

// Load a region in which to compute the mean and display it.
var counties = ee.FeatureCollection('TIGER/2018/Counties');
var santaClara = ee.Feature(counties.filter(ee.Filter.eq('NAME', 'Santa Clara')).first());
Map.addLayer(santaClara);

// Get the mean of NDVI in the region.
var mean = meanImage.select(['nd_mean']).reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: santaClara.geometry(),
  scale: 30
});

// Print mean NDVI for the region.
mean.get('nd_mean').evaluate(function(val){
  print('Santa Clara spring mean NDVI:', val);
});