基于 GEE 利用 Sentinel-1 双极化数据计算 SDWI 指数实现逐月提取水域面积

devtools/2025/3/16 13:14:48/

目录

1 SDWI 指数

2 研究方法及数据处理

3 完整代码

4 运行结果


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 研究方法及数据处理

  • 水体识别方法

传统光学遥感因云雾遮挡往往难以实现连续监测,而本研究利用Sentinel-1雷达数据提出了一种综合方法,通过SDWI指数(Sentinel-1 Derived Water Index)实现高精度水体识别。

  • SDWI指数计算

SDWI指数定义为VV和VH两个极化通道之比的对数值,SDWI的物理意义是利用水面对雷达波的镜面反射特性与植被和土地表面散射特性的差异,精确地区分水体与非水体。

  • 掩膜过滤

为进一步提高精度,本研究引入了多个掩膜叠加条件:

(1)DEM坡度掩膜:利用SRTM数据计算坡度,排除坡度大于5°的地区,减少山区阴影的干扰。

(2)JRC全球水体掩膜:仅保留长期存在的水体区域(发生概率超过10%),减少短暂积水或湿地误判。

(3)VH极化通道筛选:设定VH阈值(< -15 dB)以进一步提高水体分类的纯度。

  • 逐月水体面积动态监测

(1)Sentinel-1影像每月中值合成,降低单景图像噪声影响。

(2)应用综合掩膜提取水体区域。

(3)基于提取的水体掩膜,利用GEE进行逐月面积统计,并导出成表格。

3 完整代码

// 引入感兴趣区(ROI)
var roi_x = table;
Map.addLayer(roi_x);
Map.centerObject(roi_x, 8);// 设置时间范围
var startYear = 2023;
var endYear = 2024;
var months = ee.List.sequence(1, 12);// Sentinel - 1 数据集
var s1Collection = ee.ImageCollection('COPERNICUS/S1_GRD').filterBounds(roi_x).filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV')).filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH')).filter(ee.Filter.eq('instrumentMode', 'IW'));// 引入 SRTM DEM 数据并计算坡度
var dem = ee.Image("USGS/SRTMGL1_003");
var slope = ee.Terrain.slope(dem);
var slopeThreshold = 5;
var landMask = slope.lt(slopeThreshold);// **引入 JRC 全球水体数据**
var jrcWater = ee.Image("JRC/GSW1_3/GlobalSurfaceWater").select("occurrence").clip(roi_x);// **JRC 水体阈值**
var jrcWaterThreshold = 10; // 仅保留出现概率 >50% 的水体区域
var jrcMask = jrcWater.gt(jrcWaterThreshold);// 计算 Sentinel - 1 SDWI
var calculateSDWI = function (image) {var VV = image.select('VV');var VH = image.select('VH');// 计算 SDWI(Sentinel - 1 水体指数)var sdwi = VV.divide(VH).log10().rename('SDWI');return image.addBands(sdwi).addBands(VH.rename('VH')); // 添加 VH 以便后续筛选
};// 计算逐月水体掩膜面积
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);// 计算 SDWI 中值合成var sdwiComposite = monthlyCollection.median().clip(roi_x);var VH = sdwiComposite.select('VH');// 计算水体掩膜(结合 DEM 坡度、VH 极化、JRC 水体数据)var waterMask = sdwiComposite.select('SDWI').gt(-0.5).and(sdwiComposite.select('SDWI').lt(0.3)).and(VH.lt(-15)) // 低 VH 值通常表示水体.and(landMask) // 过滤山体阴影.and(jrcMask) // 结合 JRC 长期水体数据.rename('WaterMask');// 计算水体面积(平方千米)var areaImage = waterMask.multiply(ee.Image.pixelArea()).divide(1e6);var waterArea = areaImage.reduceRegion({reducer: ee.Reducer.sum(),geometry: roi_x,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: 'Refined_Monthly_Water_Area_' + startYear + '_' + endYear,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_x);var VH = sdwiComposite.select('VH');// 计算水体掩膜var waterMask = sdwiComposite.select('SDWI').gt(-0.2).and(sdwiComposite.select('SDWI').lt(0.2)).and(VH.lt(-18)) // 低 VH 表示水体.and(landMask) // 过滤山体阴影.and(jrcMask) // 结合 JRC 长期水体数据.rename('WaterMask');// 在地图上显示水体掩膜var label = 'Refined_WaterMask_' + year + '_' + month;Map.addLayer(waterMask, visParams, label);// 导出优化后的水体掩膜影像Export.image.toDrive({image: waterMask,description: 'Refined_WaterMask_' + year + '_' + month,folder: 'GEE/DTH/images',fileNamePrefix: 'Refined_WaterMask_' + year + '_' + month,region: roi_x,scale: 10,maxPixels: 1e13});}
}

