google-earth-engine - 在谷歌地球引擎的 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)
解决方案
您可以做的是将您的 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
. 换句话说,第一个图像将被自己分割(因为它之前没有图像)。
希望这可以帮助。
推荐阅读
- php - 如何在wordpress中使用功能/过滤器在站点徽标图像下方显示自定义文本
- javascript - 获取绝对定位的透明元素的真实背景颜色
- c++ - 为什么一个链表的结束节点从 NULL 变为另一个链表的下一个节点?
- css - Materialize:是否可以在特定文件中停用样式
- javascript - 为什么我有两个选择器?
- c - 如何获得命名匹配 XS?
- python - python pandas:使用 sort_values 和 drop_duplicates 复制行
- c++ - std::unordered_map<>::operator[] 及其返回类型引用
- android - 从 url 下载音频(文件)到 externalCache
- html - 另一个 CSS 背景图像没有显示,是我的代码错误吗?