Obliczenia na obrazach za pomocą interfejsu Earth Engine REST API

Uwaga: interfejs API REST zawiera nowe i zaawansowane funkcje, które mogą nie być odpowiednie dla wszystkich użytkowników. Jeśli dopiero zaczynasz korzystać z Earth Engine, zapoznaj się z przewodnikiem po JavaScript.

tym krótkim wprowadzeniu do interfejsu Earth Engine REST API dowiesz się, jak uzyskać dostęp do bloków pikseli z zasobu Earth Engine. Załóżmy, że przed uzyskaniem wyniku chcesz zastosować obliczenia do pikseli. Ten przewodnik pokazuje, jak prototypować obliczenia za pomocą jednej z bibliotek klienta, serializować wykres obliczeń i używać interfejsu REST API do uzyskiwania obliczonych wyników. Wysyłanie żądań obliczeniowych za pomocą interfejsu API REST odpowiada wysłaniu POST żądania do jednego z punktów końcowych obliczeń, np. computePixels, computeFeatures lub ogólnego value.compute. W tym przykładzie pokazujemy, jak uzyskać medianę kompozycji obrazów z satelity Sentinel-2 w małym regionie.

Zanim zaczniesz

Postępuj zgodnie z tymi instrukcjami, aby:

  1. Zgłaszanie się do Earth Engine
  2. Tworzenie projektu Google Cloud
  3. Włącz interfejs Earth Engine API w projekcie.
  4. Tworzenie konta usługi
  5. Przyznaj kontu usługi uprawnienia na poziomie projektu do wykonywania obliczeń w Earth Engine.

Uwaga: aby wykonać zadania z tego samouczka, musisz mieć konto usługi zarejestrowane w Earth Engine. Zanim przejdziesz dalej, zapoznaj się z tymi instrukcjami, aby zarejestrować konto usługi.

Uwierzytelnianie w Google Cloud

Najpierw musisz się zalogować, aby móc wysyłać uwierzytelnione żądania do Google Cloud. Projekt skonfigurujesz w tym samym czasie. Aby dokończyć logowanie, postępuj zgodnie z instrukcjami w wyniku.

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

!gcloud auth login --project {PROJECT}

Uzyskiwanie pliku klucza prywatnego konta usługi

Aby korzystać z Earth Engine, musisz mieć zarejestrowane konto usługi. Jeśli nie masz konta, wykonaj te instrukcje, aby je utworzyć. Skopiuj adres e-mail konta usługi do następnej komórki. (Aby korzystać z Earth Engine, konto usługi musi być już zarejestrowane). W następnej komórce wiersz poleceń gsutil służy do wygenerowania pliku klucza dla konta usługi. Plik klucza zostanie utworzony na maszynie wirtualnej notatnika.

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

Rozpocznij AuthorizedSession i sprawdź swoje dane logowania

Przetestuj klucz prywatny, używając go do uzyskania danych logowania. Użyj danych logowania, aby utworzyć autoryzowaną sesję do wysyłania żądań HTTP. Wyślij GETprośbę w ramach sesji, aby sprawdzić, czy dane logowania działają.

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

Serializowanie obliczeń

Zanim wyślesz żądanie obliczeń, musisz przekształcić je w format wykresu wyrażeń Earth Engine. Poniżej pokazujemy, jak uzyskać wykres wyrażeń.

Uwierzytelnianie w Earth Engine

Pobierz z konta usługi dane logowania Earth Engine o ograniczonym zakresie. Użyj ich do zainicjowania 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)

Określanie obliczeń

Utwórz prototyp prostego obliczenia za pomocą interfejsu API klienta. Zwróć uwagę, że wynikiem obliczeń jest 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()

Serializowanie wykresu wyrażeń

Spowoduje to utworzenie obiektu reprezentującego wykres wyrażeń Earth Engine (a konkretnie Expression). Zwykle należy je tworzyć za pomocą jednego z interfejsów API klienta.

serialized = ee.serializer.encode(image)

Utwórz żądaną projekcję (WGS84) w żądanej skali (10 metrów w przypadku Sentinel-2). Chodzi tylko o określenie żądanej skali w stopniach, czyli jednostkach projekcji. Te skale będą używane do określania w żądaniu przekształcenia afinicznego.

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

Wysyłanie żądania

Wyślij żądanie POST do punktu końcowego computePixels. Pamiętaj, że żądanie zawiera Expression, czyli serializowany wynik obliczeń. Zawiera też PixelGrid. Element PixelGrid zawiera dimensions dla żądanego wyniku i AffineTransform w jednostkach żądanego układu współrzędnych. W tym przypadku układ współrzędnych jest geograficzny, więc przekształcenie jest określone za pomocą skali w stopniach i współrzędnych geograficznych lewego górnego rogu żądanego fragmentu obrazu.

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

Jeśli uruchamiasz to w notatniku, możesz wyświetlić wyniki za pomocą widżetu wyświetlania obrazów IPython.

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