Google Earth Engine(GEE)——服务器端错误(指南)!

服务器端错误

尽管客户端 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 图像上设置属性:

错误— 此代码不符合您的要求!

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()在新变量中。例如:

解决方案——在变量中捕获结果! 

//这里的意思就是要将返回值再重新返回给你定义的影像,这样才能添加上这个属性,然后再通过get进行获取
s2image = s2image.set('myProperty', 'OK');
print(s2image.get('myProperty')); // OK

映射函数

客户端和服务器功能不混合的另一个上下文是映射函数。具体来说,映射函数指定的操作在云中运行,因此客户端函数,例如print()getInfo()或 上的任何方法MapChartExport将无法在映射函数中工作。例如:

错误— 此代码不起作用!

var collection = ee.ImageCollection('MODIS/051/MOD44B');

// Error: 映射函数的参数不能用于客户端操作
var badMap3 = collection.map(function(image) {
  print(image);
  return image;
});

这个有点神秘的错误是地球引擎用来将此代码转换为一组可以在谷歌服务器上运行的指令的过程的结果。具体来说,这意味着 Earth Engine 找不到名为 的服务器端函数print(),因为根本没有。更一般地,客户端函数和控制结构不能用于对传递给映射函数的参数图像进行操作。为避免此错误,请避免在映射函数中使用客户端函数。一般建议在进行print时候建议放在外面,而且这个遍历函数无法执行的主要是print打印之后的信息并没有可以直接进行返回信号。

映射函数有额外的要求,必须满足所有这些要求才能避免错误。例如,映射函数必须返回一些东西。尽管代码编辑器检测到此问题并发出错误,但它特定于在服务器上运行的映射函数

错误— 此代码不起作用!

var collection = ee.ImageCollection('MODIS/051/MOD44B');

// Error: 必须建立一个返回值在进行遍历和函数操作的时候,否则就会报错
var badMap1 = collection.map(function(image) {
  // Do nothing.
});

可能显而易见的解决方案是返回一些东西。但它不能只返回任何类型的东西。具体来说,映射到ImageCollection上的 函数FeatureCollection必须返回一个Image或者 Feature。例如,您不能从映射到 的函数返回日期ImageCollection

错误— 此代码不起作用!

var collection = ee.ImageCollection('MODIS/051/MOD44B');

var badMap2 = collection.map(function(image) {
  return image.date();//返回一个时间是不允许的,因为影像和矢量集合里面包含的仅仅是矢量或者栅格影像所以只能按照这些进行计算。
});

// Error: Collection.map: 映射算法必须返回矢量特征或图像。
print(badMap2);

为避免这种情况,请返回具有新属性集的输入图像。然后,如果您需要集合中图像的日期列表,您可以使用aggregate_array()

解决方案——设置一个属性!

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此星光明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值