Tính toán hình ảnh bằng Earth Engine REST API

Lưu ý: REST API có các tính năng mới và nâng cao có thể không phù hợp với một số người dùng. Nếu bạn mới sử dụng Earth Engine, vui lòng bắt đầu bằng hướng dẫn về JavaScript.

Hướng dẫn khởi động nhanh về Earth Engine REST API cho biết cách truy cập vào các khối pixel từ một thành phần Earth Engine. Giả sử bạn muốn áp dụng một phép tính cho các pixel trước khi nhận được kết quả. Hướng dẫn này cho biết cách tạo mẫu một phép tính bằng một trong các thư viện ứng dụng, cách chuyển đổi đồ thị tính toán thành chuỗi và cách sử dụng REST API để nhận kết quả đã tính. Việc đưa ra yêu cầu tính toán thông qua API REST tương ứng với yêu cầu POST đối với một trong các điểm cuối tính toán, ví dụ: computePixels, computeFeatures hoặc value.compute chung. Cụ thể, ví dụ này minh hoạ cách lấy một thành phần trung bình của hình ảnh Sentinel-2 trong một khu vực nhỏ.

Trước khi bắt đầu

Hãy làm theo các hướng dẫn này để:

  1. Đăng ký sử dụng Earth Engine
  2. Tạo một dự án trên Google Cloud
  3. Bật Earth Engine API trên dự án
  4. Tạo một tài khoản dịch vụ
  5. Cấp cho tài khoản dịch vụ quyền ở cấp dự án để thực hiện các phép tính trên Earth Engine

Lưu ý: Để hoàn tất hướng dẫn này, bạn sẽ cần có một tài khoản dịch vụ đã đăng ký quyền truy cập vào Earth Engine. Hãy xem các hướng dẫn này để đăng ký tài khoản dịch vụ trước khi tiếp tục.

Xác thực với Google Cloud

Điều đầu tiên cần làm là đăng nhập để bạn có thể đưa ra các yêu cầu đã xác thực cho Google Cloud. Bạn sẽ thiết lập dự án cùng lúc. Làm theo hướng dẫn trong đầu ra để hoàn tất quá trình đăng nhập.

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

!gcloud auth login --project {PROJECT}

Lấy tệp khoá riêng tư cho tài khoản dịch vụ của bạn

Bạn phải có một tài khoản dịch vụ đã đăng ký để sử dụng Earth Engine. Nếu bạn chưa có, hãy làm theo các hướng dẫn này để lấy một mã. Sao chép địa chỉ email của tài khoản dịch vụ vào ô sau. (Bạn phải đăng ký tài khoản dịch vụ để sử dụng Earth Engine). Trong ô sau, dòng lệnh gsutil được dùng để tạo một tệp khoá cho tài khoản dịch vụ. Tệp khoá sẽ được tạo trên VM của sổ tay.

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

Bắt đầu AuthorizedSession và kiểm tra thông tin đăng nhập của bạn

Kiểm thử khoá riêng tư bằng cách sử dụng khoá này để lấy thông tin đăng nhập. Sử dụng thông tin xác thực để tạo một phiên được uỷ quyền nhằm thực hiện các yêu cầu HTTP. Đưa ra yêu cầu GET thông qua phiên để kiểm tra xem thông tin đăng nhập có hoạt động hay không.

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

Tuần tự hoá một phép tính

Trước khi bạn có thể gửi yêu cầu tính toán một nội dung nào đó, nội dung tính toán cần được đưa vào định dạng biểu đồ biểu thức Earth Engine. Sau đây minh hoạ cách lấy biểu đồ biểu thức.

Xác thực với Earth Engine

Nhận thông tin đăng nhập có phạm vi Earth Engine từ tài khoản dịch vụ. Sử dụng các khoá này để khởi chạy 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)

Xác định một phép tính

Tạo nguyên mẫu cho một phép tính đơn giản bằng API ứng dụng. Lưu ý rằng kết quả của phép tính là một 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()

Tuần tự hoá biểu đồ biểu thức

Thao tác này sẽ tạo một đối tượng đại diện cho biểu đồ biểu thức Earth Engine (cụ thể là Expression). Nhìn chung, bạn nên tạo các đối tượng này bằng một trong các API ứng dụng.

serialized = ee.serializer.encode(image)

Tạo phép chiếu mong muốn (WGS84) ở tỷ lệ mong muốn (10 mét đối với Sentinel-2). Đây chỉ là để khám phá tỷ lệ mong muốn theo độ, đơn vị của phép chiếu. Các tỷ lệ này sẽ được dùng để chỉ định phép biến đổi á-phin trong yêu cầu.

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

Gửi yêu cầu

Gửi yêu cầu POST đến điểm cuối computePixels. Xin lưu ý rằng yêu cầu này chứa Expression, là phép tính được chuyển đổi tuần tự. Thư mục này cũng chứa PixelGrid. PixelGrid chứa dimensions cho đầu ra mong muốn và AffineTransform theo đơn vị của hệ toạ độ được yêu cầu. Ở đây, hệ toạ độ là hệ toạ độ địa lý, vì vậy, phép biến đổi được chỉ định bằng tỷ lệ theo độ và toạ độ địa lý của góc trên cùng bên trái của mảng hình ảnh được yêu cầu.

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

Nếu đang chạy chương trình này trong một sổ tay, bạn có thể hiển thị kết quả bằng tiện ích hiển thị hình ảnh IPython.

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