在 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
。换句话说,第一张图片会被自己分割(因为之前没有图片)。
希望对您有所帮助。
函数 .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
。换句话说,第一张图片会被自己分割(因为之前没有图片)。
希望对您有所帮助。