Google地球引擎如何返回每次迭代的图像

时间:2018-03-17 20:57:42

标签: javascript iteration google-earth-engine

我正在尝试使用Google地球引擎中的TRMM数据集映射无雨天的最大天数。我通过迭代集合来做这件事,如果没有下雨,就会有人加入到单元格中(下面的代码)。当下雨时,该值乘以0,以便重置“计数器”。然后我想将每次迭代的每个结果存储在一个Image集合中,然后选择最大值以获得最长的连续干燥期。

但这就是理论。当我把它放在脚本中时,我将一次迭代的图像添加到列表时出错。有谁知道这是为什么以及如何解决这个问题?

代码:

var list = [];
function drylength(current, previous){
  var mask = current.remap([0], [1], 0,"precipitation").rename('precipitation');
  var sum = mask.add(previous).multiply(mask);

  list.push(sum);
  return sum;
}

var dataset = TRMM
.filterDate("2015-01-01","2015-02-01")
.sort('system:time_start:');

var totalPrecipitation = dataset.iterate(drylength, dataset.max()
.remap([0], [0], 0, "precipitation")
.rename('precipitation'));

print(list);
print(totalPrecipitation);
Map.addLayer(ee.Image(totalPrecipitation), imageVisParam);

此外,似乎只有3个项目存储在列表中,这使我假设迭代比文字迭代更复杂,其中所有图像都是逐个计算的?这是错误的图像:

Google Earth Engine errors

如果图片不可见或搜索引擎写入错误:

Failed to decode JSON.
Error: Field 'value' of object '{"type":"ArgumentRef","value":null}' is missing or null.
Object: {"type":"ArgumentRef","value":null}.

Unknown variable references: [_MAPPING_VAR_0_0, _MAPPING_VAR_0_1].

2 个答案:

答案 0 :(得分:1)

iterate()函数在服务器上运行,但您尝试推送的列表是客户端列表;那是行不通的。如果你把它作为ee.List,你可能能够使它工作,但是你必须把它放到前面的结果中(使用previous作为字典来保存它们)。

答案 1 :(得分:1)

使用多值结果这样的事情:

function drylength(current, previous) {
  previous = ee.Dictionary(previous)
  var mask = current.remap([0], [1], 0,"precipitation").rename('precipitation');
  var sum = mask.add(previous.get('sum')).multiply(mask);

  var list = previous.get('list')
  list = list.push(sum);
  return ee.Dictionary({sum: sum, list: list})
}
...
var totalPrecipitation = dataset.iterate(drylength, {sum: max, list: ee.List([])})