Найдите дату, ближайшую к дате в списке, которая представляет интерес, с помощью Google Earth Engine

Я создал список изображений Sentinel 2. Я также извлек значение даты из поля DATATAKE_IDENTIFIER и вставил его обратно как свойство с именем «DATE» типа ee.Date для каждого изображения в моем списке. Теперь я пытаюсь получить изображение, которое хронологически ближе всего к интересующей дате, указанной пользователем. Например, если у меня есть даты: 5 мая, 10 мая, 15 мая, 20 мая, и пользователь выбирает 14-е число. -Можно вернуться 15-мая. Может кто-нибудь помочь? Вот мой код:

var startDate = ee.Date('2017-07-01');
var finishDate = ee.Date('2017-07-31');

//Create imageCollection with the sentinel2 data and the date filters
var interestImageCollection = ee.ImageCollection(sentinel2_1C_ImageCollection)
.filterBounds(interestRectangle) //changed here your geometrical shape
.filterDate(startDate, finishDate)
.sort('CLOUDY_PIXEL_PERCENTAGE', false);



  //function which will extract the date from the 'DATATAKE_IDENTIFIER' field and add it as a new one to every image
var add_date = function(interestImageCollection){

  //iterate over the image Collection
  //.map must always return something
  return interestImageCollection.map(function(image){
    //take the image property containing the date
    var identifier = ee.String(image.get('DATATAKE_IDENTIFIER'));
    //regex
    var splitOn = "_|T";
    //split
    var splitted = identifier.split(splitOn,"");
    var date = ee.String(splitted.get(1));

    //DATE OPTION
    var year = ee.Number.parse(date.slice(0,4));   
    var month = ee.Number.parse(date.slice(4,6));
    var day = ee.Number.parse(date.slice(6,8));

    var dateTaken = ee.Date.fromYMD(year, month, day);

   return image.set('DATE',dateTaken);
  });
};

//list conversion
var subList = interestImageCollection.toList(interestImageCollection.size());

//get the image with the chronologically closest date to my date of interest
var dateOfInterest = ee.Date('2017-07-10');

//failed attempt to use sort for difference in dates calculation and get the closest date
    var c = subList.sort(function(a, b){
          var distancea = dateOfInterest.difference(a.get['DATE'],'day').round().abs();
          var distanceb = dateOfInterest.difference(b.get['DATE'],'day').round().abs();
          return distancea - distanceb; // sort a before b when the distance is smaller
        }).first();

Для языков программирования я бы использовал цикл, который на каждой итерации проверял бы, меньше ли разница между моей желаемой датой и полученной датой, чем любое предыдущее значение, и обновлял бы некоторые временные переменные. Но я думаю, что у земного двигателя есть более автоматизированный способ сделать это.

Я также пытался использовать функцию сортировки с настраиваемым компаратором, но это тоже не сработало.

Также некоторые обычные функции javascript (например, closestTo), похоже, не работают в Earth Engine.


person Lazaros Stam    schedule 24.07.2019    source источник
comment
Вероятно, дубликат Сравните две даты с помощью JavaScript. Если вам нужна помощь с нерабочим кодом, вы должны опубликовать код.   -  person RobG    schedule 25.07.2019


Ответы (1)


Я думаю, что есть более короткое и простое решение. Каждое изображение должно иметь свойство с именем system: time_start, которое мы можем использовать в своих интересах. Так как мы знаем нашу дату, мы можем добавить новое свойство к нашим изображениям, которые обозначают расстояние до нашей требуемой даты в миллисекундах, поскольку мы можем просто рассматривать ее как числовую операцию, которая учитывает все соображения дня и месяца, которые приходят с форматом YMD.

ic = ic.map(function(image){
  return image.set(
    'dateDist',
    ee.Number(image.get('system:time_start')).subtract(dateOfInterest.millis()).abs()
  );
});

Это новое поле dateDist теперь можно использовать для сортировки коллекции изображений.

ic = ic.sort('dateDist');

По умолчанию сортировка выполняется по возрастанию, так что это должно быть хорошо. И вы можете получить наиболее близкую сцену, сделав первое изображение. Одна вещь, которую следует учитывать, заключается в том, что если ваш прямоугольник ROI охватывает достаточно площади для просмотра нескольких строк / путей, тогда может быть несколько сцен с ближайшими датами. В таком случае было бы неплохо проверить, сколько сцен попадает в один диапазон дат.

person Nishanta Khanal    schedule 25.07.2019