4 运行结果

本文实现了2023年至2024年共24个月份的水体面积逐月变化监测,结果以.csv文件形式导出,便于进一步的数据分析、制图与展示。同时,导出的影像也可用于GIS软件进一步分析与可视化。

运行结果图层
点击RUN即可下载数据
水体提取结果图层可视化

http://www.ppmy.cn/devtools/167566.html

相关文章

【图像处理】ISP(Image Signal Processor) 图像处理器的用途和工作原理?

ISP&#xff08;图像信号处理器&#xff09;是数字影像设备的“视觉大脑”&#xff0c;负责将传感器捕获的原始电信号转化为我们看到的高清图像。以下从用途和工作原理两方面通俗解析&#xff1a; 一、ISP的核心用途&#xff1a;让照片“更像眼睛看到的” 提升画质&#xff1a…

​技术解析麦萌短剧《阴阳无极》:从「性别偏见下的对抗训练」到「分布式江湖的架构重构」​

《阴阳无极》以陈千叶的武道觉醒为线索&#xff0c;展现了传统系统的路径依赖困境与对抗性策略的范式突破。本文将从算法博弈视角拆解这场武侠革命的底层逻辑&#xff0c;探讨如何在性别偏见的数据集中完成模型的自我进化。 ​1. 初始模型偏差&#xff1a;继承权剥夺与梯度冻结…

计算机网络开发--阻塞与非阻塞、同步与异步、http协议

阻塞与非阻塞 和 同步与异步 典型的一次IP的两个阶段&#xff1a;数据就绪和数据读写 数据就绪:根据系统IO操作的就绪状态 系统就绪分为阻塞和非阻塞。 如果是阻塞操作&#xff0c;那么当前线程会被挂起&#xff0c;等待资源准备好。在此期间&#xff0c;CPU会切换到其他线程…

mysql经典试题共34题

1、准备数据 -- drop drop table if exists dept; drop table if exists emp; drop table if exists salgrade;-- CREATE CREATE TABLE dept (deptno int NOT NULL COMMENT 部门编号,dname varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMM…

外星人入侵-Python-三

武装飞船 开发一个名为《外星人入侵》的游戏吧&#xff01;为此将使用 Pygame&#xff0c;这是一组功能强大而有趣的模块&#xff0c;可用于管理图形、动画乃至声音&#xff0c; 让你能够更轻松地开发复杂的游戏。通过使用Pygame来处理在屏幕上绘制图像 等任务&#xff0c;可将…

Vue3 响应式中 Reflect 的作用

在 Vue 3 的响应式系统中&#xff0c;Reflect 主要用于配合 Proxy 实现属性的拦截和默认行为执行&#xff0c;确保响应式系统能够正确追踪依赖和触发更新。以下是 Reflect 在 Vue 响应式中的核心作用&#xff1a; 1. 与 Proxy 配合完成默认行为 Proxy 用于拦截对象操作&#x…

L1-7 整数的持续性

题目 代码 #include <iostream> // 包含输入输出流的头文件 #include <vector> // 包含向量容器的头文件 #include <algorithm> // 包含算法函数的头文件 using namespace std; // 使用标准命名空间 // 定义一个名为 calculatePersistence 的函数…

串排序(信息学奥赛一本通-2048)

【题目描述】 对给定的n(1≤n≤20)个国家名&#xff08;国家名字长度不超过20&#xff09;&#xff0c;按其字母的顺序输出。 【输入】 第一行为国家的个数n&#xff1b; 以下n行为国家的名字。 【输出】 n行&#xff0c;排序后的国名。 【输入样例】 3 Korea China Japan 【输…