Quickstart

Panduan ini menjelaskan cara memulai dengan cepat untuk mengirimkan kueri ke Earth Engine REST API dari Python menggunakan Google Colab. Konsep yang sama berlaku untuk mengakses API dari bahasa dan lingkungan lain.

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.

Sebelum memulai

Ikuti petunjuk berikut untuk:

Menyiapkan notebook Colab

Jika memulai panduan memulai ini dari awal, Anda dapat membuat notebook Colab baru dengan mengklik NOTEBOOK BARU dari halaman mulai Colab dan memasukkan contoh kode di bawah ke dalam sel kode baru. Colab sudah menginstal Cloud SDK. Hal ini mencakup alat command line gcloud yang dapat Anda gunakan untuk mengelola layanan Cloud. Atau, jalankan notebook demo dari tombol di awal halaman ini.

Melakukan autentikasi ke Google Cloud

Hal pertama yang harus dilakukan adalah login agar Anda dapat membuat permintaan yang diautentikasi ke Google Cloud.

Di Colab, Anda dapat menjalankan:

PROJECT = 'my-project'
!gcloud auth login --project {PROJECT}

(Atau jika Anda menjalankan secara lokal, dari command line, dengan asumsi Anda telah menginstal Cloud SDK:)

PROJECT='my-project'
gcloud auth login --project $PROJECT

Terima opsi untuk login menggunakan akun pengguna Google Anda dan selesaikan proses login.

Mendapatkan file kunci pribadi untuk akun layanan Anda

Sebelum dapat menggunakan akun layanan untuk mengautentikasi, Anda harus mendownload file kunci pribadi. Untuk melakukannya di Colab, download ke VM notebook:

SERVICE_ACCOUNT='foo-name@project-name.iam.gserviceaccount.com'
KEY = 'my-secret-key.json'
!gcloud iam service-accounts keys create {KEY} --iam-account {SERVICE_ACCOUNT}

Atau dari command line:

SERVICE_ACCOUNT='foo-name@project-name.iam.gserviceaccount.com'
KEY='my-secret-key.json'
gcloud iam service-accounts keys create $KEY --iam-account $SERVICE_ACCOUNT

Mengakses dan Menguji Kredensial Anda

Sekarang Anda siap mengirimkan kueri pertama ke Earth Engine API. Gunakan kunci pribadi untuk mendapatkan kredensial. Gunakan kredensial untuk membuat sesi yang diotorisasi untuk membuat permintaan HTTP. Anda dapat memasukkan kode ini ke dalam sel kode baru di notebook Colab. (Jika menggunakan command line, Anda harus memastikan bahwa library yang diperlukan telah diinstal).

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/v1alpha/projects/earthengine-public/assets/LANDSAT'

response = session.get(url)

from pprint import pprint
import json
pprint(json.loads(response.content))

Jika semuanya dikonfigurasi dengan benar, menjalankan perintah ini akan menghasilkan output yang terlihat seperti:

{'id': 'LANDSAT',
 'name': 'projects/earthengine-public/assets/LANDSAT',
 'type': 'FOLDER'}

Pilih Set Data

Anda dapat menelusuri dan menjelajahi set data yang tersedia menggunakan Editor Kode Earth Engine di code.earthengine.google.com. Mari kita cari beberapa data Sentinel 2. (Jika ini pertama kalinya Anda menggunakan Editor Kode, Anda akan diminta untuk mengizinkannya mengakses Earth Engine atas nama Anda saat Anda login.) Di Editor Kode, telusuri "sentinel" di kotak penelusuran di bagian atas. Beberapa set data raster akan muncul:

Klik "Sentinel-2: MultiSpectral Instrument (MSI), Level-1C":

Halaman deskripsi set data seperti ini menyertakan informasi penting yang Anda butuhkan untuk menggunakan set data apa pun di Katalog Data Publik Earth Engine, termasuk deskripsi singkat set data, link ke penyedia data untuk mendapatkan detail tambahan, informasi tentang batasan penggunaan yang mungkin berlaku untuk set data, dan ID aset Earth Engine set data.

Dalam hal ini, kita melihat di sisi kanan jendela bahwa ini adalah aset koleksi gambar yang jalur filenya adalah COPERNICUS/S2.

