применить функцию к 2 последовательным изображениям в коллекции изображений в движке Google планета Земля

#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, я подумал об этом решении, но я буду фильтровать также по интересующим изображениям, поскольку они имеют общую дату.