In diesem Leitfaden wird beschrieben, wie Sie mit Google Colab schnell Anfragen an die Earth Engine REST API von Python aus senden können. Dieselben Konzepte gelten für den Zugriff auf die API aus anderen Sprachen und Umgebungen.
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.
Hinweis
Folgen Sie dieser Anleitung, um:
- Earth Engine-Zugriff konfigurieren
- Dienstkonto erstellen
Colab-Notebook einrichten
Wenn Sie diese Kurzanleitung von Grund auf beginnen, können Sie ein neues Colab-Notebook erstellen, indem Sie auf der Colab-Startseite auf NEUES NOTEBOOK klicken und die Codebeispiele unten in eine neue Codezelle eingeben. In Colab ist das Cloud SDK bereits installiert. Dazu gehört auch das gcloud
-Befehlszeilentool, mit dem Sie Cloud-Dienste verwalten können. Alternativ können Sie das Demo-Notebook über die Schaltfläche am Anfang dieser Seite ausführen.
Bei Google Cloud authentifizieren
Zuerst müssen Sie sich anmelden, damit Sie authentifizierte Anfragen an Google Cloud stellen können.
In Colab können Sie Folgendes ausführen:
PROJECT = 'my-project' !gcloud auth login --project {PROJECT}
Oder, wenn Sie das Skript lokal über eine Befehlszeile ausführen (vorausgesetzt, Sie haben das Cloud SDK installiert):
PROJECT='my-project' gcloud auth login --project $PROJECT
Stimmen Sie der Anmeldung mit Ihrem Google-Nutzerkonto zu und schließen Sie den Anmeldevorgang ab.
Private Schlüsseldatei für Ihr Dienstkonto abrufen
Bevor Sie das Dienstkonto zur Authentifizierung verwenden können, müssen Sie eine Datei mit dem privaten Schlüssel herunterladen. So laden Sie Dateien in Colab auf die Notebook-VM herunter:
SERVICE_ACCOUNT='foo-name@project-name.iam.gserviceaccount.com' KEY = 'my-secret-key.json' !gcloud iam service-accounts keys create {KEY} --iam-account {SERVICE_ACCOUNT}
Alternativ können Sie auch die Befehlszeile verwenden:
SERVICE_ACCOUNT='foo-name@project-name.iam.gserviceaccount.com' KEY='my-secret-key.json' gcloud iam service-accounts keys create $KEY --iam-account $SERVICE_ACCOUNT
Auf Anmeldedaten zugreifen und sie testen
Sie können jetzt Ihre erste Anfrage an die Earth Engine API senden. Verwenden Sie den privaten Schlüssel, um Anmeldedaten abzurufen. Verwenden Sie die Anmeldedaten, um eine autorisierte Sitzung zum Senden von HTTP-Anfragen zu erstellen. Sie können diesen Code in eine neue Codezelle Ihres Colab-Notebooks eingeben. Wenn Sie die Befehlszeile verwenden, müssen Sie dafür sorgen, dass die erforderlichen Bibliotheken installiert sind.
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/v1alpha/projects/earthengine-public/assets/LANDSAT' response = session.get(url) from pprint import pprint import json pprint(json.loads(response.content))
Wenn alles richtig konfiguriert ist, sieht die Ausgabe so aus:
{'id': 'LANDSAT',
'name': 'projects/earthengine-public/assets/LANDSAT',
'type': 'FOLDER'}
Dataset auswählen
Mit dem Earth Engine Code Editor unter code.earthengine.google.com können Sie nach verfügbaren Datasets suchen und diese untersuchen. Suchen wir nach Sentinel 2-Daten. Wenn Sie den Code-Editor zum ersten Mal verwenden, werden Sie bei der Anmeldung aufgefordert, ihn zu autorisieren, damit er in Ihrem Namen auf Earth Engine zugreifen kann. Suchen Sie im Code-Editor oben im Suchfeld nach „sentinel“. Es werden mehrere Raster-Datasets angezeigt:

Klicken Sie auf „Sentinel-2: MultiSpectral Instrument (MSI), Level-1C“:

