您可以使用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
(请注意,此处进行的计算没有科学价值;这只是在图像集中找到中值的一个示例。)
请注意,我没有采用将输入填充到中值()的方法。相反,我随后过滤以选择完全匹配的图像或两个最接近的匹配。这是因为我希望它比尝试预先设置填充更有效(因为它需要额外的时间查询集合以找出它有多大)。您当然可以在生成的 2 张图像集合中选择适合您需要的任何图像 - 如果您不在乎,请选择 equalsOrNextToMedian.first()。