Google Earth Engine(GEE)——调试(语法和客户端)错误指南!

举报
此星光明 发表于 2022/04/16 02:08:52 2022/04/16
【摘要】 调试指南 Earth Engine 不同于用于地理空间数据分析的传统图像处理、GIS 或其他桌面软件。您在 Earth Engine 中创建的算法在 Google 云中运行,分布在多台计算机上。调试可能具有挑战性,因为错误可能发生在客户端 JavaScript 代码或编码指令的服务器端执行中,并且是由扩展问题以及语法或逻辑...

调试指南

Earth Engine 不同于用于地理空间数据分析的传统图像处理、GIS 或其他桌面软件。您在 Earth Engine 中创建的算法在 Google 云中运行,分布在多台计算机上。调试可能具有挑战性,因为错误可能发生在客户端 JavaScript 代码或编码指令的服务器端执行中,并且是由扩展问题以及语法或逻辑错误引起的。除非您要求,否则无法检查在云中某处运行的程序部分。本文档介绍了调试策略、工具和解决方案,以帮助您解决常见错误和调试 Earth Engine 脚本。

官方给出的指南链接:

https://youtu.be/_ihm85Fy8yM

语法错误

客户端 JavaScript 中的语法错误通常由代码编辑器捕获,它会通过×编辑器面板左侧的警告您它们的存在。 将光标悬停在上将提供有关错误来源的线索。例如,图 1 说明了当列表编码不正确时会发生什么。具体来说,如果没有右括号 ( ]),则列表未正确指定,代码编辑器将这个问题解释为Expected ']' to match '[' from line 1 and saw ';'.

客户端错误

尽管 JavaScript 语法正确,但可能存在与脚本的一致性或逻辑相关的错误。以下示例演示了使用不存在的变量和方法所导致的错误:

错误— 此代码不起作用!


  
  1. // 加载Sentinel-2影像.
  2. var image = ee.Image('USGS/SRTMGL1_003');
  3. // Error: "bandNames" 这里之前并没有设置波段名称这个变量所以错误
  4. var display = image.visualize({bands: bandNames, min: 0, max: 9000});
  5. // Error: image.selfAnalyze不是一个函数所以不可以直接使用
  6. var silly = image.selfAnalyze();

第一个错误通知您bandNames变量未在引用它的范围内定义。作为解决方案,设置变量或为参数提供列表bands参数。第二个错误演示了selfAnalyze()调用不存在的函数时会发生什么。由于这不是图像上的真正方法,也就是说这个不是可以直接用在image上的函数,因此错误告诉您它不是函数。在这两种情况下,错误都是对问题的描述。

...is not a function" 错误可能是因为 Earth Engine 不知道变量的类型。此问题的常见表现是:

  • 对返回的对象执行某些操作first()(集合中元素的类型未知)。
  • 对返回的对象执行某些操作get()(存储在属性中的元素类型未知)。
  • 当参数的类型未知时对函数参数(在函数中)做一些事情。

以前者为例:

错误— 此代码不起作用!


  
  1. var collection = ee.ImageCollection('MODIS/051/MOD44B');
  2. // Error: collection.first(...).date is not a function
  3. var date = collection.first().date();

在所有情况下的解决方案是使用已知类型的构造函数来强制转换未知类型的对象。继续前面的示例,解决方案是强制转换为 ee.Image

解决方案——使用括号或者添加影像ee.image,这样才能获取!

var date = ee.Image(collection.first()).date();
 

避免混合客户端和服务器功能

下面的例子不太明显:

错误——这段代码没有做你想要的


  
  1. // 不要混淆 EE objects and JavaScript objects:
  2. var image = ee.Image('USGS/SRTMGL1_003');
  3. var nonsense = image + 2;
  4. //你可以打印但这不是你想要的结果
  5. print(nonsense);
  6. // Error: g.eeObject.name 这不是一个正确的变量,所以无法加载地图
  7. Map.addLayer(nonsense);

假设此代码的作者打算添加2到图像中的每个像素,这不是正确的方法。具体来说,这段代码错误地将服务器端对象 ( image) 与客户端 JavaScript 运算符 ( +)混合在一起。结果可能令人惊讶。在第一种情况下, nonsenseJavaScript 将+通过将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()

文章来源: blog.csdn.net,作者:此星光明2021年博客之星云计算Top3,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_31988139/article/details/119856510

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。