在 google earth engine 的 imageCollection 中对 2 个连续图像应用函数

apply a function over 2 consecutive images in an imageCollection in google earth engine

函数 .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)

您可以做的是将 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。换句话说,第一张图片会被自己分割(因为之前没有图片)。

希望对您有所帮助。