Auf Seiten mit Dataset-Beschreibungen wie dieser finden Sie die wichtigsten Informationen, die Sie benötigen, um ein Dataset im Earth Engine Public Data Catalog zu verwenden. Dazu gehören eine kurze Beschreibung des Datasets, Links zum Datenanbieter für weitere Details, Informationen zu allen Nutzungsbeschränkungen, die für das Dataset gelten, und die Earth Engine-Asset-ID des Datasets.
In diesem Fall sehen wir rechts im Fenster, dass es sich um ein Asset vom Typ „Bildsammlung“ handelt, dessen Pfad COPERNICUS/S2
ist.
Nach bestimmten Bildern suchen
Dieses Sentinel-2-Dataset umfasst über zwei Millionen Bilder, die die Welt von 2015 bis heute abdecken. Wir stellen eine projects.assets.listImages-Anfrage an die Bildsammlung, um einige Daten aus dem April 2017 mit geringer Wolkendecke zu finden, die einen bestimmten Punkt in Mountain View, Kalifornien, enthalten.
import urllib coords = [-122.085, 37.422] project = 'projects/earthengine-public' asset_id = 'COPERNICUS/S2' name = '{}/assets/{}'.format(project, asset_id) url = 'https://earthengine.googleapis.com/v1alpha/{}:listImages?{}'.format( name, urllib.parse.urlencode({ 'startTime': '2017-04-01T00:00:00.000Z', 'endTime': '2017-05-01T00:00:00.000Z', 'region': '{"type":"Point", "coordinates":' + str(coords) + '}', 'filter': 'CLOUDY_PIXEL_PERCENTAGE < 10', })) response = session.get(url) content = response.content for asset in json.loads(content)['images']: id = asset['id'] cloud_cover = asset['properties']['CLOUDY_PIXEL_PERCENTAGE'] print('%s : %s' % (id, cloud_cover))
Dieses Skript fragt die Sammlung nach übereinstimmenden Bildern ab, decodiert die resultierende JSON-Antwort und gibt die Asset-ID und die Wolkendecke für jedes übereinstimmende Bild-Asset aus. Die Ausgabe sollte so aussehen:
COPERNICUS/S2/20170420T184921_20170420T190203_T10SEG : 4.3166
COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG : 0
Offenbar gibt es zwei Bilder von diesem Punkt, die in diesem Monat aufgenommen wurden und eine geringe Wolkendecke aufweisen.
Bestimmtes Bild prüfen
Bei einem der Treffer gibt es anscheinend keine Wolken. Sehen wir uns dieses Asset mit der ID COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG
genauer an. Alle Assets im öffentlichen Katalog gehören zum Projekt earthengine-public
. Hier ist ein Python-Snippet, mit dem eine projects.assets.get-Abfrage ausgegeben wird, um die Details des jeweiligen Assets nach ID abzurufen, die verfügbaren Datenbänder auszugeben und detailliertere Informationen zum ersten Band auszugeben:
asset_id = 'COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG' name = '{}/assets/{}'.format(project, asset_id) url = 'https://earthengine.googleapis.com/v1alpha/{}'.format(name) response = session.get(url) content = response.content asset = json.loads(content) print('Band Names: %s' % ','.join(band['id'] for band in asset['bands'])) print('First Band: %s' % json.dumps(asset['bands'][0], indent=2, sort_keys=True))
Die Ausgabe sollte in etwa so aussehen:
Band Names: B1,B2,B3,B4,B5,B6,B7,B8,B8A,B9,B10,B11,B12,QA10,QA20,QA60
First Band: {
"dataType": {
"precision": "INTEGER",
"range": {
"max": 65535
}
},
"grid": {
"affineTransform": {
"scaleX": 60,
"scaleY": -60,
"translateX": 499980,
"translateY": 4200000
},
"crsCode": "EPSG:32610",
"dimensions": {
"height": 1830,
"width": 1830
}
},
"id": "B1",
"pyramidingPolicy": "MEAN"
}
Die Liste der Datenbereiche entspricht der Dataset-Beschreibung, die wir uns zuvor angesehen haben. Dieses Dataset enthält 16-Bit-Ganzzahldaten im Koordinatensystem EPSG:32610 oder UTM-Zone 10N. Das erste Band hat die ID B1
und eine Auflösung von 60 Metern pro Pixel. Der Ursprung des Bildes befindet sich in diesem Koordinatensystem an der Position (499980,4200000).
Der negative Wert von affineTransform.scaleY
gibt an, dass sich der Ursprung in der nordwestlichen Ecke des Bildes befindet, was normalerweise der Fall ist: Steigende y
-Pixelindexe entsprechen abnehmenden y
-Raumkoordinaten (Richtung Süden).
Pixelwerte abrufen
Wir senden eine projects.assets.getPixels-Anfrage, um einige Daten aus den hochauflösenden Bändern dieses Bildes abzurufen. Auf der Seite mit der Dataset-Beschreibung steht, dass die Bänder B2
, B3
, B4
und B8
eine Auflösung von 10 Metern pro Pixel haben. Mit diesem Skript wird die Kachel mit den Daten der vier Bänder oben links mit einer Größe von 256 × 256 Pixeln abgerufen. Wenn Sie die Daten im numpy
-NPY-Format laden, lässt sich die Antwort ganz einfach in ein Python-Datenarray decodieren.
import numpy import io name = '{}/assets/{}'.format(project, asset_id) url = 'https://earthengine.googleapis.com/v1alpha/{}:getPixels'.format(name) body = json.dumps({ 'fileFormat': 'NPY', 'bandIds': ['B2', 'B3', 'B4', 'B8'], 'grid': { 'affineTransform': { 'scaleX': 10, 'scaleY': -10, 'translateX': 499980, 'translateY': 4200000, }, 'dimensions': {'width': 256, 'height': 256}, }, }) pixels_response = session.post(url, body) pixels_content = pixels_response.content array = numpy.load(io.BytesIO(pixels_content)) print('Shape: %s' % (array.shape,)) print('Data:') print(array)
Die Ausgabe sollte in etwa so aussehen:
Shape: (256, 256)
Data:
[[( 899, 586, 351, 189) ( 918, 630, 501, 248) (1013, 773, 654, 378) ...,
(1014, 690, 419, 323) ( 942, 657, 424, 260) ( 987, 691, 431, 315)]
[( 902, 630, 541, 227) (1059, 866, 719, 429) (1195, 922, 626, 539) ...,
( 978, 659, 404, 287) ( 954, 672, 426, 279) ( 990, 678, 397, 304)]
[(1050, 855, 721, 419) (1257, 977, 635, 569) (1137, 770, 400, 435) ...,
( 972, 674, 421, 312) (1001, 688, 431, 311) (1004, 659, 378, 284)]
...,
[( 969, 672, 375, 275) ( 927, 680, 478, 294) (1018, 724, 455, 353) ...,
( 924, 659, 375, 232) ( 921, 664, 438, 273) ( 966, 737, 521, 306)]
[( 920, 645, 391, 248) ( 979, 728, 481, 327) ( 997, 708, 425, 324) ...,
( 927, 673, 387, 243) ( 927, 688, 459, 284) ( 962, 732, 509, 331)]
[( 978, 723, 449, 330) (1005, 712, 446, 314) ( 946, 667, 393, 269) ...,
( 949, 692, 413, 271) ( 927, 689, 472, 285) ( 966, 742, 516, 331)]]
Wenn Sie eine andere Gruppe von Pixeln aus diesem Bild auswählen möchten, geben Sie einfach die entsprechende affineTransform
an. Denken Sie daran, dass affineTransform
im räumlichen Koordinatenreferenzsystem des Bildes angegeben wird. Wenn Sie die Position des Ursprungs stattdessen in Pixelkoordinaten anpassen möchten, verwenden Sie diese einfache Formel:
request_origin = image_origin + pixel_scale * offset_in_pixels
Miniaturbild generieren
Wir können einen ähnlichen Mechanismus verwenden, um ein RGB-Thumbnail dieses Bildes zu generieren. Anstatt Daten in ihrer nativen Auflösung anzufordern, geben wir eine Region und Bilddimensionen explizit an. Um ein Miniaturbild des gesamten Bildes zu erhalten, können wir die Footprint-Geometrie des Bildes als Anfragebereich verwenden. Wenn wir schließlich die roten, grünen und blauen Bildbänder und einen geeigneten Bereich von Datenwerten angeben, können wir ein ansprechendes RGB-Vorschaubild erstellen.
Zusammenfassend sieht der Python-Snippet so aus (mit dem Colab-Widget IPython
zur Bildanzeige):
url = 'https://earthengine.googleapis.com/v1alpha/{}:getPixels'.format(name) body = json.dumps({ 'fileFormat': 'PNG', 'bandIds': ['B4', 'B3', 'B2'], 'region': asset['geometry'], 'grid': { 'dimensions': {'width': 256, 'height': 256}, }, 'visualizationOptions': { 'ranges': [{'min': 0, 'max': 3000}], }, }) image_response = session.post(url, body) image_content = image_response.content from IPython.display import Image Image(image_content)
Hier sehen Sie das resultierende Thumbnail:
