Komputasi gambar dengan Earth Engine REST API

Catatan: REST API berisi fitur baru dan canggih yang mungkin tidak cocok untuk semua pengguna. Jika Anda baru menggunakan Earth Engine, mulailah dengan panduan JavaScript.

Panduan memulai Earth Engine REST API menunjukkan cara mengakses blok piksel dari aset Earth Engine. Misalkan Anda ingin menerapkan komputasi ke piksel sebelum mendapatkan hasilnya. Panduan ini menunjukkan cara membuat prototipe komputasi dengan salah satu library klien, melakukan serialisasi grafik komputasi, dan menggunakan REST API untuk mendapatkan hasil komputasi. Membuat permintaan komputasi melalui REST API sesuai dengan permintaan POST ke salah satu endpoint komputasi, misalnya computePixels, computeFeatures, atau value.compute generik. Secara khusus, contoh ini menunjukkan cara mendapatkan komposit median gambar Sentinel-2 di wilayah kecil.

Sebelum memulai

Ikuti petunjuk berikut untuk:

  1. Mendaftar ke Earth Engine
  2. Membuat project Google Cloud
  3. Aktifkan Earth Engine API di project
  4. Membuat akun layanan
  5. Memberi akun layanan izin tingkat project untuk melakukan komputasi Earth Engine

Catatan: Untuk menyelesaikan tutorial ini, Anda memerlukan akun layanan yang terdaftar untuk akses Earth Engine. Lihat petunjuk ini untuk mendaftarkan akun layanan sebelum melanjutkan.

Melakukan autentikasi ke Google Cloud

Hal pertama yang harus dilakukan adalah login agar Anda dapat membuat permintaan yang diautentikasi ke Google Cloud. Anda akan menetapkan project pada saat yang sama. Ikuti petunjuk dalam output untuk menyelesaikan login.

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

!gcloud auth login --project {PROJECT}

Mendapatkan file kunci pribadi untuk akun layanan Anda

Anda seharusnya sudah memiliki akun layanan yang terdaftar untuk menggunakan Earth Engine. Jika Anda belum memilikinya, ikuti petunjuk ini untuk mendapatkannya. Salin alamat email akun layanan Anda ke dalam sel berikut. (Akun layanan harus sudah terdaftar untuk menggunakan Earth Engine). Di sel berikut, command line gsutil digunakan untuk membuat file kunci bagi akun layanan. File kunci akan dibuat di VM 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}

Mulai AuthorizedSession dan uji kredensial Anda

Uji kunci pribadi dengan menggunakannya untuk mendapatkan kredensial. Gunakan kredensial untuk membuat sesi yang diotorisasi untuk membuat permintaan HTTP. Buat permintaan GET melalui sesi untuk memeriksa apakah kredensial berfungsi.

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

Menserialisasi komputasi

Sebelum Anda dapat mengirim permintaan untuk menghitung sesuatu, penghitungan harus dimasukkan ke dalam format grafik ekspresi Earth Engine. Berikut ini menunjukkan cara mendapatkan grafik ekspresi.

Melakukan autentikasi ke Earth Engine

Dapatkan kredensial yang memiliki cakupan Earth Engine dari akun layanan. Gunakan kredensial tersebut untuk melakukan inisialisasi 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)

Menentukan komputasi

Buat prototipe komputasi sederhana dengan API klien. Perhatikan bahwa hasil komputasi adalah 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()

Menserialisasi grafik ekspresi

Tindakan ini akan membuat objek yang merepresentasikan grafik ekspresi Earth Engine (khususnya, Expression). Secara umum, Anda harus membuatnya dengan salah satu API klien.

serialized = ee.serializer.encode(image)

Buat proyeksi yang diinginkan (WGS84) pada skala yang diinginkan (10 meter untuk Sentinel-2). Tindakan ini hanya untuk menemukan skala yang diinginkan dalam derajat, satuan proyeksi. Skala ini akan digunakan untuk menentukan transformasi affine dalam permintaan.

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

Kirim permintaan

Buat permintaan POST ke endpoint computePixels. Perhatikan bahwa permintaan berisi Expression, yang merupakan komputasi yang diserialisasi. Objek ini juga berisi PixelGrid. PixelGrid berisi dimensions untuk output yang diinginkan dan AffineTransform dalam satuan sistem koordinat yang diminta. Di sini, sistem koordinatnya adalah geografis, sehingga transformasi ditentukan dengan skala dalam derajat dan koordinat geografis sudut kiri atas patch gambar yang diminta.

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

Jika menjalankan ini di notebook, Anda dapat menampilkan hasilnya menggunakan widget tampilan gambar IPython.

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