Calcoli delle immagini con l'API REST di Earth Engine

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:

  1. Richiedere Earth Engine
  2. Crea un progetto Google Cloud
  3. Abilitare l'API Earth Engine sul progetto
  4. Crea un account di servizio
  5. 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)