首页 > 解决方案 > 在谷歌地球引擎的 imageCollection 中对 2 个连续图像应用函数

问题描述

该函数.map将一个函数应用于 ImageCollection 中的每个单独的图像。该函数将函数.iterate应用于一个图像,并将计算的输出应用于 ImageCollection 上的先前图像。第一个每次只适用于一个图像,第二个意味着修改每个图像并将其用于下一个图像的任何计算。

我需要一个类似 的函数.iterate,但不修改先例图像。我只需要做: image (time -1) / image (time 0)。我找不到办法做到这一点,

感谢您的帮助

我努力了,

var first = ee.List([
  ee.Image(1).set('system:time_start', time0).select([0], ['pc1'])
]);

var changeDET = function(image, list) {
  var previous = ee.Image(ee.List(list).get(-1));
  var change = previous.divide(image.select('pc1'))
    .set('system:time_start', image.get('system:time_start'));

  return ee.List(list).add(change);
};

var cumulative = ee.ImageCollection(ee.List(imageCollection.iterate(changeDET, first)))
  .sort('system:time_start', false)

标签: google-earth-engine

解决方案


您可以做的是将您的 imageCollection 转换为一个ee.List对象,然后使用索引变量映射该列表以访问前一个图像。示例代码如下:

var length = yourImageCollection.size();
var list = yourImageCollection.toList(length);

var calculated_list = list.map(function(img) {
    var index = list.indexOf(img)
    img = ee.Image(img);
    var previousIndex = ee.Algorithms.If(index.eq(0), index, index.subtract(1));
    var previousImage = ee.Image(list.get(previousIndex)):
    var change = ee.Image(previousImage.divide(img)
                                       .copyProperties(img, ["system:time_start"]));
    return change;
})

我不确定你想对第一张图片做什么,所以当map函数到达第一张图片时,previousIndex将等于index. 换句话说,第一个图像将被自己分割(因为它之前没有图像)。

希望这可以帮助。


推荐阅读