注意: REST API 包含新的高级功能,可能不适合所有用户。如果您是 Earth Engine 新手,请先参阅 JavaScript 指南。
Earth Engine REST API 快速入门介绍了如何从 Earth Engine 资源访问像素块。假设您想在获得结果之前对像素应用计算。本指南介绍了如何使用某个客户端库对计算进行原型设计、序列化计算图,以及使用 REST API 获取计算结果。通过 REST API 发出计算请求相当于向某个计算端点(例如 computePixels
、computeFeatures
或通用端点 value.compute
)发出 POST
请求。具体而言,此示例演示了如何获取小区域内 Sentinel-2 影像的中值合成。
准备工作
按照这些说明执行以下操作:
- 申请使用 Earth Engine
- 创建 Google Cloud 项目
- 在项目中启用 Earth Engine API
- 创建服务账号
- 授予服务账号项目级权限以执行 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
,即序列化计算。它还包含一个 PixelGrid
。PixelGrid
包含所需输出的 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)