Mengajukan Kueri untuk Gambar Tertentu

Set data Sentinel-2 ini mencakup lebih dari dua juta gambar yang mencakup dunia dari tahun 2015 hingga saat ini. Mari kita kirimkan kueri projects.assets.listImages terhadap koleksi gambar untuk menemukan beberapa data dari April 2017, dengan cakupan awan rendah yang mencakup titik tertentu di Mountain View, California.

import urllib

coords = [-122.085, 37.422]

project = 'projects/earthengine-public'
asset_id = 'COPERNICUS/S2'
name = '{}/assets/{}'.format(project, asset_id)
url = 'https://earthengine.googleapis.com/v1alpha/{}:listImages?{}'.format(
  name, urllib.parse.urlencode({
    'startTime': '2017-04-01T00:00:00.000Z',
    'endTime': '2017-05-01T00:00:00.000Z',
    'region': '{"type":"Point", "coordinates":' + str(coords) + '}',
    'filter': 'CLOUDY_PIXEL_PERCENTAGE < 10',
}))

response = session.get(url)
content = response.content

for asset in json.loads(content)['images']:
    id = asset['id']
    cloud_cover = asset['properties']['CLOUDY_PIXEL_PERCENTAGE']
    print('%s : %s' % (id, cloud_cover))

Skrip ini mengkueri koleksi untuk mencari gambar yang cocok, mendekode respons JSON yang dihasilkan, dan mencetak ID aset serta cakupan awan untuk setiap aset gambar yang cocok. Output-nya akan terlihat seperti:

COPERNICUS/S2/20170420T184921_20170420T190203_T10SEG : 4.3166
COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG : 0

Ternyata ada dua gambar di atas titik ini yang diambil bulan ini dan memiliki cakupan awan yang rendah.

Memeriksa Gambar Tertentu

Sepertinya salah satu pencocokan pada dasarnya tidak memiliki tutupan awan. Mari kita lihat lebih dekat aset tersebut, yang ID-nya adalah COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG. Perhatikan bahwa semua aset katalog publik adalah milik project earthengine-public. Berikut cuplikan Python yang akan mengeluarkan kueri projects.assets.get untuk mengambil detail aset tertentu tersebut menurut ID, mencetak band data yang tersedia, dan mencetak informasi yang lebih mendetail tentang band pertama:

asset_id = 'COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG'
name = '{}/assets/{}'.format(project, asset_id)
url = 'https://earthengine.googleapis.com/v1alpha/{}'.format(name)

response = session.get(url)
content = response.content

asset = json.loads(content)
print('Band Names: %s' % ','.join(band['id'] for band in asset['bands']))
print('First Band: %s' % json.dumps(asset['bands'][0], indent=2, sort_keys=True))

Outputnya akan terlihat seperti ini:

Band Names: B1,B2,B3,B4,B5,B6,B7,B8,B8A,B9,B10,B11,B12,QA10,QA20,QA60
First Band: {
  "dataType": {
    "precision": "INTEGER",
    "range": {
      "max": 65535
    }
  },
  "grid": {
    "affineTransform": {
      "scaleX": 60,
      "scaleY": -60,
      "translateX": 499980,
      "translateY": 4200000
    },
    "crsCode": "EPSG:32610",
    "dimensions": {
      "height": 1830,
      "width": 1830
    }
  },
  "id": "B1",
  "pyramidingPolicy": "MEAN"
}

Daftar rentang data sesuai dengan yang kita lihat sebelumnya dalam deskripsi set data. Kita dapat melihat bahwa set data ini memiliki data bilangan bulat 16-bit dalam sistem koordinat EPSG:32610, atau UTM Zone 10N. Band pertama memiliki ID B1 dan resolusi 60 meter per piksel. Asal gambar berada di posisi (499980,4200000) dalam sistem koordinat ini.

Nilai negatif affineTransform.scaleY menunjukkan bahwa titik asal berada di sudut barat laut gambar, seperti biasanya: indeks piksel y yang meningkat sesuai dengan koordinat spasial y yang menurun (menuju selatan).

Mengambil Nilai Piksel

