延迟执行

客户端与服务器文档介绍了脚本中引用的对象可以是客户端对象,也可以是服务器端对象。完整脚本不仅包含您要使用的对象,还包含一组指令,用于告知 Earth Engine 如何处理这些对象。本文档介绍了如何将这些指令发送给 Google 进行处理,以及如何将结果发送回客户端进行显示。

在 Earth Engine 中编写脚本(JavaScript 或 Python)时,该代码不会直接在 Google 的 Earth Engine 服务器上运行。而是由客户端库将脚本编码为一系列 JSON 对象,将这些对象发送给 Google,然后等待响应。每个对象都代表获取特定输出(例如要在客户端中显示的图片)所需的一组操作。 请参考以下代码:

var image = ee.Image('CGIAR/SRTM90_V4');
var operation = image.add(10);
print(operation.toString());
print(operation);

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

import ee
import geemap.core as geemap
image = ee.Image('CGIAR/SRTM90_V4')
operation = image.add(10)
print(operation)
print(operation.getInfo())

第一个 print 语句将输出客户端库用于向 Google 服务器描述该图片的 JSON 结构:

ee.Image({
  "type": "Invocation",
  "arguments": {
    "image1": {
      "type": "Invocation",
      "arguments": {
        "id": "CGIAR/SRTM90_V4"
      },
      "functionName": "Image.load"
    },
    "image2": {
      "type": "Invocation",
      "arguments": {
        "value": 10
      },
      "functionName": "Image.constant"
    }
  },
  "functionName": "Image.add"
})
    

第二个 print 语句会将请求发送到 Google,并输出 Google 服务器的 POST 响应。如需以 JSON 格式查看完整响应,请点击控制台右侧打印对象旁边的 JSON 链接:

{
  "type": "Image",
  "bands": [
    {
      "id": "elevation",
      "data_type": {
        "type": "PixelType",
        "precision": "int",
        "min": -32758,
        "max": 32777
      },
      "crs": "EPSG:4326",
      "crs_transform": [
        0.0008333333535119891,
        0,
        -180,
        0,
        -0.0008333333535119891,
        60
      ]
    }
  ]
}
    

除非您提出请求,否则系统不会将任何内容发送给 Google 进行处理。在此示例中,对服务器对象调用 getInfo() 的结果会触发请求。在明确请求该结果之前,服务器不会执行任何处理。请注意,JavaScript 代码编辑器中的 print() 是一个特殊的客户端函数,用于封装异步 getInfo() 调用;对于 Python,我们会直接调用它。

请求内容的另一个示例是在 Code Editor 或 geemap 地图元素上显示内容。将此请求发送到 Google 后,系统只会返回在 Code Editor 或 geemap 地图元素中显示结果所需的图块。 具体而言,地图的位置和缩放级别决定了哪些数据会被处理并转换为可在地图上显示的图片。请注意,如果您平移或缩放,系统会延迟计算其他功能块。这种按需系统支持并行处理和高效处理,但也意味着,地图上显示的图片是根据地图边界的缩放级别和位置,从不同的输入生成的。如需详细了解如何根据请求确定计算的输入,请参阅扩缩文档。