В прошлой статье Google Earth Engine (GEE) как общедоступный суперкомпьютер речь шла про работу в облачном редакторе GEE, где для доступа достаточно лишь наличия Google почты. Если потребности ограничиваются разовыми задачами и гигабайтами извлекаемых данных, то этого вполне достаточно. Но для автоматизации множества даже мелких задач облачный редактор не лучший способ работы и, тем более, когда требуется многократно получать растры суммарным размером в терабайты. В таких случаях потребуются другие инструменты и сегодня мы рассмотрим возможности доступа из консольных shell и Python скриптов и Python Jupyter notebook.
На скриншоте Python Jupyter ноутбук, где растр с данными о плотности населения за 2020 год из каталога Earth Engine data Catalog: WorldPop Global Project Population Data отображен на карте OpenStreetMap
Введение
Как говорится, аппетит приходит во время еды. Вот и я, хотя давно и с удовольствием работаю с Google Earth Engine (GEE), только недавно столкнулся с задачами, требующими регулярного извлечения терабайт данных для их последующей обработки. К счастью, это вполне реально. Более того, на GEE все нужные данные представлены в одном месте и регулярно обновляются, что делает его оптимальным источником. Конечно, мне понятно, насколько мало специалистов работают с такими наборами пространственной информации, и уж точно они не ищут статьи на русском языке (потому, что их нет). С другой стороны, специалисты по машинному обучению (ML) часто жалуются на недостаток данных, так вот же вам настоящий Клондайк! Есть разные варианты, как реализовать машинное обучение на этих данных — можно средствами GEE, можно обратиться к функциям Compute Engine или делать все самому. Впрочем, это отдельная большая тема, так что мы ограничимся лишь получением данных.
Облачные акаунты Google
Для работы нам понадобится подключение к облачным аккаунтам Google Cloud SDK и установленный консольный google-cloud-sdk. При наличии гугл почты у нас уже есть один (или несколько) персональных аккаунтов. Просмотреть список доступных аккаунтов и переключаться между ними можно с помощью консольной команды:
$ gcloud auth list
Credentialed accounts:
- youremail@gmail.com (active)
To set the active account, run
$ gcloud config set account <account>
Здесь уже отображена подсказка для переключения между аккаунтами:
$ gcloud config set account <account>
После переключения нужно авторизоваться в аккаунте :
$ gcloud auth login
Доступ к облачным хранилищам
Обычных почтовых аккаунтов достаточно для доступа к облачным хранилищам buckets и Google Drive, куда можно сохранять данные GEE из облачного редактора GEE. Заметим, что при доступе через API данные возможно сохранить сразу локально.
Cохранение данных GEE на buckets выполняется с помощью функций Export.table.toCloudStorage и Export.image.toCloudStorage и используется в случаях, когда планируется дальнейшая работа с файлами в облаке Google Compute Engine. Управлять этими файлами можно с помощью утилиты gsutil, например:
$ gsutil du -h gs://gcp-pdp-osm-dev-earth-engine
Эта команда покажет список файлов и их размеры в удобных человеку единицах (см. ключ -h). С помощью утилиты gsutil можно осуществлять различные файловые операции, ключи достаточно интуитивны (cp, rm,...), подробности смотрите в справке указанной утилиты.
Для сохранения из GEE на Google Drive доступны команды Export.table.toDrive и Export.image.toDrive, дальнейшее управление файлами доступно в веб-интерфейсе или с помощью дополнительных утилит и приложений. Преимущественно сохранение на Google Drive используется для скачивания готовых файлов.
Доступ к GEE через API
Для не интерактивной работы с Google Earth Engine (GEE) рекомендуется создать так называемый сервисный аккаунт вида my-service-account@...iam.gserviceaccount.com: Create and register a service account to use Earth Engine. Для доступа к GEE требуется в свойствах созданного аккаунта зайти на вкладку KEYS и создать и скачать JSON файл его ключа, а также зарегистрировать аккаунт на странице Register a new service account. Теперь с этим ключом можно авторизоваться с помощью следующего Python кода:
import ee
service_account = 'my-service-account@...iam.gserviceaccount.com'
credentials = ee.ServiceAccountCredentials(service_account, 'privatekey.json')
ee.Initialize(credentials)
вместо использования функции Python API ee.Authenticate() с интерактивной авторизацией каждого сеанса. Смотрите также консольную авторизацию
$ earthengine earthengine --ee_config
Аналогично, ключ сервисного аккаунта позволяет авторизоваться и при использовании Python GDAL:
import os
from osgeo import gdal
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "my-service-account.json"
Или консольных утилит GDAL:
export GOOGLE_APPLICATION_CREDENTIALS=my-service-account.json
Извлечение растров GEE
Для получения растров мы будем говорить о методе API Method: projects.assets.getPixels Такой доступ обеспечивает высокую скорость передачи данных и позволяет копировать огромные объемы данных, но отдельными блоками размером не более 32MB. К счастью, проект GDAL уже предоставляет обертку для этого API, так что достаточно одного вызова нужной утилиты или функции для передачи всего растра целиком.
Возьмем практический пример для консольных утилит GDAL и на Python. Просмотрим набор данных WorldPop/GP/100m/pop и извлечем один из найденных растров за 2020 год. Растры в этом наборе варьируются в размере по порядку величины от мегабайт до гигабайт, для примера выберем один из небольших:
export GOOGLE_APPLICATION_CREDENTIALS=my-service-account.json
# fetch collection
ogrinfo -ro -al "EEDA:" -oo COLLECTION=projects/earthengine-public/assets/WorldPop/GP/100m/pop -where "year=2020"
# show one raster info
gdalinfo "EEDAI:projects/earthengine-public/assets/WorldPop/GP/100m/pop/ZWE_2020"
# fetch one raster to local drive
gdal_translate "EEDAI:projects/earthengine-public/assets/WorldPop/GP/100m/pop/ZWE_2020" ZWE_2020.tif
Аналогично на Python:
import os
from osgeo import ogr, gdal
# define service account key
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "my-service-account.json"
# fetch collection
driver = ogr.GetDriverByName('EEDA')
ds = driver.Open('EEDA:projects/earthengine-public/assets/WorldPop/GP/100m/pop')
layer = ds.GetLayer()
# filter collection by attribute
layer.SetAttributeFilter('year=2020')
# select 1st raster
for feature in layer:
name = feature.GetField("name")
crs = feature.GetField("band_crs")
print ('raster name and crs:',name, crs)
break
# fetch 1st raster from the collection to array
ds = gdal.Open(f'EEDAI:{name}')
band = ds.GetRasterBand(1)
array = band.ReadAsArray()
print ('raster shape:', array.shape)
Заключение
Выше мы рассмотрели достаточно «продвинутые» техники работы с Google Earth Engine. Если вы обращаетесь к GEE регулярно, намного удобнее использовать шелл скрипты и Python Jupyter ноутбуки и иметь возможность сохранять практически произвольные объемы данных локально без промежуточных облачных хранилищ и без ожидания выполнения очереди заданий экспорта, которое может затянуться. Отдельно отмечу, что вовсе не обязательно извлекать «сырые» данные — можно их предварительно обработать средствами GEE. За подробностями серверной обработки, работы с GDAL и отображения данных обратитесь к ссылкам ниже.
Мне было бы интересно получить обратную связь от читателей: стоит ли обращаться к более сложным темам или и это уже за гранью того, что интересует русскоязычную аудиторию? Знаю, что немало читателей здесь используют Google Transtale и подобные переводчики, возможно, стоит сразу писать на английском на LinkedIn, как я уже делаю с публикациями по геофизике.
Ссылки
EEDAI — Google Earth Engine Data API Image
Using GDAL / OGR for Data Processing and Analysis
Raster (gridded) dataset handling
AmberSP
Про интерес — Вы начали цикл статей «как вертеть GEE» без вводной «что это вообще такое», «какие там есть данные» и «что с этим можно сделать». Потому и обратной связи никакой.
N-Cube Автор
Спасибо за отклик, но мне кажется, очень вряд ли вы будете читать статью про программирование в GEE на двух языках (javascript + Python), если вы не знаете, что это такое и зачем оно вам. Если доберусь, в следующей статье покажу, как по данным GEE найти золото — в качестве практического примера, заодно по методам машинного обучения в GEE пройдёмся.
AmberSP
Вы, конечно, правы.
Но, кажется, упускаете из внимания сегмент целевой аудитории, в который вхожу и я — люди, у которых геозадачи есть, а инструменты известны не все. Я вот не знаю, что такое GEE. А на геоданных сижу довольно широкой попой.
N-Cube Автор
Эта статья написана после пары десятков вводных, вряд ли есть смысл их все каждый раз пересказывать, вот посмотрите хотя бы пару предыдущих, возможно, как раз они вам будут полезны:
Общедоступные данные дистанционного зондирования Земли: как получить и использовать
Геология XXI века как наука данных о Земле