Вы можете использовать алгоритм ImageCollection.reduceColumns
для получения медианного значения свойства коллекции. Затем вы можете использовать фильтр, чтобы выбрать элемент с этим значением.
Я подготовил пример в JavaScript, но, поскольку это полностью операции на стороне сервера, его не должно быть слишком сложно перевести:
var landsat = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA");
var pointOfInterest = ee.Geometry.Point([-115.10699177547879, 40.56521148064664]);
var images = landsat
.filterDate('2017-05-01', '2017-09-01')
.filterBounds(pointOfInterest)
.map(function(img) {
// Add a numeric property for the example: the value of B2 at a point.
return img.setMulti(img.select(['B2'], ['B2_at_point']).reduceRegion({
reducer: ee.Reducer.mean(),
geometry: pointOfInterest,
}));
});
// Display the list of values, just for the example (this is not used further).
print(images.reduceColumns(ee.Reducer.toList(), ['B2_at_point']).get('list'));
// Compute the median.
var median = ee.Number(
images.reduceColumns(ee.Reducer.median(), ['B2_at_point'])
.get('median'));
print(median);
// Find the image or images that had the median.
var exactlyEqualsMedian = images.filter(ee.Filter.equals('B2_at_point', median));
var equalsOrNextToMedian = ee.ImageCollection(ee.Algorithms.If(
exactlyEqualsMedian.first(), // Is exactlyEqualsMedian nonempty?
exactlyEqualsMedian, // Then return it.
images // Otherwise find the nearest 2 images.
.map(function (i) {
return i.set('median_distance', median.subtract(i.get('B2_at_point')).abs());
})
.limit(2, 'median_distance')));
print(equalsOrNextToMedian);
Map.setCenter(-115.08, 40.56, 9);
Map.addLayer(equalsOrNextToMedian, {bands: ['B4', 'B3', 'B2'], max: 0.4, gamma: 1.6});
https://code.earthengine.google.com/4e0d3d59535722f55425618e7defefff
(Пожалуйста, обратите внимание, что нет научного c достоинства для вычислений, сделанных здесь; это всего лишь пример поиска медианы в коллекции изображений.)
Обратите внимание, что я не воспользовался подходом заполнения ввода для медианы (). Скорее, я фильтрую потом, чтобы выбрать либо изображение точного совпадения, либо два ближайших совпадения. Это потому, что я ожидаю, что это будет более эффективно, чем пытаться настроить заполнение заранее (потому что это требует дополнительных запросов к коллекции, чтобы выяснить, насколько она велика). Вы, конечно, можете выбрать любое изображение в полученной коллекции из 2 изображений, которое соответствует вашим потребностям - если вам все равно, просто возьмите equalsOrNextToMedian.first()
.