目录
1 SDWI指数
2 完整代码
3 运行结果
微波遥感具有全天候、全天时工作能力,能穿透云层,不受气象条件和光照水平影响,因此近年来利用微波遥感提取水体信息也备受关注。本文分享使用 Sentinel-1遥感影像通过SDWI指数来进行逐月水域面积计算提取和结果导出。
1 SDWI指数
Sentinel-1双极化数据SDWI水体提取指数公式:SDWI = ln (10×VV×VH)
Sentinel-1 Dual-Polarized Water Index (SDWI)水体信息提取方法对 Sentinel-1 双极化数据(VV 和 VH)之间水体信息提取的关系进行深入研究,达到增强水体特征的效果,水体区分较明显,同时消除土壤和植被对水体提取中造成的干扰。公式的指导思想是将 VV 和 VH 极化影像相乘,并且乘以 10,以此扩大水体与其他地物之间的差异,再以自然对数作为函数式。
2 完整代码
// 引入感兴趣区(ROI)并添加到地图
var roi = table;
Map.addLayer(roi);
Map.centerObject(roi, 8);
// 设置时间范围和生成每月的日期范围
var startYear = 2021;
var endYear = 2023;
var months = ee.List.sequence(1, 12);
// 使用Sentinel - 1数据集
var s1Collection = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterBounds(roi)
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
.filter(ee.Filter.eq('instrumentMode', 'IW'));
// 定义 SDWI 计算函数
var calculateSDWI = function(image) {
var VV = image.select('VV');
var VH = image.select('VH');
return image.expression(
'log(10 * VV * VH) - 8',
{ 'VV': VV, 'VH': VH }
).rename('SDWI');
};
// 计算逐月水体掩膜面积
var calculateMonthlyWaterArea = function(year, month) {
// 获取该月的开始和结束日期
var startDate = ee.Date.fromYMD(year, month, 1);
var endDate = startDate.advance(1, 'month');
// 过滤 Sentinel - 1 图像集以获取当月的图像
var monthlyCollection = s1Collection
.filterDate(startDate, endDate)
.map(calculateSDWI);
// 计算月度水体掩膜
var sdwiComposite = monthlyCollection.median().clip(roi);
var waterMask = sdwiComposite.gt(-0.1).rename('WaterMask');
// 计算水体面积(平方千米)
var areaImage = waterMask.multiply(ee.Image.pixelArea()).divide(1e6);
var waterArea = areaImage.reduceRegion({
reducer: ee.Reducer.sum(),
geometry: roi,
scale: 10,
maxPixels: 1e9
}).get('WaterMask');
// 返回一个包含年、月和水体面积的字典
return ee.Feature(null, {
'Date': startDate.format('yyyy/M/d'),
'Year': year,
'Month': month,
'WaterArea_km2': waterArea
});
};
// 对每个月进行水体面积计算并转换为 FeatureCollection
var calculateWaterAreaByMonth = function(year) {
return ee.FeatureCollection(
months.map(function(month) {
return calculateMonthlyWaterArea(year, month);
})
);
};
// 将所有年份的水体面积合并到一起
var allYearsWaterArea = ee.FeatureCollection(
ee.List.sequence(startYear, endYear).map(calculateWaterAreaByMonth)
).flatten();
// 导出逐月水体面积到 CSV 文件
Export.table.toDrive({
collection: allYearsWaterArea,
description: 'Monthly_Water_Area_2021_2022',
fileFormat: 'CSV'
});
// 可视化参数
var visParams = {
min: 0,
max: 1,
palette: ['FFFFFF', '0000FF'] // 蓝色表示水体,白色表示非水体
};
// 将逐月水体掩膜加载到地图上,并导出影像
for (var year = startYear; year <= endYear; year++) {
for (var month = 1; month <= 12; month++) {
var startDate = ee.Date.fromYMD(year, month, 1);
var endDate = startDate.advance(1, 'month');
var monthlyCollection = s1Collection
.filterDate(startDate, endDate)
.map(calculateSDWI);
var sdwiComposite = monthlyCollection.median().clip(roi);
var waterMask = sdwiComposite.gt(-0.1).rename('WaterMask');
// 在地图上显示每个月的水体掩膜
var label = 'WaterMask_' + year + '_' + month;
Map.addLayer(waterMask, visParams, label);
// 导出逐月影像
Export.image.toDrive({
image: waterMask,
description: 'WaterMask_' + year + '_' + month,
folder: 'GEE/DTH/images',
fileNamePrefix: 'WaterMask_' + year + '_' + month,
region: roi,
scale: 10,
maxPixels: 1e13
});
}
}
3 运行结果


