Earth Engine 对象

现在,您已经熟悉了 JavaScript,接下来请学习如何将 JavaScript 对象和基元放入 Earth Engine 容器中,以便发送到服务器并在 Google 进行处理。

字符串

例如,定义一个字符串,然后将其放入 ee.String() 容器中,以便发送到 Earth Engine:

代码编辑器 (JavaScript)

// Define a string, then put it into an EE container.
var aString = 'To the cloud!';
var eeString = ee.String(aString);
print('Where to?', eeString);

可以将 ee.Thing 视为服务器上存在的对象的容器。在此示例中,系统会先定义字符串,然后将其放入容器中。您还可以一次性定义容器及其内容。例如:

代码编辑器 (JavaScript)

// Define a string that exists on the server.
var serverString = ee.String('This is on the server.');
print('String on the server:', serverString);

虽然 print() 的第一个参数只是客户端上的一个字符串,但第二个参数实际上会发送到服务器进行评估,然后再发送回来。

Numbers

使用 ee.Number() 在服务器上创建数字对象。例如,使用 Math.E JavaScript 方法在服务器上创建常量值:

代码编辑器 (JavaScript)

// Define a number that exists on the server.
var serverNumber = ee.Number(Math.E);
print('e=', serverNumber);

ee.String() 和 ee.Number() 方法是构造函数。构造函数接受其参数(可能还有其他参数),将其放入容器中,然后将容器及其内容作为 Earth Engine 对象返回,您可以在代码中对其进行操作。任何以 ee 开头的构造函数都会返回 Earth Engine 对象。

Earth Engine 对象的方法

请注意,创建 Earth Engine 对象后,您必须使用 Earth Engine 方法对其进行处理。在此示例中,您无法使用 JavaScript 的 Math.log() 处理该 Earth Engine 对象。您必须使用为 ee.Number 定义的等效方法:

代码编辑器 (JavaScript)

// Use a built-in function to perform an operation on the number.
var logE = serverNumber.log();
print('log(e)=', logE);

在此示例中,log() 是 ee.Number 对象的方法。(使用代码编辑器左侧的文档标签页,查看每种 Earth Engine 对象类型的所有方法列表,例如 ee.Number > log())。请注意,Earth Engine 对象的方法会返回其他 Earth Engine 对象。

列表

如需在服务器上将 JavaScript 列表转换为 ee.List 对象,您可以将 JavaScript 字面量放入容器中,就像处理数字和字符串一样。Earth Engine 还提供了用于生成数字序列的服务器端便捷方法。例如:

代码编辑器 (JavaScript)

// Make a sequence the hard way.
var eeList = ee.List([1, 2, 3, 4, 5]);
// Make a sequence the easy way!
var sequence = ee.List.sequence(1, 5);
print('Sequence:', sequence);

由于 ee.List 对象仅存在于服务器上,因此请使用 Earth Engine 提供的函数与其进行交互。例如,如需从列表中获取内容,请使用 ee.List 对象的 get() 方法:

代码编辑器 (JavaScript)

// Use a method on an ee.List to extract a value.
var value = sequence.get(2);
print('Value at index 2:', value);

投屏

有时,Earth Engine 不知道方法返回的对象的类型。作为程序员,您知道上一个示例中的 value 变量是一个数字对象。但如果您尝试使用 ee.Number 的 add() 方法,则会收到如下错误:

这在 get() 函数中很常见,该函数可能会返回各种 Earth Engine 对象。如需更正此问题,请使用 ee.Number 构造函数转换结果:

代码编辑器 (JavaScript)

// Cast the return value of get() to a number.
print('No error:', ee.Number(value).add(3));

字典

您可以从 JavaScript 对象构建 Earth Engine Dictionary,就像处理字符串、数字和列表一样。在构建时,您可以使用 JavaScript 功能初始化 Earth Engine 对象。在这种情况下,ee.Dictionary 直接通过 JavaScript 字面量对象构造:

代码编辑器 (JavaScript)

// Make a Dictionary on the server.
var dictionary = ee.Dictionary({
  e: Math.E,
  pi: Math.PI,
  phi: (1 + Math.sqrt(5)) / 2
});

// Get some values from the dictionary.
print('Euler:', dictionary.get('e'));
print('Pi:', dictionary.get('pi'));
print('Golden ratio:', dictionary.get('phi'));

// Get all the keys:
print('Keys: ', dictionary.keys());

在此示例中,请注意,获得 ee.Dictionary 后,您必须使用 ee.Dictionary 上的方法来获取值(这与上一课中的 JavaScript 字典不同)。具体而言,get(key) 会返回与 key 关联的值。由于 get() 返回的对象类型可以是任何类型,因此,如果您要对该对象执行除打印之外的任何操作,则需要将其转换为正确的类型。另请注意,keys() 方法会返回 ee.List。

日期

Date 对象是 Earth Engine 表示时间的方式。如前面的示例所示,请务必区分 JavaScript Date 对象和 Earth Engine ee.Date 对象。通过字符串、JavaScript Date 或使用 ee.Date 类提供的静态方法构造 ee.Date。(如需了解详情,请参阅文档标签页中的“日期”部分)。以下示例说明了如何通过字符串或 JavaScript 日期(表示自 1970 年 1 月 1 日午夜以来的毫秒数)来构造日期:

代码编辑器 (JavaScript)

// Define a date in Earth Engine.
var date = ee.Date('2015-12-31');
print('Date:', date);

// Get the current time using the JavaScript Date.now() method.
var now = Date.now();
print('Milliseconds since January 1, 1970', now);

// Initialize an ee.Date object.
var eeNow = ee.Date(now);
print('Now:', eeNow);

日期可用于过滤集合,特别是作为 filterDate() 方法的参数。如需详细了解如何对集合进行排序,请参阅“使用入门”页面的此部分。

题外话:按名称传递参数

Earth Engine 方法的参数可以按顺序传递,例如,要根据年、月和日创建 ee.Date,您可以按年、月、日的顺序传递 fromYMD() 静态方法的参数:

代码编辑器 (JavaScript)

var aDate = ee.Date.fromYMD(2017, 1, 13);
print('aDate:', aDate);

或者,您也可以按名称以任意顺序传递参数。虽然这可能会增加代码量,但可以提高可读性和可重用性。如需按名称传递参数,请传入一个 JavaScript 对象,其中对象的键是方法参数的名称,值是方法的实参。例如:

代码编辑器 (JavaScript)

var theDate = ee.Date.fromYMD({
  day: 13,
  month: 1,
  year: 2017
});
print('theDate:', theDate);

请注意,对象属性(键)的名称与 ee.Date.fromYMD() 文档中指定的名称一致。另请注意,作为参数传递的对象可以保存在变量中以供重复使用,如 JavaScript 对象示例所示。

现在,您已经对 JavaScript 有了足够的了解,可以开始使用 Earth Engine 了! 如需详细了解 JavaScript 对象与 Earth Engine 对象,请参阅客户端与服务器页面。

在下一部分中,您将详细了解函数式编程概念,以便在 Earth Engine 中有效使用 for 循环、if/else 条件和迭代。