#google-earth-engine
#google-earth-engine
Вопрос:
функция .map
применяет функцию к каждому отдельному изображению в коллекции изображений. И функция .iterate
применяет функцию к одному изображению, а результаты вычислений, выполненных к предыдущему изображению в коллекции изображений. Первый работает только с одним изображением каждый раз, а второй подразумевает изменение каждого изображения и использование его для любых вычислений со следующим.
Мне нужна функция, которая работает как .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)
Ответ №1:
Что вы можете сделать, так это преобразовать вашу коллекцию изображений в 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
. Другими словами, первое изображение будет разделено само по себе (поскольку перед ним нет изображения).
Надеюсь, это поможет.
Комментарии:
1. спасибо, @Kevin. Прежде чем я попробую это, на самом деле проблема, о которой вы упомянули, была следующей. Я всегда получаю ImageCollection с первым (или, возможно, последним, если отсортировать в обратном направлении) изображением, которое мне не нужно. Как я могу отфильтровать коллекцию без этого изображения?
ee.Filter.first
функции не существует. Спасибо2. @javier, если изображение, которое вы хотите отфильтровать, не имеет общей даты с другими изображениями, вы можете отфильтровать его с помощью
filterDate
метода ImageCollection. Обратите внимание, что это можно сделать, только если это изображение является первым или последним изображением по дате.3. спасибо @Kevin, я подумал об этом решении, но я буду фильтровать также по интересующим изображениям, поскольку они имеют общую дату.