Я создал список изображений 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.