Bildberechnungen mit der Earth Engine REST API

Hinweis:Die REST API enthält neue und erweiterte Funktionen, die möglicherweise nicht für alle Nutzer geeignet sind. Wenn Sie Earth Engine noch nicht kennen, empfehlen wir Ihnen, mit dem JavaScript-Leitfaden zu beginnen.

Im Schnellstart zur Earth Engine REST API wird gezeigt, wie Sie auf Pixelblöcke aus einem Earth Engine-Asset zugreifen. Angenommen, Sie möchten eine Berechnung auf die Pixel anwenden, bevor Sie das Ergebnis erhalten. In diesem Leitfaden wird beschrieben, wie Sie einen Prototyp für eine Berechnung mit einer der Clientbibliotheken erstellen, den Berechnungsdiagramm serialisieren und die REST API verwenden, um das berechnete Ergebnis abzurufen. Das Senden von Berechnungsanfragen über die REST API entspricht einer POST-Anfrage an einen der Berechnungsendpunkte, z. B. computePixels, computeFeatures oder den generischen value.compute. In diesem Beispiel wird gezeigt, wie ein Median-Composite aus Sentinel-2-Bildern in einer kleinen Region erstellt wird.

Hinweis

Folgen Sie dieser Anleitung, um:

  1. Earth Engine beantragen
  2. Google Cloud-Projekt erstellen
  3. Earth Engine API für das Projekt aktivieren
  4. Dienstkonto erstellen
  5. Dienstkonto auf Projektebene die Berechtigung zum Ausführen von Earth Engine-Berechnungen erteilen

Hinweis: Für diese Anleitung benötigen Sie ein Dienstkonto, das für den Earth Engine-Zugriff registriert ist. Folgen Sie dieser Anleitung, um ein Dienstkonto zu registrieren, bevor Sie fortfahren.

Bei Google Cloud authentifizieren

Zuerst müssen Sie sich anmelden, damit Sie authentifizierte Anfragen an Google Cloud stellen können. Sie legen das Projekt gleichzeitig fest. Folgen Sie der Anleitung in der Ausgabe, um die Anmeldung abzuschließen.

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

!gcloud auth login --project {PROJECT}

Private Schlüsseldatei für Ihr Dienstkonto abrufen

Sie sollten bereits ein Dienstkonto registriert haben, um Earth Engine nutzen zu können. Falls nicht, folgen Sie dieser Anleitung. Kopieren Sie die E-Mail-Adresse Ihres Dienstkontos in die folgende Zelle. Das Dienstkonto muss bereits für die Verwendung von Earth Engine registriert sein. In der folgenden Zelle wird die gsutil-Befehlszeile verwendet, um eine Schlüsseldatei für das Dienstkonto zu generieren. Die Schlüsseldatei wird auf der Notebook-VM erstellt.

# 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 starten und Anmeldedaten testen

Testen Sie den privaten Schlüssel, indem Sie damit Anmeldedaten abrufen. Verwenden Sie die Anmeldedaten, um eine autorisierte Sitzung zum Senden von HTTP-Anfragen zu erstellen. Senden Sie über die Sitzung eine GET-Anfrage, um zu prüfen, ob die Anmeldedaten funktionieren.

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))

Berechnung serialisieren

Bevor Sie eine Anfrage zum Berechnen von etwas senden können, muss die Berechnung in das Earth Engine-Ausdrucksdiagrammformat gebracht werden. Im Folgenden wird gezeigt, wie Sie den Ausdrucksgraphen abrufen.

Bei Earth Engine authentifizieren

Rufen Sie die auf Earth Engine beschränkten Anmeldedaten vom Dienstkonto ab. Verwenden Sie sie, um Earth Engine zu initialisieren.

import ee

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

Berechnung definieren

Mit der Client API können Sie einen einfachen Rechenvorgang prototypisieren. Das Ergebnis der Berechnung ist ein 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()

Ausdrucksbaum serialisieren

Dadurch wird ein Objekt erstellt, das den Earth Engine-Ausdrucksgraphen darstellt (genauer gesagt ein Expression). Im Allgemeinen sollten Sie diese mit einer der Client-APIs erstellen.

serialized = ee.serializer.encode(image)

Erstellen Sie die gewünschte Projektion (WGS84) im gewünschten Maßstab (10 Meter für Sentinel-2). So wird nur der gewünschte Maßstab in Grad, den Einheiten der Projektion, ermittelt. Diese Skalen werden verwendet, um die affine Transformation in der Anfrage anzugeben.

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

Anfrage senden

Stellen Sie eine POST-Anfrage an den Endpunkt computePixels. Die Anfrage enthält Expression, die serialisierte Berechnung. Außerdem enthält es eine PixelGrid. Der PixelGrid enthält dimensions für die gewünschte Ausgabe und einen AffineTransform in den Einheiten des angeforderten Koordinatensystems. Hier ist das Koordinatensystem geografisch. Die Transformation wird also mit dem Maßstab in Grad und den geografischen Koordinaten der oberen linken Ecke des angeforderten Bildausschnitts angegeben.

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

Wenn Sie diesen Code in einem Notebook ausführen, können Sie die Ergebnisse mit dem IPython-Widget zur Bildanzeige anzeigen.

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