服务器端错误
尽管客户端 JavaScript 具有逻辑一致性,但可能存在仅在服务器上运行时才会显现的错误。以下示例演示了尝试获取不存在的乐队时会发生什么:
错误— 此代码不起作用!
代码语言:javascript复制// Load a Sentinel-2 image.
var s2image = ee.Image('COPERNICUS/S2/20160625T100617_20160625T170310_T33UVR');
// Error: Image.select: Pattern 'nonBand' did not match any bands.
print(s2image.select(['nonBand']));
在此示例中,错误通知您没有名为 nonBand
。可能显而易见的解决方案是指定一个确实存在的波段名称 。您可以通过打印图像并在控制台中检查它来发现波段名称,或者通过打印由 返回的波段名称列表 image.bandNames()
。这里你可以去看一些这幅影像当中的波段到底是有哪些,然后再去进行选择打印输出。
不变性
您在 Earth Engine 中创建的服务器端对象是 不可变的。(任何 ee.Object
是服务器端Object
)。这意味着如果要对对象进行更改,则必须将更改后的状态保存到新变量中。例如,这不适用于在 Sentinel-2 图像上设置属性:
错误— 此代码不符合您的要求!
代码语言:javascript复制var s2image = ee.Image('COPERNICUS/S2/20160625T100617_20160625T170310_T33UVR');
s2image.set('myProperty', 'This image is not assigned to a variable');
// 这不会导致结果的错误,但是无法找到 'myProperty'.
print(s2image.get('myProperty')); // null
在此示例中,s2image.set()
返回具有新属性的图像副本,但存储在s2image
变量中的图像未更改。您需要将返回的图像保存s2image.set()
在新变量中。例如:
解决方案——在变量中捕获结果!
代码语言:javascript复制//这里的意思就是要将返回值再重新返回给你定义的影像,这样才能添加上这个属性,然后再通过get进行获取
s2image = s2image.set('myProperty', 'OK');
print(s2image.get('myProperty')); // OK
映射函数
客户端和服务器功能不混合的另一个上下文是映射函数。具体来说,映射函数指定的操作在云中运行,因此客户端函数,例如print()
,getInfo()
或 上的任何方法Map
,Chart
或Export
将无法在映射函数中工作。例如:
错误— 此代码不起作用!
代码语言:javascript复制var collection = ee.ImageCollection('MODIS/051/MOD44B');
// Error: 映射函数的参数不能用于客户端操作
var badMap3 = collection.map(function(image) {
print(image);
return image;
});
这个有点神秘的错误是地球引擎用来将此代码转换为一组可以在谷歌服务器上运行的指令的过程的结果。具体来说,这意味着 Earth Engine 找不到名为 的服务器端函数print()
,因为根本没有。更一般地,客户端函数和控制结构不能用于对传递给映射函数的参数图像进行操作。为避免此错误,请避免在映射函数中使用客户端函数。一般建议在进行print时候建议放在外面,而且这个遍历函数无法执行的主要是print打印之后的信息并没有可以直接进行返回信号。
映射函数有额外的要求,必须满足所有这些要求才能避免错误。例如,映射函数必须返回一些东西。尽管代码编辑器检测到此问题并发出错误,但它特定于在服务器上运行的映射函数:
错误— 此代码不起作用!
代码语言:javascript复制var collection = ee.ImageCollection('MODIS/051/MOD44B');
// Error: 必须建立一个返回值在进行遍历和函数操作的时候,否则就会报错
var badMap1 = collection.map(function(image) {
// Do nothing.
});
可能显而易见的解决方案是返回一些东西。但它不能只返回任何类型的东西。具体来说,映射到ImageCollection
上的 函数FeatureCollection
必须返回一个Image
或者 Feature
。例如,您不能从映射到 的函数返回日期ImageCollection
:
错误— 此代码不起作用!
代码语言:javascript复制var collection = ee.ImageCollection('MODIS/051/MOD44B');
var badMap2 = collection.map(function(image) {
return image.date();//返回一个时间是不允许的,因为影像和矢量集合里面包含的仅仅是矢量或者栅格影像所以只能按照这些进行计算。
});
// Error: Collection.map: 映射算法必须返回矢量特征或图像。
print(badMap2);
为避免这种情况,请返回具有新属性集的输入图像。然后,如果您需要集合中图像的日期列表,您可以使用aggregate_array()
:
解决方案——设置一个属性!
代码语言:javascript复制var collection = ee.ImageCollection('MODIS/051/MOD44B');
var okMap2 = collection.map(function(image) {
return image.set('date', image.date());
});
print(okMap2);
// 获取时间的列表
var datesList = okMap2.aggregate_array('date');
print(datesList);