Cálculos de imágenes con la API de REST de Earth Engine

Nota: La API de REST contiene funciones nuevas y avanzadas que tal vez no sean adecuadas para todos los usuarios. Si es la primera vez que usas Earth Engine, comienza con la guía de JavaScript.

En la guía de inicio rápido de la API de REST de Earth Engine, se muestra cómo acceder a bloques de píxeles desde un recurso de Earth Engine. Supongamos que deseas aplicar un cálculo a los píxeles antes de obtener el resultado. En esta guía, se muestra cómo crear un prototipo de un cálculo con una de las bibliotecas cliente, serializar el gráfico de cálculo y usar la API de REST para obtener el resultado calculado. Realizar solicitudes de procesamiento a través de la API de REST corresponde a una solicitud POST a uno de los extremos de procesamiento, por ejemplo, computePixels, computeFeatures o el genérico value.compute. En particular, este ejemplo muestra cómo obtener una composición mediana de las imágenes de Sentinel-2 en una región pequeña.

Antes de comenzar

Sigue estas instrucciones para hacer lo siguiente:

  1. Postúlate para usar Earth Engine
  2. Crea un proyecto de Google Cloud
  3. Habilita la API de Earth Engine en el proyecto
  4. Crea una cuenta de servicio
  5. Otorga permiso a nivel del proyecto a la cuenta de servicio para realizar cálculos de Earth Engine

Nota: Para completar este instructivo, necesitarás una cuenta de servicio registrada para acceder a Earth Engine. Consulta estas instrucciones para registrar una cuenta de servicio antes de continuar.

Autentica en Google Cloud

Lo primero que debes hacer es acceder para poder realizar solicitudes autenticadas a Google Cloud. Configurarás el proyecto al mismo tiempo. Sigue las instrucciones que se muestran en el resultado para completar el acceso.

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

!gcloud auth login --project {PROJECT}

Obtén un archivo de claves privadas para tu cuenta de servicio

Ya deberías tener una cuenta de servicio registrada para usar Earth Engine. Si no tienes una, sigue estas instrucciones para obtenerla. Copia la dirección de correo electrónico de tu cuenta de servicio en la siguiente celda. (La cuenta de servicio ya debe estar registrada para usar Earth Engine). En la siguiente celda, se usa la línea de comandos de gsutil para generar un archivo de claves para la cuenta de servicio. El archivo de claves se creará en la 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}

Inicia un AuthorizedSession y prueba tus credenciales

Prueba la clave privada usándola para obtener credenciales. Usa las credenciales para crear una sesión autorizada y realizar solicitudes HTTP. Realiza una solicitud GET a través de la sesión para verificar que las credenciales funcionen.

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

Cómo serializar un cálculo

Antes de que puedas enviar una solicitud para calcular algo, el cálculo debe colocarse en el formato de gráfico de expresión de Earth Engine. En el siguiente ejemplo, se muestra cómo obtener el gráfico de expresión.

Autenticación en Earth Engine

Obtén credenciales con alcance de Earth Engine desde la cuenta de servicio. Úsalos para inicializar 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)

Cómo definir un cálculo

Crea un prototipo de un cálculo simple con la API de cliente. Ten en cuenta que el resultado del cálculo es 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()

Serializa el gráfico de expresión

Esto creará un objeto que representa el gráfico de expresión de Earth Engine (específicamente, un Expression). En general, debes compilar estos objetos con una de las APIs cliente.

serialized = ee.serializer.encode(image)

Crea la proyección deseada (WGS84) en la escala deseada (10 metros para Sentinel-2). Esto solo sirve para descubrir la escala deseada en grados, las unidades de la proyección. Estas escalas se usarán para especificar la transformación afín en la solicitud.

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

Envía la solicitud

Realiza una solicitud POST al extremo computePixels. Ten en cuenta que la solicitud contiene Expression, que es el cálculo serializado. También contiene un PixelGrid. El objeto PixelGrid contiene dimensions para el resultado deseado y un AffineTransform en las unidades del sistema de coordenadas solicitado. Aquí, el sistema de coordenadas es geográfico, por lo que la transformación se especifica con la escala en grados y las coordenadas geográficas de la esquina superior izquierda del parche de imagen solicitado.

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

Si ejecutas este código en un notebook, puedes mostrar los resultados con el widget de visualización de imágenes IPython.

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