调试指南
Earth Engine 不同于用于地理空间数据分析的传统图像处理、GIS 或其他桌面软件。您在 Earth Engine 中创建的算法在 Google 云中运行,分布在多台计算机上。调试可能具有挑战性,因为错误可能发生在客户端 JavaScript 代码或编码指令的服务器端执行中,并且是由扩展问题以及语法或逻辑错误引起的。除非您要求,否则无法检查在云中某处运行的程序部分。本文档介绍了调试策略、工具和解决方案,以帮助您解决常见错误和调试 Earth Engine 脚本。
官方给出的指南链接:
语法错误
客户端 JavaScript 中的语法错误通常由代码编辑器捕获,它会通过×编辑器面板左侧的警告您它们的存在。 将光标悬停在上将提供有关错误来源的线索。例如,图 1 说明了当列表编码不正确时会发生什么。具体来说,如果没有右括号 ( ]
),则列表未正确指定,代码编辑器将这个问题解释为Expected ']' to match '[' from line 1 and saw ';'.
客户端错误
尽管 JavaScript 语法正确,但可能存在与脚本的一致性或逻辑相关的错误。以下示例演示了使用不存在的变量和方法所导致的错误:
错误— 此代码不起作用!
// 加载Sentinel-2影像.
var image = ee.Image('USGS/SRTMGL1_003');
// Error: "bandNames" 这里之前并没有设置波段名称这个变量所以错误
var display = image.visualize({bands: bandNames, min: 0, max: 9000});
// Error: image.selfAnalyze不是一个函数所以不可以直接使用
var silly = image.selfAnalyze();
第一个错误通知您bandNames
变量未在引用它的范围内定义。作为解决方案,设置变量或为参数提供列表bands
参数。第二个错误演示了selfAnalyze()
调用不存在的函数时会发生什么。由于这不是图像上的真正方法,也就是说这个不是可以直接用在image上的函数,因此错误告诉您它不是函数。在这两种情况下,错误都是对问题的描述。
" ...is not a function
" 错误可能是因为 Earth Engine 不知道变量的类型。此问题的常见表现是:
- 对返回的对象执行某些操作
first()
(集合中元素的类型未知)。 - 对返回的对象执行某些操作
get()
(存储在属性中的元素类型未知)。 - 当参数的类型未知时对函数参数(在函数中)做一些事情。
以前者为例:
错误— 此代码不起作用!
var collection = ee.ImageCollection('MODIS/051/MOD44B');
// Error: collection.first(...).date is not a function
var date = collection.first().date();
在所有情况下的解决方案是使用已知类型的构造函数来强制转换未知类型的对象。继续前面的示例,解决方案是强制转换为 ee.Image
:
解决方案——使用括号或者添加影像ee.image,这样才能获取!
var date = ee.Image(collection.first()).date();
避免混合客户端和服务器功能
下面的例子不太明显:
错误——这段代码没有做你想要的
// 不要混淆 EE objects and JavaScript objects:
var image = ee.Image('USGS/SRTMGL1_003');
var nonsense = image + 2;
//你可以打印但这不是你想要的结果
print(nonsense);
// Error: g.eeObject.name 这不是一个正确的变量,所以无法加载地图
Map.addLayer(nonsense);
假设此代码的作者打算添加2
到图像中的每个像素,这不是正确的方法。具体来说,这段代码错误地将服务器端对象 ( image
) 与客户端 JavaScript 运算符 ( +
)混合在一起。结果可能令人惊讶。在第一种情况下, nonsense
JavaScript 将+
通过将image
和转换2
为字符串,然后连接它们来执行请求的操作 ( ) 。结果字符串是意外的。在第二种情况下,添加nonsense
到地图,g.eeObject.name is not a function
显示神秘错误,因为被添加到地图的对象, nonsense
, 是一个字符串,而不是一个 EE 对象。为避免可能出现意外结果和信息不足的错误,请勿将服务器对象和函数与 JavaScript 对象、原语或函数混合使用。解决方案是这个例子是使用服务器功能:
解决方案——使用服务器功能!
Map.addLayer(image.add(2));
浏览器锁
啊,啪!如果您遇到导致 Chrome 浏览器锁定的错误,您可能会看到如图 所示的窗口。
发生这种情况时,通常是因为 JavaScript 在客户端中运行时间过长,或等待 Earth Engine 的某些内容。此错误的两个常见来源是 for 循环和/或getInfo()
在您的代码中,最坏的情况是 getInfo()
在 for 循环内。For 循环会导致浏览器锁定,因为代码在您的机器上运行。另一方面,getInfo()
从地球引擎同步请求计算结果,阻塞直到收到结果。如果计算需要很长时间,阻塞可能会导致您的浏览器锁定。避免 for 循环和getInfo()