Computações de imagens com a API REST do Earth Engine

Observação: a API REST contém recursos novos e avançados que podem não ser adequados para todos os usuários. Se você não conhece o Earth Engine, comece com o guia de JavaScript.

O guia de início rápido da API REST do Earth Engine mostra como acessar blocos de pixels de um recurso do Earth Engine. Suponha que você queira aplicar um cálculo aos pixels antes de obter o resultado. Este guia mostra como criar um protótipo de computação com uma das bibliotecas de cliente, serializar o gráfico de computação e usar a API REST para receber o resultado calculado. Fazer solicitações de computação pela API REST corresponde a uma solicitação POST para um dos endpoints de computação, por exemplo, computePixels, computeFeatures ou o value.compute genérico. Especificamente, este exemplo demonstra como extrair uma mediana composta de imagens do Sentinel-2 em uma pequena região.

Antes de começar

Siga estas instruções para:

  1. Inscrever-se no Earth Engine
  2. Criar um projeto do Google Cloud
  3. Ativar a API Earth Engine no projeto
  4. Criar uma conta de serviço
  5. Conceda à conta de serviço permissão no nível do projeto para realizar cálculos do Earth Engine

Observação: para concluir este tutorial, você vai precisar de uma conta de serviço registrada para acesso ao Earth Engine. Consulte estas instruções para registrar uma conta de serviço antes de continuar.

Autenticar no Google Cloud

Primeiro, faça login para poder fazer solicitações autenticadas ao Google Cloud. Você vai definir o projeto ao mesmo tempo. Siga as instruções na saída para concluir o login.

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

!gcloud auth login --project {PROJECT}

Extrair um arquivo de chave privada para sua conta de serviço

Você já precisa ter uma conta de serviço registrada para usar o Earth Engine. Caso contrário, siga estas instruções para criar uma. Copie o endereço de e-mail da sua conta de serviço na célula a seguir. A conta de serviço já precisa estar registrada para usar o Earth Engine. Na célula a seguir, a linha de comando gsutil é usada para gerar um arquivo de chave para a conta de serviço. O arquivo de chave será criado na VM do 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}

Iniciar um AuthorizedSession e testar suas credenciais

Teste a chave privada usando-a para receber credenciais. Use as credenciais para criar uma sessão autorizada e fazer solicitações HTTP. Faça uma solicitação GET pela sessão para verificar se as credenciais funcionam.

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

Serializar um cálculo

Antes de enviar uma solicitação para calcular algo, é necessário colocar o cálculo no formato de gráfico de expressão do Earth Engine. Confira abaixo como conseguir o gráfico de expressão.

Autenticar no Earth Engine

Receba as credenciais do Earth Engine com escopo da conta de serviço. Use-as para inicializar o 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)

Definir um cálculo

Crie um protótipo de um cálculo simples com a API do cliente. O resultado do cálculo é um 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()

Serializar o gráfico de expressão

Isso vai criar um objeto que representa o gráfico de expressão do Earth Engine (especificamente, um Expression). Em geral, você deve criar esses objetos com uma das APIs de cliente.

serialized = ee.serializer.encode(image)

Crie a projeção desejada (WGS84) na escala desejada (10 metros para o Sentinel-2). Isso é apenas para descobrir a escala desejada em graus, as unidades da projeção. Essas escalas serão usadas para especificar a transformação afim na solicitação.

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

Enviar a solicitação

Faça uma solicitação POST ao endpoint computePixels. A solicitação contém o Expression, que é o cálculo serializado. Ele também contém um PixelGrid. O PixelGrid contém dimensions para a saída desejada e um AffineTransform nas unidades do sistema de coordenadas solicitado. Aqui, o sistema de coordenadas é geográfico. Portanto, a transformação é especificada com escala em graus e coordenadas geográficas do canto superior esquerdo do patch de imagem 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

Se você estiver executando isso em um notebook, poderá mostrar os resultados usando o widget de exibição de imagens IPython.

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