前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Google Earth Engine(GEE)——调试(语法和客户端)错误指南!

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

作者头像
此星光明
发布2024-02-02 08:20:43
2910
发布2024-02-02 08:20:43
举报

调试指南

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

官方给出的指南链接:

https://youtu.be/_ihm85Fy8yM

语法错误

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

客户端错误

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

错误— 此代码不起作用!

代码语言: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()(存储在属性中的元素类型未知)。
  • 当参数的类型未知时对函数参数(在函数中)做一些事情。

以前者为例:

错误— 此代码不起作用!

代码语言:javascript
复制
var collection = ee.ImageCollection('MODIS/051/MOD44B');

// Error: collection.first(...).date is not a function
var date = collection.first().date();

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

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

代码语言:javascript
复制
var date = ee.Image(collection.first()).date();
避免混合客户端和服务器功能

下面的例子不太明显:

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

代码语言:javascript
复制
// 不要混淆 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 运算符 ( +)混合在一起。结果可能令人惊讶。在第一种情况下, nonsenseJavaScript 将+通过将image和转换2为字符串,然后连接它们来执行请求的操作 ( ) 。结果字符串是意外的。在第二种情况下,添加nonsense到地图,g.eeObject.name is not a function显示神秘错误,因为被添加到地图的对象, nonsense, 是一个字符串,而不是一个 EE 对象。为避免可能出现意外结果和信息不足的错误,请勿将服务器对象和函数与 JavaScript 对象、原语或函数混合使用。解决方案是这个例子是使用服务器功能:

解决方案——使用服务器功能!

代码语言:javascript
复制
Map.addLayer(image.add(2));
浏览器锁

啊,啪!如果您遇到导致 Chrome 浏览器锁定的错误,您可能会看到如图 所示的窗口。

发生这种情况时,通常是因为 JavaScript 在客户端中运行时间过长,或等待 Earth Engine 的某些内容。此错误的两个常见来源是 for 循环和/或getInfo()在您的代码中,最坏的情况是 getInfo()在 for 循环内。For 循环会导致浏览器锁定,因为代码在您的机器上运行。另一方面,getInfo() 从地球引擎同步请求计算结果,阻塞直到收到结果。如果计算需要很长时间,阻塞可能会导致您的浏览器锁定。避免 for 循环和getInfo()

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 调试指南
    • 语法错误
      • 客户端错误
        • 避免混合客户端和服务器功能
        • 浏览器锁
    相关产品与服务
    云服务器
    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档