我正在 Google Earth Engine (GEE) 中编写代码,从 NASA/GPM_L3/IMERG_MONTHLY_V06 获取 2000 年至 2021 年间的每月降水量。然后,我构建一个由 12 张图像组成的图像集合,其中包含每个月的最高观测值对于每个像素。
我想做的是创建一个新的图像集合,其中包含每个图像的值与其他图像的值相比的排名索引。
例如,如果图像集合给出以下结果: 一月:0.25, 二月:0.23 三月:0.45, ... 十二月:0.1
获取包含值的新图像集合: 一月:2, 二月:3, 三月: 1, ... 12 月:12 日
到目前为止我所做的是这个,但我的排名是堆叠的:
var startDate = '2000-06-01';
var endDate = '2021-09-01';
var im_col = 'NASA/GPM_L3/IMERG_MONTHLY_V06';
var band = 'precipitation';
var dataset = ee.ImageCollection(im_col)
.filterDate(startDate, endDate)
.select(band)
.map(function(image) {
return image.set('system:time_start', image.get('system:time_start'));
});
var startYear = ee.Date(startDate).get('year');
var endYear = ee.Date(endDate).get('year');
var totalYears = endYear.subtract(startYear);
var addAttributes = function(image) {
var year = ee.Date(image.get('system:time_start')).get('year');
return image.set({
'year': year,
'n': totalYears
});
};
var datasetWithAttributes = dataset.map(addAttributes);
var yearRange = ee.List.sequence(startYear, endYear);
var monthlyMaxCollection = ee.Dictionary({});
for (var month = 1; month <= 12; month++) {
var maxImage = dataset
.filter(ee.Filter.calendarRange(month, month, 'month'))
.max();
monthlyMaxCollection = monthlyMaxCollection.set(ee.Number(month).format(), maxImage);
}
var monthlyMaxList = monthlyMaxCollection.values();
var monthlyMaxListCol = ee.ImageCollection.fromImages(monthlyMaxList);
print(monthlyMaxListCol);
有人知道吗?
这有效:
var arrayImage = monthlyMaxListCol.toArray();
var sortedArray = arrayImage.arraySort();
var numImages = monthlyMaxListCol.size();
var nthLowestCollection = ee.ImageCollection(ee.List.sequence(0, numImages.subtract(1)).map(function(n) {
var intN = ee.Number(n).toInt();
var nthLowest = sortedArray.arraySlice(0, intN, intN.add(1)).arrayProject([0]).arrayFlatten([['prec']]);
return nthLowest;
}));