Вычисления изображений с помощью Earth Engine REST API

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

В кратком руководстве по REST API Earth Engine показано, как получить доступ к блокам пикселей из ресурса Earth Engine. Предположим, вы хотите применить вычисление к пикселям перед получением результата. В этом руководстве показано, как создать прототип вычисления с помощью одной из клиентских библиотек, сериализовать граф вычислений и использовать REST API для получения вычисленного результата. Выполнение вычислительных запросов через REST API соответствует POST запросу к одной из конечных точек вычислений, например, computePixels , computeFeatures или универсальному методу value.compute . В частности, этот пример демонстрирует получение медианного композита изображений Sentinel-2 в небольшой области.

Прежде чем начать

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

  1. Подать заявку на Earth Engine
  2. Создайте проект Google Cloud
  3. Включить API Earth Engine в проекте
  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. Обратите внимание, что результатом вычисления является Image .

coords = [
  -121.58626826832939,
  38.059141484827485,
]
region = ee.Geometry.Point(coords)

collection = ee.ImageCollection('COPERNICUS/S2')
collection = collection.filterBounds(region)
collection = collection.filterDate('2020-04-01', '2020-09-01')
image = collection.median()

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

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

serialized = ee.serializer.encode(image)

Создайте нужную проекцию (WGS84) в нужном масштабе (10 метров для Sentinel-2). Это необходимо для определения нужного масштаба в градусах, единицах измерения проекции. Эти масштабы будут использоваться для указания аффинного преобразования в запросе.

# Make a projection to discover the scale in degrees.
proj = ee.Projection('EPSG:4326').atScale(10).getInfo()

# Get scales out of the transform.
scale_x = proj['transform'][0]
scale_y = -proj['transform'][4]

Отправить запрос

Отправьте POST запрос к конечной точке computePixels . Обратите внимание, что запрос содержит Expression — сериализованное вычисление. Он также содержит PixelGrid . PixelGrid содержит dimensions желаемого результата и AffineTransform в единицах запрошенной системы координат. В данном случае система координат географическая, поэтому преобразование задаётся с масштабом в градусах и географическими координатами верхнего левого угла запрошенного фрагмента изображения.

import json

url = 'https://earthengine.googleapis.com/v1beta/projects/{}/image:computePixels'
url = url.format(PROJECT)

response = session.post(
  url=url,
  data=json.dumps({
    'expression': serialized,
    'fileFormat': 'PNG',
    'bandIds': ['B4','B3','B2'],
    'grid': {
      'dimensions': {
        'width': 640,
        'height': 640
      },
      'affineTransform': {
        'scaleX': scale_x,
        'shearX': 0,
        'translateX': coords[0],
        'shearY': 0,
        'scaleY': scale_y,
        'translateY': coords[1]
      },
      'crsCode': 'EPSG:4326',
    },
    'visualizationOptions': {'ranges': [{'min': 0, 'max': 3000}]},
  })
)

image_content = response.content

Если вы запускаете это в блокноте, вы можете отобразить результаты с помощью виджета отображения изображений IPython .

# Import the Image function from the IPython.display module.
from IPython.display import Image
Image(image_content)