使用 Earth Engine REST API 进行图像计算

注意 REST API 包含新的高级功能,可能不适合所有用户。如果您是 Earth Engine 新手,请先参阅 JavaScript 指南

Earth Engine REST API 快速入门介绍了如何从 Earth Engine 资源访问像素块。假设您想在获得结果之前对像素应用计算。本指南介绍了如何使用某个客户端库对计算进行原型设计、序列化计算图,以及使用 REST API 获取计算结果。通过 REST API 发出计算请求相当于向某个计算端点(例如 computePixelscomputeFeatures 或通用端点 value.compute)发出 POST 请求。具体而言,此示例演示了如何获取小区域内 Sentinel-2 影像的中值合成。

准备工作

按照这些说明执行以下操作:

  1. 申请使用 Earth Engine
  2. 创建 Google Cloud 项目
  3. 在项目中启用 Earth Engine API
  4. 创建服务账号
  5. 授予服务账号项目级权限以执行 Earth Engine 计算

注意:如需完成本教程,您需要拥有已注册 Earth Engine 访问权限的服务账号。请参阅这些说明,先注册服务账号,然后再继续操作。

向 Google Cloud 进行身份验证

首先,您需要登录,以便向 Google Cloud 发出经过身份验证的请求。您将同时设置项目。按照输出中的说明完成登录。

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

!gcloud auth login --project {PROJECT}

获取服务账号的私钥文件

您应该已注册一个服务账号,以便使用 Earth Engine。如果没有,请按照这些说明获取一个。将服务账号的电子邮件地址复制到以下单元格中。(服务账号必须已注册才能使用 Earth Engine)。在以下单元格中,使用 gsutil 命令行生成服务账号的密钥文件。系统将在笔记本虚拟机上创建密钥文件。

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

启动 AuthorizedSession 并测试您的凭据

使用私钥获取凭据,以测试该私钥。使用凭据创建授权会话以发出 HTTP 请求。通过会话发出 GET 请求,以检查凭据是否有效。

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

序列化计算

在发送计算请求之前,需要将计算内容转换为 Earth Engine 表达式图格式。以下示例展示了如何获取表达式图。

向 Earth Engine 进行身份验证

从服务账号获取 Earth Engine 范围的凭据。使用它们来初始化 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)

定义计算

使用客户端 API 制作简单计算的原型。请注意,计算结果为 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()

序列化表达式图

这将创建一个表示 Earth Engine 表达式图的对象(具体来说,是一个 Expression)。一般来说,您应该使用某个客户端 API 来构建这些对象。

serialized = ee.serializer.encode(image)

以所需比例(对于 Sentinel-2 为 10 米)创建所需投影 (WGS84)。这只是为了发现所需的比例(以度为单位,即投影的单位)。这些缩放比例将用于在请求中指定仿射转换。

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

发送请求

computePixels 端点发出 POST 请求。请注意,请求包含 Expression,即序列化计算。它还包含一个 PixelGridPixelGrid 包含所需输出的 dimensions 和以所请求的坐标系单位表示的 AffineTransform。在此示例中,坐标系为地理坐标系,因此转换是通过以下方式指定的:以度为单位的缩放比例和所请求的图片块左上角的地理坐标。

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

如果您在笔记本中运行此代码,可以使用 IPython 图片显示 widget 显示结果。

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