Вычисления в таблицах с помощью Earth Engine REST API

Примечание. REST API содержит новые и продвинутые функции, которые могут подходить не всем пользователям. Если вы только начинаете работать с Earth Engine, ознакомьтесь с руководством по JavaScript.

В кратком руководстве по Earth Engine REST API показано, как получить доступ к блокам пикселей из объекта Earth Engine. В примере с вычислением пикселей показано, как применить вычисление к пикселям перед получением результата. В этом примере показано, как получить среднее значение пикселей в каждом изображении ImageCollection в каждом объекте FeatureCollection. В частности, это запрос POST к конечной точке computeFeatures.

Подготовка

Следуйте этим инструкциям, чтобы:

  1. Подать заявку на доступ к Earth Engine
  2. Создайте проект Google Cloud
  3. Включите Earth Engine API в проекте
  4. Как создать сервисный аккаунт
  5. Предоставьте сервисному аккаунту разрешение на уровне проекта для выполнения вычислений Earth Engine

Примечание. Чтобы выполнить инструкции из этого руководства, вам понадобится сервисный аккаунт, зарегистрированный для доступа к Earth Engine. Прежде чем продолжить, зарегистрируйте сервисный аккаунт, следуя этим инструкциям.

Как выполнить аутентификацию в Google Cloud

Сначала нужно войти в систему, чтобы отправлять аутентифицированные запросы в Google Cloud. Вы одновременно настроите проект. Чтобы войти в аккаунт, следуйте инструкциям в выходных данных.

# INSERT YOUR PROJECT HERE
PROJECT = 'your-project'

!gcloud auth login --project {PROJECT}

Получите файл закрытого ключа для сервисного аккаунта

Для работы с Earth Engine у вас уже должен быть зарегистрирован сервисный аккаунт. Если у вас его нет, следуйте этим инструкциям. Скопируйте адрес электронной почты сервисного аккаунта в следующую ячейку. (Сервисный аккаунт должен быть зарегистрирован для использования Earth Engine). В следующей ячейке командная строка gsutil используется для создания файла ключа для сервисного аккаунта. Файл ключа будет создан на виртуальной машине блокнота.

# INSERT YOUR SERVICE ACCOUNT HERE
SERVICE_ACCOUNT='your-service-account@your-project.iam.gserviceaccount.com'
KEY = 'key.json'

!gcloud iam service-accounts keys create {KEY} --iam-account {SERVICE_ACCOUNT}

Запустите AuthorizedSession и проверьте учетные данные

Проверьте закрытый ключ, получив с его помощью учетные данные. Используйте учетные данные, чтобы создать авторизованный сеанс для выполнения HTTP-запросов. Выполните запрос GET в рамках сеанса, чтобы проверить, работают ли учетные данные.

from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(KEY)
scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform'])

session = AuthorizedSession(scoped_credentials)

url = 'https://earthengine.googleapis.com/v1beta/projects/earthengine-public/assets/LANDSAT'

response = session.get(url)

from pprint import pprint
import json
pprint(json.loads(response.content))

Сериализация вычислений

Прежде чем вы сможете отправить запрос на вычисление, вычисление необходимо поместить в формат графа выражений Earth Engine. Ниже показано, как получить график выражения.

Как выполнить аутентификацию в Earth Engine

Получите учетные данные Earth Engine из сервисного аккаунта. Используйте их для инициализации Earth Engine.

import ee

# Get some new credentials since the other ones are cloud scope.
ee_creds = ee.ServiceAccountCredentials(SERVICE_ACCOUNT, KEY)
ee.Initialize(ee_creds)

Определите вычисление

Создайте прототип простого вычисления с помощью клиентского API. Обратите внимание, что результатом вычисления является FeatureCollection. Чтобы убедиться, что вычисление может быть выполнено без ошибок, получите значение из первого Feature (среднее значение NDVI в многоугольнике).

# A collection of polygons.
states = ee.FeatureCollection('TIGER/2018/States')
maine = states.filter(ee.Filter.eq('NAME', 'Maine'))

# Imagery: NDVI vegetation index from MODIS.
band = 'NDVI'
images = ee.ImageCollection('MODIS/061/MOD13Q1').select(band)
image = images.first()

computation = image.reduceRegions(
  collection=maine,
  reducer=ee.Reducer.mean().setOutputs([band]),
  scale=image.projection().nominalScale()
)

# Print the value to test.
print(computation.first().get(band).getInfo())

Сериализовать граф выражения

Будет создан объект, представляющий граф выражений Earth Engine (в частности, Expression). Как правило, для создания таких объектов следует использовать один из клиентских API.

# Serialize the computation.
serialized = ee.serializer.encode(computation)

Отправка запроса

Отправьте запрос POST конечной точке computeFeatures. Обратите внимание, что запрос содержит параметр Expression, который представляет собой сериализованное вычисление.

import json

url = 'https://earthengine.googleapis.com/v1beta/projects/{}/table:computeFeatures'

response = session.post(
  url = url.format(PROJECT),
  data = json.dumps({'expression': serialized})
)

import json
pprint(json.loads(response.content))

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