总体介绍
这段代码利用Google Earth Engine(GEE)处理Sentinel-2地表反射率数据,通过去除云层、裁剪感兴趣区域(ROI),并对处理后的数据进行可视化显示。
数据集
- COPERNICUS/S2_SR_HARMONIZED: 这是Sentinel-2地表反射率数据集,提供10米分辨率的地表反射率数据。该数据集包含多个波段及质量评估信息,用于分析地表特征。
流程和功能
-
定义研究区和时间范围:将研究区定义为
geometry
,并设置时间范围为2020年9月25日至26日。 -
去云处理:
- 定义一个函数
maskS2clouds
,利用质量评估波段(QA60
)去除云层像元。 - 通过位移运算去除云层和卷云覆盖的像元。
- 定义一个函数
-
加载和筛选Sentinel-2数据集:
- 加载Sentinel-2地表反射率数据集,并根据日期、地理范围和云覆盖率进行筛选。
- 将满足条件的影像标记为来自Sentinel-2的数据源。
- 应用去云处理函数
maskS2clouds
,获取处理后的影像集合。
-
可视化处理结果:
- 定义可视化参数,选择波段并设定数据范围。
- 将处理后的影像集合的平均值添加到地图上进行显示。
- 将原始影像集合和去云处理后的影像集合分别添加到地图上,以便进行比较。
-
输出筛选结果:
- 输出满足筛选条件的影像数量,并打印每个影像的时间戳。
- 将站点位置(
zhandian
)添加到地图上,以黄色标记显示。
运行结果
- 可视化:生成并显示处理后的Sentinel-2地表反射率影像,去除了云层干扰,并将影像裁剪到指定的感兴趣区域。
- 影像处理:去除了云层干扰,裁剪到指定区域,显示了特定波段的组合。
- 地图显示:在地图上显示处理后的影像、感兴趣区域和站点位置,便于用户进行进一步的分析和研究。
- 输出信息:打印了满足筛选条件的影像数量及每个影像的时间戳,便于了解数据的时间分布。
完整代码:
// 定义研究区,并将定义的研究区显示在下方中间
var geometry = table;
Map.centerObject(geometry, 9);
// 去云处理
function maskS2clouds(image) {
var qa = image.select('QA60');
// 第10和11位分别是云和卷云。位移运算去云
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
// 这两个标志都应设为零,表示条件明确。
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
return image.updateMask(mask).divide(10000);
}
// 定义时间范围
var startDate = '2020-09-25';
var endDate = '2020-09-26';
// 定义云阈值
var cloudThreshold = 100;
//sentinel-2数据集
var sentinel2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterBounds(geometry)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', cloudThreshold))
.map(function(image) {
return image.set('source', 'Sentinel-2');
});
var noclould =sentinel2.map(maskS2clouds)
// 可视化
var visualization = {
min: 0.0,
max: 0.3,
bands: ['B4', 'B3', 'B2'],
};
// 加载影像并居中显示
Map.addLayer(sentinel2.mean().clip(geometry), visualization, 'data');
Map.addLayer(noclould.mean().clip(geometry), visualization, 'noclould');
// 输出筛选结果
var modisCount = sentinel2.size();
if (modisCount.getInfo() > 0) {
print("已筛选出 " + modisCount.getInfo() + " 张影像");
} else {
print("没有满足筛选条件的影像");
}
var sentinel2Clipped = sentinel2.map(function(image) {
return image.clip(geometry);
});
sentinel2Clipped.aggregate_array('system:time_start').evaluate(function(dates) {
var formattedDates = dates.map(function(date) {
return new Date(date).toISOString(); // 输出年-月-日-时-分-秒
});
print('Sentinel-2 影像时间:', formattedDates);
});
//var zhandian=table2
//Map.addLayer(zhandian, {color: 'yellow'}, 'zhandian');
运行示例图:
原始影像:
去云的影像:
工作台输出: