如何在 Google-Earth-Engine 中没有 if 语句的参数检查期间抛出错误?

How to throw an error during a parameter check without if-statements in Google-Earth-Engine?

我正在开发 bfast monitor algorithm in Google Earth Engine. See the code of the original algorithm on Github 的新版本。 函数 bfastMonitor() 采用用户定义的参数,并在开始实际计算之前应用一些参数检查。当自定义参数设置与算法不兼容时,应该报错。

在检查参数时,有两种if语句:仅检查参数边界并在不兼容值时引发错误的语句,以及检查并重写参数内容并在不兼容时引发错误的语句值。为了本题的重点,我只考虑后一种。

显然,在传统的编码范例中,if 语句可用于执行此参数检查,但是,using if-statements goes against the client-server model of GEE

考虑period参数,它只能是2、4、6、8或10。这个参数代码在后面的代码中用于索引列表(Github上的第459行),其中 period4 表示列表应在位置 1 处建立索引,例如。

目前的实现看起来像这样,使用 if 语句:

period = period||10

if (period == 2) {
   period  = 0;
} else if (period  == 4){
   period  = 1;
}else if (period  == 6){
   period  = 2;
}else if (period  == 8){
   period  = 3;
}else if (period  == 10){
   period  = 4;
}else {
  alert("Error: for period parameter, we only have 2, 4, 6, 8,10. Choose one of these values");
}

后来,period参数使用了这样的形式(来自Github):

var exampleList = ee.List([0.001, 0.002, 0.003, 0.004, 0.005]);
var exampleValue = exampleList[period]; 

可以轻松重写代码以摆脱 if 语句,例如:

var period = ee.Number(6);
var periodDict = ee.Dictionary({
  '2':0,
  '4':1,
  '6':2,
  '8':3,
  '10':4,
});
var exampleList = ee.List([0.001, 0.002, 0.003, 0.004, 0.005]);
var exampleValue = exampleList.get(periodDict.get(period.format()));

但是当 period 的值超出范围时,我不知道如何保留抛出错误的机会。

如何在 Google Earth Engine 中检查函数的参数并抛出错误同时避免 if 语句?

使用 JavaScript if 语句 当它有效时 完全没有错。您链接的建议是关于使用 ee.Algorithms.If 不幸的是,这通常效率低下——这完全不相关。 JavaScript if 的常见问题是当您尝试在尚未计算的服务器端值 上使用它时 .

但在您的情况下,您似乎想要验证用户提供的参数。 if 是一个非常好的方法。

我会建议一项改进:不使用 alert("error message");,而是使用 throw new Error:

  throw new Error("For period parameter, we only have 2, 4, 6, 8,10. Choose one of these values");

这有两个好处:

  • 它不会弹出用户在解决问题之前必须与之交互的对话框,而只会在通常的位置(代码编辑器的控制台)显示一条错误消息。
  • 它将停止其余代码的执行,而 alert() 不会。