Earth Engine REST API を使用した画像計算

注: REST API には、すべてのユーザーに適していない可能性のある新しい高度な機能が含まれています。Earth Engine を初めてご利用になる場合は、JavaScript ガイドから始めることをおすすめします。

Earth Engine REST API クイックスタートでは、Earth Engine アセットからピクセルのブロックにアクセスする方法について説明します。結果を取得する前に、ピクセルに計算を適用するとします。このガイドでは、クライアント ライブラリのいずれかを使用して計算をプロトタイプ化し、計算グラフをシリアル化して、REST API を使用して計算結果を取得する方法について説明します。REST API を介してコンピューティング リクエストを行うことは、コンピューティング エンドポイント(computePixelscomputeFeatures、汎用の value.compute など)のいずれかに対する POST リクエストに対応します。具体的には、この例では、小さな領域の Sentinel-2 画像の中央値合成を取得する方法を示します。

始める前に

こちらの手順に沿って、次の操作を行います。

  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 コマンドラインを使用して、サービス アカウントのキーファイルを生成します。鍵ファイルはノートブック VM に作成されます。

# 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)と目的のスケール(Sentinel-2 の場合は 10 メートル)で作成します。これは、投影の単位である度数で目的のスケールを見つけるためだけに使用されます。これらのスケールは、リクエストでアフィン変換を指定するために使用されます。

# 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]

リクエストを送信する

computePixels エンドポイントに POST リクエストを送信します。リクエストには、シリアル化された計算である 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)