Mari kita kirimkan kueri projects.assets.getPixels untuk mengambil beberapa data dari band resolusi tinggi gambar ini. Halaman deskripsi set data menyatakan bahwa band B2, B3, B4, dan B8 memiliki resolusi 10 meter per piksel. Skrip ini mengambil data ubin 256x256 piksel kiri atas dari empat rentang tersebut. Memuat data dalam format NPY numpy akan memudahkan decoding respons menjadi array data Python.

import numpy
import io

name = '{}/assets/{}'.format(project, asset_id)
url = 'https://earthengine.googleapis.com/v1alpha/{}:getPixels'.format(name)
body = json.dumps({
    'fileFormat': 'NPY',
    'bandIds': ['B2', 'B3', 'B4', 'B8'],
    'grid': {
        'affineTransform': {
            'scaleX': 10,
            'scaleY': -10,
            'translateX': 499980,
            'translateY': 4200000,
        },
        'dimensions': {'width': 256, 'height': 256},
    },
})

pixels_response = session.post(url, body)
pixels_content = pixels_response.content

array = numpy.load(io.BytesIO(pixels_content))
print('Shape: %s' % (array.shape,))
print('Data:')
print(array)

Output-nya akan terlihat seperti ini:

Shape: (256, 256)
Data:
[[( 899, 586, 351, 189) ( 918, 630, 501, 248) (1013, 773, 654, 378) ...,
  (1014, 690, 419, 323) ( 942, 657, 424, 260) ( 987, 691, 431, 315)]
 [( 902, 630, 541, 227) (1059, 866, 719, 429) (1195, 922, 626, 539) ...,
  ( 978, 659, 404, 287) ( 954, 672, 426, 279) ( 990, 678, 397, 304)]
 [(1050, 855, 721, 419) (1257, 977, 635, 569) (1137, 770, 400, 435) ...,
  ( 972, 674, 421, 312) (1001, 688, 431, 311) (1004, 659, 378, 284)]
 ...,
 [( 969, 672, 375, 275) ( 927, 680, 478, 294) (1018, 724, 455, 353) ...,
  ( 924, 659, 375, 232) ( 921, 664, 438, 273) ( 966, 737, 521, 306)]
 [( 920, 645, 391, 248) ( 979, 728, 481, 327) ( 997, 708, 425, 324) ...,
  ( 927, 673, 387, 243) ( 927, 688, 459, 284) ( 962, 732, 509, 331)]
 [( 978, 723, 449, 330) (1005, 712, 446, 314) ( 946, 667, 393, 269) ...,
  ( 949, 692, 413, 271) ( 927, 689, 472, 285) ( 966, 742, 516, 331)]]

Untuk memilih kumpulan piksel yang berbeda dari gambar ini, cukup tentukan affineTransform yang sesuai. Ingatlah bahwa affineTransform ditentukan dalam sistem referensi koordinat spasial gambar; jika Anda ingin menyesuaikan lokasi asal dalam koordinat piksel, gunakan formula sederhana ini:

request_origin = image_origin + pixel_scale * offset_in_pixels

Membuat Gambar Thumbnail

Kita dapat menggunakan mekanisme serupa untuk membuat thumbnail RGB gambar ini. Daripada meminta data pada resolusi aslinya, kita akan menentukan region dan dimensi gambar secara eksplisit. Untuk mendapatkan thumbnail seluruh gambar, kita dapat menggunakan geometri jejak gambar sebagai wilayah permintaan. Terakhir, dengan menentukan band gambar merah, hijau, dan biru serta rentang nilai data yang sesuai, kita bisa mendapatkan gambar kecil RGB yang menarik.

Dengan menggabungkan semuanya, cuplikan Python akan terlihat seperti ini (menggunakan widget tampilan gambar IPython Colab):

url = 'https://earthengine.googleapis.com/v1alpha/{}:getPixels'.format(name)
body = json.dumps({
    'fileFormat': 'PNG',
    'bandIds': ['B4', 'B3', 'B2'],
    'region': asset['geometry'],
    'grid': {
        'dimensions': {'width': 256, 'height': 256},
    },
    'visualizationOptions': {
        'ranges': [{'min': 0, 'max': 3000}],
    },
})

image_response = session.post(url, body)
image_content = image_response.content

from IPython.display import Image
Image(image_content)

Berikut adalah gambar thumbnail yang dihasilkan: