一、引言
本文将详细介绍如何使用 GEE 对南京市 2018 年至 2022 年的 Sentinel-2 卫星数据进行处理,实现水体的提取和时间序列分析。(大家可自行修改代码中的经纬度、时间及NDWI指数,进行自己的研究)
二、代码实现
2.1 定义研究区域
// 定义南京市的经纬度范围(矩形)
var nanjing = ee.Geometry.Rectangle([118.2, 31.3, 119.2, 32.6], null, false);
Map.centerObject(nanjing, 8);
Map.addLayer(nanjing, {color:'red'}, 'Study Area');
通过ee.Geometry.Rectangle
定义南京市的经纬度范围,并将地图中心定位到该区域,同时在地图上添加研究区域的边界。
2.2 去云函数
// 定义新的去云函数(适配Sentinel-2 Level-2A数据集)
function maskS2Clouds(image) {
// 方法1:使用SCL波段直接分类掩膜云和阴影
var scl = image.select('SCL');
var cloudMask = scl.eq(8) // 中云/高云概率高
.or(scl.eq(9)) // 薄卷云
.or(scl.eq(3)) // 云阴影
.not();
// 方法2(备选):使用云概率波段MSK_CLDPRB(需阈值化)
// var cloudProb = image.select('MSK_CLDPRB');
// var cloudMask = cloudProb.lt(30); // 云概率<30%视为无云
// 应用掩膜并缩放反射率
return image.updateMask(cloudMask)
.divide(10000) // Level-2A反射率已缩放为0-1,无需此行可注释
.copyProperties(image, ['system:time_start']);
}
此函数用于去除 Sentinel-2 Level-2A 数据中的云。提供了两种去云方法,一种是通过 SCL 波段直接分类掩膜云,另一种是通过云概率波段设置阈值来掩膜云。
2.3 计算归一化水体指数(NDWI)
// 计算NDWI(绿光B3和近红外B8)
function addNDWI(image) {
var ndwi = image.normalizedDifference(['B3', 'B8']).rename('NDWI');
return image.addBands(ndwi);
}
通过normalizedDifference
方法计算 NDWI,将结果添加到影像中。
2.4 定义时间范围和参数
// 定义时间范围和参数
var startYear = 2018;
var endYear = 2022;
var ndwiThreshold = 0.2;
设置时间范围为 2018 年至 2022 年,并设定 NDWI 阈值为 0.2 用于水体提取。
2.5 逐年处理数据
// 定义选择公共波段的函数
function selectCommonBands(image) {
var commonBands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B9', 'B11', 'B12', 'AOT', 'WVP', 'SCL', 'TCI_R', 'TCI_G', 'TCI_B', 'MSK_CLDPRB', 'MSK_SNWPRB', 'NDWI'];
return image.select(commonBands);
}
// 存储每年的水体掩膜
var waterMasks = [];
// 逐年处理
for (var year = startYear; year <= endYear; year++) {
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = ee.Date.fromYMD(year, 12, 31);
// 加载并处理Sentinel-2 Level-2A数据
var s2Col = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(nanjing)
.filterDate(startDate, endDate)
.map(maskS2Clouds)
.map(addNDWI)
.map(selectCommonBands); // 选择公共波段
// 合成年度中值影像并提取水体
var median = s2Col.median();
var water = median.select('NDWI').gt(ndwiThreshold).selfMask();
// 导出到Google Drive
Export.image.toDrive({
image: water,
description: 'Water_Nanjing_' + year,
scale: 10,
region: nanjing,
maxPixels: 1e13,
fileFormat: 'GeoTIFF'
});
waterMasks.push(water.set({'year': year}));
}
循环处理每年的数据,加载 Sentinel-2 Level-2A 影像集合,进行去云、计算 NDWI、合成年度中值影像并提取水体,最后将水体掩膜导出到 Google Drive 并存储。
2.6 可视化水体掩膜
// 将数组转换为ImageCollection
waterMasks = ee.ImageCollection(waterMasks);
var visParams = {palette: ['blue'], min: 0, max: 1};
// 按时间顺序可视化每年的水体掩膜
waterMasks.evaluate(function(waterMasksList) {
waterMasksList.features.forEach(function(feature) {
var year = feature.properties.year;
var waterImage = ee.Image(feature.id);
Map.addLayer(waterImage, visParams, 'Water_Nanjing_' + year);
});
});
将存储的水体掩膜数组转换为影像集合,并设置可视化参数,按时间顺序将每年的水体掩膜添加到地图上进行可视化。
结果展示:
2018年水体提取结果:
PS:实际应用或者写论文的时候应当综合考虑多种指数或者结合其他方法进行水体分析,不能仅仅用一种方法。