在遥感数据分析与处理工作中,海量影像数据的预处理(如去云、裁剪)和分析(如均值计算)是支撑后续研究的核心环节。而Sentinel-2影像作为常用的遥感数据源,常因云层遮挡、数据量大等问题增加处理难度。同时,在使用Google Earth Engine(GEE)处理数据时,“批量导出任务需手动逐个启动”的问题也会显著降低效率。
本文将从“工具优化”和“数据处理”两个维度展开,详细介绍如何通过GEE完成Sentinel-2影像的云层掩膜、月均值计算,重点说明如何借助Open Earth Engine插件解决GEE任务批量执行的痛点,最终实现从数据处理到结果导出的全流程高效化。
在GEE中,所有需要保存的处理结果(如计算后的影像)都需通过Export
命令添加到“Tasks”面板,再点击“RUN”按钮启动导出。但默认情况下,GEE没有“批量启动所有任务”的功能——若需导出12个月的月均值影像,就需要手动点击12次“RUN”,不仅繁琐还易出错。而Open Earth Engine插件作为谷歌浏览器的扩展工具,正是解决这一问题的关键。
Open Earth Engine插件的核心作用是为GEE的Tasks面板添加“RUN ALL”按钮,实现所有导出任务的一键启动。无需手动逐个点击,大幅减少重复操作,尤其适合需要导出多时段、多区域数据的场景(如本文后续的“Sentinel-2月均值影像批量导出”)。
在使用插件提升导出效率前,需先明确GEE的核心优势及Sentinel-2影像的处理流程——插件是“增效工具”,而GEE本身是“处理平台”,二者结合才能实现全流程高效化。
Google Earth Engine(GEE)是集“数据存储、处理、分析”于一体的在线平台:
Sentinel-2影像(本文以表面反射率数据SR为例)处理的核心目标是“去除噪声、提取有效信息”,主要需求包括:
以下以“长江口区域(YREstuary_Area)2019-2022年Sentinel-2月均值影像(去云后)”为例,详细说明处理流程。
首先加载研究区域(ROI),GEE支持通过“资产导入”或“手动绘制”定义区域,本文使用已上传的“YREstuary_Area”矢量数据:
// 导入研究区域矢量数据(需提前上传至GEE资产)
var YREstuary_Area = ee.FeatureCollection("projects/ee-3157311411/assets/YRDelta/roi/YREstuary_Area");
// 定义为感兴趣区域(ROI)
var roi = YREstuary_Area;
// 在地图上显示区域(可选,用于确认区域是否正确)
Map.addLayer(roi, {color: 'red'}, '研究区域');
Map.centerObject(roi, 10); // 居中显示区域,缩放级别10
Sentinel-2影像的QA60波段记录了“云层、 cirrus云(卷云)”的位置信息,通过该波段可实现自动化去云:
// 定义云掩膜函数:去除云层和卷云像素
function maskS2clouds(image) {
// 选择QA60波段(质量评估波段,记录云信息)
var qa = image.select('QA60');
// 定义云像素的二进制标记(1 << 10表示云层,1 << 11表示卷云)
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
// 构建掩膜:保留“非云且非卷云”的像素(bitwiseAnd为0表示无云)
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
// 应用掩膜,并将反射率值从“整数”转换为“浮点数”(Sentinel-2原始值需除以10000)
return image.updateMask(mask).divide(10000);
}
需对2019-2022年每月的影像进行去云后均值计算,并生成导出任务(后续将通过Open Earth Engine插件批量启动):
// 定义时间范围(2019-2022年)
var startYear = 2019;
var endYear = 2022;
// 循环遍历每一年、每一个月
for (var year = startYear; year <= endYear; year++) {
for (var month = 1; month <= 12; month++) {
// 定义当月时间范围(月初至月末)
var startDate = ee.Date.fromYMD(year, month, 1);
var endDate = ee.Date.fromYMD(year, month + 1, 1).advance(-1, 'day'); // 月末=下月1日减1天
// 加载Sentinel-2表面反射率影像(去云前筛选)
var dataset = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate(startDate, endDate) // 筛选当月影像
.filterBounds(roi) // 筛选研究区域内的影像
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)) // 初步筛选云量<20%的影像
.map(maskS2clouds); // 应用云掩膜函数,去除剩余云像素
// 计算当月去云后的均值影像
var monthlyMean = dataset.mean();
// 创建导出任务(添加到Tasks面板)
Export.image.toDrive({
image: monthlyMean, // 待导出的均值影像
description: 'S2_L2A_' + year + '_' + month, // 任务名称(包含年月,便于区分)
folder: 'Sentinel2_L2A', // 导出到Google Drive的文件夹名称
scale: 10, // 分辨率(Sentinel-2可见光波段原生分辨率为10m)
region: roi, // 导出范围(研究区域)
fileFormat: 'GeoTIFF', // 导出格式(兼容ArcGIS、ENVI等软件)
maxPixels: 1e13 // 最大像素限制(避免因数据量大导致导出失败)
});
}
}
代码运行后,GEE的Tasks面板会生成48个任务(2019-2022年共4年×12个月)。此时无需手动点击每个任务的“RUN”:
本文通过“工具(Open Earth Engine插件)+平台(GEE)”的结合,实现了Sentinel-2影像处理的全流程优化:
对于遥感数据处理人员而言,Open Earth Engine插件并非“可有可无的工具”,而是“提升GEE使用效率的关键拓展”——它让GEE的导出功能更贴合实际需求,再结合GEE本身的处理能力,真正实现“工欲善其事,必先利其器”。
欢迎大家关注我的公众号:遥感AI实战,进一步交流!