Облачные ресурсы Earth Engine с поддержкой GeoTiff

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

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

(В качестве альтернативы Earth Engine может напрямую загружать изображения из COG в Google Cloud Storage ( подробнее ). Однако изображение, загруженное через ee.Image.loadGeoTIFF и добавленное в коллекцию изображений, потребует чтения GeoTiff для операций фильтрации в коллекции.)

Чтобы создать актив, обеспеченный COG,

  1. Поместите файлы COG в контейнер GCS (разрешенные регионы см. ниже).
  2. Напишите манифест загрузки изображения
  3. Используйте утилиту командной строки earthengine для отправки команды загрузки:
earthengine upload external_image --manifest my_manifest.json

Пример манифеста изображения с одним Tileset

Самый простой ImageManifest — с одним Tileset . Если полосы не указаны, результирующий актив будет содержать все полосы GeoTIFF с именами полос, закодированными в GeoTIFF (в данном случае «vis-red», «vis-green» и «vis-blue»).

request = {
  'imageManifest': {
    'name': f'projects/{ee_project}/assets/cogdemo1',
    'tilesets': [
      { 'id': '0', 'sources': [ { 'uris': ['gs://ee-docs-demos/COG_demo.tif'] } ] }
    ],
    'properties': {
      'version': '1.1'
    },
    'startTime': '2016-01-01T00:00:00.000000000Z',
    'endTime': '2016-12-31T15:01:23.000000000Z',
  },
}

pprint(request)

Более одного Tileset

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

  • «b4b3b2.tif» имеет масштаб 10 м, а «b5b6b7» — масштаб 20 м.
  • Порядок полос результирующего актива смешивается из входных COG (например, выходная полоса 0 из Tileset 0, а выходная полоса 1 из Tileset 1).
request = {
  'imageManifest': {
    'name': f'projects/{ee_project}/assets/cogdemo2',
    'uriPrefix': 'gs://ee-docs-demos/external_image_demo/',
    'tilesets': [
      { 'id': '0', 'sources': [ { 'uris': ['b4b3b2.tif'] } ] },
      { 'id': '1', 'sources': [ { 'uris': ['b5b6b7.tif'] } ] },
    ],
    'bands': [
      { 'id': 'red', 'tilesetId': '0', 'tilesetBandIndex': 0 },
      { 'id': 'rededge3', 'tilesetId': '1', 'tilesetBandIndex': 2 },
      { 'id': 'rededge2', 'tilesetId': '1', 'tilesetBandIndex': 1 },
      { 'id': 'green', 'tilesetId': '0', 'tilesetBandIndex': 1 },
      { 'id': 'blue', 'tilesetId': '1', 'tilesetBandIndex': 0 },
      { 'id': 'rededge1', 'tilesetId': '0', 'tilesetBandIndex': 2 },
    ],
  },
}

pprint(request)

Подробная информация об активах, обеспеченных COG

Расположение

Расположение контейнера облачного хранилища должно быть одним из следующих:

  • Мультирегион США
  • Любой двойной регион США, включающий US-CENTRAL1
  • Регион США-CENTRAL1

Класс хранения

Класс хранения контейнера должен быть «Стандартное хранение».

Разрешения для обмена

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

1. Предоставьте разрешения на чтение контейнеру Google Cloud Storage.

Чтобы соавторы могли читать активы, поддерживаемые COG, они должны сначала иметь доступ на чтение к базовым файлам COG в контейнере Google Cloud Storage. Без этих разрешений Earth Engine не сможет извлечь для них данные. Если данные в Google Cloud Storage не видны пользователю Earth Engine, Earth Engine вернет ошибку вида "Не удалось загрузить GeoTIFF по адресу gs://my-bucket/my-object#123456 " (где 123456 — это поколение объекта).

В частности, соавторы должны иметь следующие разрешения:

  • storage.buckets.get для контейнера (для извлечения метаданных и местоположения контейнера, что позволяет Earth Engine правильно определить источник актива).
  • storage.objects.get для контейнера (для чтения фактических данных активов, поддерживаемых COG).

Эти разрешения предоставляются, среди прочего , ролями «Читатель устаревших контейнеров хранилища» и «Читатель устаревших объектов хранилища» соответственно.

Чтобы назначить эти роли соавторам:

  1. Перейдите на страницу разрешений контейнера: https://console.cloud.google.com/storage/browser/{MY-BUCKET};tab=permissions
  2. Нажмите « ПРЕДОСТАВИТЬ ДОСТУП »
  3. Добавьте всех участников (например, пользователей, группы, учетные записи служб), которым следует предоставить доступ на чтение.
  4. Назначьте следующие роли:
    • «Storage Legacy Bucket Reader» (предоставляет storage.buckets.get и другие разрешения на чтение на уровне контейнера).
    • «Storage Legacy Object Reader» (предоставляет storage.objects.get ).
    • (В качестве альтернативы вы можете создать новую пользовательскую роль только с разрешениями storage.buckets.get и storage.objects.get и назначить ее.)
  5. Сохранять

2. Поделитесь ресурсом Earth Engine для чтения

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

Поколения

При создании актива с поддержкой COG Earth Engine считывает метаданные TIFF-файлов, указанных в манифесте, и создает запись хранилища активов. Каждый URI, связанный с этой записью, может иметь поколение. Подробную информацию о поколениях см. в документации по управлению версиями объектов . Если указано поколение, например gs://foo/bar#123 , Earth Engine сохранит этот URI дословно. Если поколение не указано, Earth Engine сохранит этот URI с поколением TIFF на момент вызова ImportExternalImage .

Это означает, что если какой-либо TIFF, содержащий внешний актив в GCS, обновляется (и, следовательно, изменяется его генерация), Earth Engine вернет ошибку "Не удалось загрузить GeoTIFF по адресу gs://my-bucket/my-object#123456 ", поскольку ожидаемый объект больше не существует (если только контейнер не поддерживает несколько версий объектов). Эта политика предназначена для синхронизации метаданных актива с метаданными объекта.

Конфигурация

С точки зрения конфигурации COG, TIFF ДОЛЖЕН быть:

  • Плиточный, где размеры плитки следующие:

    • 256x256
    • 512x512
    • 1024x1024
    • 2048x2048
  • Организовано таким образом, что все IFD находятся в начале.

Для лучшей производительности:

  • Используйте плитку размером 512x512 или больше.
  • Включить мощность 2 обзоров.

В зависимости от предполагаемых вариантов использования, опция создания 'INTERLEAVE' может повлиять на производительность. Мы рекомендуем использовать BAND interleave во всех обстоятельствах.

Более подробную информацию об оптимизированной конфигурации см. на этой странице .

Следующая команда gdal_translate преобразует растр в оптимизированный для облака GeoTIFF с чередованием полос, сжатый zstd, который будет хорошо работать в Earth Engine:

gdal_translate in.tif out.tif \
  -co COPY_SRC_OVERVIEWS=YES \
  -co TILED=YES \
  -co BLOCKXSIZE=512 \
  -co BLOCKYSIZE=512 \
  -co COMPRESS=ZSTD \
  -co ZSTD_LEVEL=22 \
  -co INTERLEAVE=BAND \
  -co NUM_THREADS=ALL_CPUS

Можно еще больше уменьшить размер выходного файла, указав предиктор ( -co PREDICTOR=2 для целочисленных типов данных и -co PREDICTOR=3 для типов данных с плавающей точкой).

Для пользователей с GDAL >= 3.11 драйвер COG может создавать файлы, не беспокоясь о создании и сохранении обзоров.

gdal_translate in.tif out.tif \
  -of COG \
  -co OVERVIEWS=IGNORE_EXISTING \
  -co COMPRESS=ZSTD \
  -co LEVEL=22 \
  -co PREDICTOR=2 \
  -co INTERLEAVE=BAND \
  -co NUM_THREADS=ALL_CPUS \

Создание облачных ресурсов GeoTiff с использованием REST API

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

Чтобы создать актив с поддержкой COG с помощью REST API, отправьте запрос POST к конечной точке Earth Engine ImportExternalImage . Как показано ниже, этот запрос должен быть авторизован для создания актива в вашей пользовательской папке.

Начать авторизованный сеанс

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

import ee
import json
from pprint import pprint
from google.auth.transport.requests import AuthorizedSession

ee.Authenticate()  #  or !earthengine authenticate --auth_mode=gcloud

# Specify the cloud project you want associated with Earth Engine requests.
ee_project = 'your-project'

session = AuthorizedSession(
    ee.data.get_persistent_credentials().with_quota_project(ee_project)
)

Текст запроса

Тело запроса — это экземпляр ImageManifest . Здесь указывается путь к COG, а также другие полезные свойства.

Подробности настройки ImageManifest см. в этом руководстве . Можно определить один или несколько Tileset , каждый из которых будет поддерживать одну или несколько полос. Для ImportExternalImage поддерживается максимум один ImageSource на Tileset .

Подробную информацию об экспорте COG см. в этом документе .

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

Отправьте запрос POST к конечной точке Earth Engine projects.images.importExternal .

url = f'https://earthengine.googleapis.com/v1alpha/projects/{ee_project}/image:importExternal'

response = session.post(
  url = url,
  data = json.dumps(request)
)

pprint(json.loads(response.content))