上篇文章主要是根据年份对样本点区域的有效观测值进行统计。
这篇文章更加细化,通过将一年分为四个季节分别进行统计,并将所有样本点在单个季节的有效观测值进行排序,取中值作为该年该季节研究区范围的有效观测值数量。
var ownerUtiles = require('users/doker/ccdc:ccdc-SandL');
var roi = table2.filter(ee.Filter.eq('县', '云霄县'));
var bands = ['BLUE', 'GREEN', 'RED', 'NIR', 'SWIR1', 'SWIR2'];
var seasons = {
spring: {start: '2023-01-01', end: '2023-03-31'},
summer: {start: '2023-04-01', end: '2023-06-30'},
autumn: {start: '2023-07-01', end: '2023-09-30'},
winter: {start: '2023-10-01', end: '2023-12-31'}
};
var points = ee.FeatureCollection(table);
var SampleValidObservations = function(feature, startDate, endDate) {
var filteredSL = ownerUtiles.getImageCol({
start: startDate,
end: endDate
})
.filterBounds(roi)
.filterDate(startDate, endDate)
.select(bands);
var validObservations = filteredSL.map(function(image) {
var sampled = image.reduceRegion({
reducer: ee.Reducer.count(),
geometry: feature.geometry(),
scale: 10,
maxPixels: 1e13
});
var validCount = ee.Number(sampled.values().get(0));
return ee.Feature(null, {
'validCount': validCount
}).setGeometry(feature.geometry());
});
var totalValidCount = validObservations.aggregate_sum('validCount');
return feature.set({'validCount': totalValidCount});
};
var calculateSeasonalMedians = function(season) {
var startDate = season.start;
var endDate = season.end;
var seasonalResults = points.map(function(point) {
return SampleValidObservations(point, startDate, endDate);
});
// 收集所有样本点的有效观测次数
var allValidCounts = seasonalResults.aggregate_array('validCount').flatten();
// 过滤掉无效值
allValidCounts = allValidCounts.filter(ee.Filter.gt('item', 0));
// 计算中值
var medianValidCount = ee.Array(allValidCounts.sort()).slice(0, ee.Number(allValidCounts.length().divide(2).floor())).get([-1]);
print(medianValidCount)
return medianValidCount;
};
// 计算每个季节的中值
var seasonalMedians = ee.Dictionary({
spring: calculateSeasonalMedians(seasons.spring),
summer: calculateSeasonalMedians(seasons.summer),
autumn: calculateSeasonalMedians(seasons.autumn),
winter: calculateSeasonalMedians(seasons.winter)
});
var seasonalResults = ee.FeatureCollection([
ee.Feature(null, {season: 'spring', medianValidCount: seasonalMedians.get('spring')}),
ee.Feature(null, {season: 'summer', medianValidCount: seasonalMedians.get('summer')}),
ee.Feature(null, {season: 'autumn', medianValidCount: seasonalMedians.get('autumn')}),
ee.Feature(null, {season: 'winter', medianValidCount: seasonalMedians.get('winter')})
]);
Export.table.toDrive({
collection: seasonalResults,
description: 'SeasonalMedianValidObservations',
fileFormat: 'CSV',
folder: 'ccdc'
});