Nota:l'API REST contiene funzionalità nuove e avanzate che potrebbero non essere adatte a tutti gli utenti. Se non hai mai utilizzato Earth Engine, inizia con la guida JavaScript.
La guida rapida all'API REST di Earth Engine mostra come accedere a blocchi di pixel da un asset Earth Engine. Supponiamo di voler applicare un calcolo ai pixel prima di ottenere il risultato. Questa guida mostra come prototipare un calcolo con una delle librerie client, serializzare il grafico di calcolo e utilizzare l'API REST per ottenere il risultato calcolato. L'invio di richieste di calcolo tramite l'API REST corrisponde a una richiesta POST
a uno degli endpoint di calcolo, ad esempio computePixels
, computeFeatures
o l'endpoint generico value.compute
. Nello specifico, questo esempio mostra come ottenere un composito mediano delle immagini Sentinel-2 in una piccola regione.
Prima di iniziare
Segui queste istruzioni per:
- Richiedere Earth Engine
- Crea un progetto Google Cloud
- Abilitare l'API Earth Engine sul progetto
- Crea un account di servizio
- Concedi al service account l'autorizzazione a livello di progetto per eseguire i calcoli di Earth Engine
Nota: per completare questo tutorial, avrai bisogno di un service account registrato per l'accesso a Earth Engine. Consulta queste istruzioni per registrare un service account prima di procedere.
Autenticarsi su Google Cloud
La prima cosa da fare è accedere per poter effettuare richieste autenticate a Google Cloud. Imposterai il progetto contemporaneamente. Segui le istruzioni nell'output per completare l'accesso.
# INSERT YOUR PROJECT HERE
PROJECT = 'your-project'
!gcloud auth login --project {PROJECT}
Ottenere un file della chiave privata per il service account
Per utilizzare Earth Engine, dovresti già avere un service account registrato. In caso contrario, segui queste istruzioni per ottenerne uno. Copia l'indirizzo email del tuo service account nella cella seguente. Il service account deve essere già registrato per utilizzare Earth Engine. Nella cella seguente, la riga di comando gsutil
viene utilizzata per generare un file di chiavi per il service account. Il file della chiave verrà creato nella VM del notebook.
# 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}
Avvia un AuthorizedSession
e verifica le tue credenziali
Testa la chiave privata utilizzandola per ottenere le credenziali. Utilizza le credenziali per creare una sessione autorizzata per effettuare richieste HTTP. Esegui una richiesta GET
tramite la sessione per verificare che le credenziali funzionino.
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))
Serializzare un calcolo
Prima di poter inviare una richiesta di calcolo, il calcolo deve essere inserito nel formato del grafico delle espressioni di Earth Engine. Di seguito viene illustrato come ottenere il grafico dell'espressione.
Esegui l'autenticazione in Earth Engine
Ottieni le credenziali con ambito Earth Engine dal service account. Utilizzali per inizializzare 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)
Definisci un calcolo
Crea il prototipo di un semplice calcolo con l'API client. Tieni presente che il risultato del calcolo è un 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()
Serializzare il grafico dell'espressione
Verrà creato un oggetto che rappresenta il grafico dell'espressione Earth Engine (in particolare, un Expression
). In generale, devi crearli con una delle API client.
serialized = ee.serializer.encode(image)
Crea la proiezione desiderata (WGS84) alla scala desiderata (10 metri per Sentinel-2). Serve solo per scoprire la scala desiderata in gradi, le unità della proiezione. Queste scale verranno utilizzate per specificare la trasformazione affine nella richiesta.
# 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]
Invia la richiesta
Invia una richiesta POST
all'endpoint computePixels
. Tieni presente che la richiesta contiene Expression
, ovvero il calcolo serializzato. Contiene anche un PixelGrid
. PixelGrid
contiene dimensions
per l'output desiderato e un AffineTransform
nelle unità del sistema di coordinate richiesto. In questo caso, il sistema di coordinate è geografico, quindi la trasformazione viene specificata con la scala in gradi e le coordinate geografiche dell'angolo in alto a sinistra della patch dell'immagine richiesta.
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
Se esegui questa operazione in un notebook, puoi visualizzare i risultati utilizzando il widget di visualizzazione delle immagini IPython
.
# Import the Image function from the IPython.display module.
from IPython.display import Image
Image(image_content)