目录

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
水体浊度是评价河流水质与生态环境的重要指标,传统地面监测手段成本高、覆盖有限。本文基于Google Earth Engine(GEE)遥感云平台,利用Sentinel-2多光谱影像(L2A地表反射率产品),结合S2_CLOUD_PROBABILITY云概率数据进行云掩膜处理,通过归一化差异浊度指数(NDTI)实现河流浊度的遥感估算。核心流程涵盖:SR与云概率数据集的影像连接(Join)、NDTI计算与水体掩膜(NDWI阈值法)、逐月NDTI最大值合成(qualityMosaic),以及时间序列图表生成与批量栅格导出。本方案有效解决了遥感浊度监测中云污染与陆地像元干扰两大痛点,适用于大范围、长时序的河流水质动态监测与科研分析。
一、研究区与数据准备
(一)研究区定义
GEE中的geometry为导入的矢量或绘制多边形,作为后续所有影像筛选与统计计算的约束范围。
javascript
var study_area = geometry;
Map.centerObject(study_area, 10);
Map.addLayer(study_area, {color: 'red'}, 'Study Area');
Map.centerObject()将地图视图居中于研究区,zoom参数10适用于中等尺度区域(如河段或湖泊)。叠加红色边界便于目视检查研究区位置是否正确。
(二)数据源选择
Sentinel-2 L2A地表反射率产品(COPERNICUS/S2_SR_HARMONIZED)已完成了大气校正,输出的是地表反射率(BOA, Bottom-Of-Atmosphere)。其像元值为放大10000倍的整型,实际反射率需乘以缩放因子0.0001。
javascript
var s2_sr = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED');
var s2_cloud = ee.ImageCollection('COPERNICUS/S2_CLOUD_PROBABILITY');
注意事项 :S2_SR_HARMONIZED是经过处理基线统一的协调版本,可有效规避不同处理基线(Processing Baseline)带来的数值差异。务必使用该集合而非旧版S2_SR。
二、SR产品与云概率产品配对
Sentinel-2的SR产品与云概率产品是独立的两套ImageCollection,需通过system:index进行一一对应连接。
javascript
var joined = ee.Join.saveFirst('cloud_prob').apply({
primary: s2_sr,
secondary: s2_cloud,
condition: ee.Filter.equals({
leftField: 'system:index',
rightField: 'system:index'
})
});
ee.Join.saveFirst('cloud_prob')将每条SR影像匹配的云概率影像以'cloud_prob'为键存入其属性中。leftField与rightField均为'system:index'------这是GEE中影像的唯一标识符,确保配对准确无误。
三、NDTI计算与水陆分离
(一)NDTI算法原理
归一化差异浊度指数(NDTI)通过红波段与绿波段的反射率差异量化水体中的悬浮沉积物浓度。其数学表达式为:
对应于Sentinel-2的波段编号:
其中B4为红波段(~665nm),B3为绿波段(~560nm)。浊度越高,红波段反射率相对绿波段越强,NDTI值越大。
(二)核心计算函数
javascript
function computeNDTI(image) {
var cloudProb = ee.Image(image.get('cloud_prob'))
.select('probability');
var cloudMask = cloudProb.lt(20);
var sr = image.select(['B3', 'B4', 'B8'])
.multiply(0.0001);
var ndwi = sr.normalizedDifference(['B3', 'B8']);
var waterMask = ndwi.gt(0.1);
var ndti = sr.normalizedDifference(['B4', 'B3'])
.rename('ndti');
return ndti
.updateMask(cloudMask)
.updateMask(waterMask)
.copyProperties(image, ['system:time_start']);
}
- 云掩膜 :从配对的云概率影像中提取
'probability'波段,阈值设为< 20(即保留云概率低于20%的清晰像元)。阈值可根据区域云况调整(常用10%~40%)。 - 缩放因子 :
multiply(0.0001)将整型DN值转换为实际地表反射率(0~1区间)。 - 水体掩膜:利用归一化差异水体指数(NDWI)区分水陆:
- NDTI计算 :
normalizedDifference(['B4', 'B3'])等价于(B4-B3)/(B4+B3)。 - 属性继承 :
copyProperties()保留原始影像的时间戳system:time_start,为后续时序分析提供时间基准。
参数优化建议:NDWI阈值可根据水体清澈程度调整------浑浊水体NDWI值偏低,可适当降至0或-0.1;清澈水体可提高至0.2。
四、时间筛选与NDTI集合生成
javascript
var ndtiCol = ee.ImageCollection(joined)
.filterBounds(study_area)
.filterDate('2023-01-01', '2025-01-01')
.map(computeNDTI);
filterBounds()按空间范围筛选,filterDate()限定时间窗口,map()将computeNDTI函数应用于集合中的每一景影像,生成NDTI单波段影像集合。
五、月度最大值合成
逐月最大值合成的核心逻辑:对每个月份内的所有NDTI影像,逐像元取最大值。
javascript
var years = ee.List.sequence(2023, 2024);
var months = ee.List.sequence(1, 12);
var monthlyNDTI = ee.ImageCollection.fromImages(
years.map(function (y) {
return months.map(function (m) {
var monthly = ndtiCol
.filter(ee.Filter.calendarRange(y, y, 'year'))
.filter(ee.Filter.calendarRange(m, m, 'month'));
return monthly
.qualityMosaic('ndti')
.set({
'year': y,
'month': m,
'system:time_start': ee.Date.fromYMD(y, m, 1)
});
});
}).flatten()
);
核心机制------qualityMosaic() :
qualityMosaic('ndti')以'ndti'波段作为质量指示因子,对集合中所有影像逐像元比较,选取NDTI值最高的像元构成合成影像。其优势在于:
-
抗云干扰:云覆盖区域的NDTI值通常偏低(云在红绿波段反射率均高,比值接近1),最大值合成天然倾向于选择无云或薄云像元。
-
保留峰值信号:浊度具有明显的脉冲特征(如汛期峰值),最大值合成有效捕捉月度内的极端浊度事件,优于均值合成。
注意事项 :若某月份研究区内无有效影像(全云或全部被掩膜),qualityMosaic()将返回空影像。建议在导出前检查monthly.size()。
六、空间可视化与时间序列分析
(一)多年月均NDTI展示
javascript
var ndtiVis = { min: -0.2, max: 0.2, palette: ['blue', 'white', 'red'] };
var meanNDTI = monthlyNDTI.mean();
Map.addLayer(meanNDTI.clip(study_area), ndtiVis, 'Mean Monthly NDTI (2023--2024)');
mean()计算所有月份NDTI的均值,clip()裁剪至研究区边界。配色方案blue-white-red中,蓝色代表低浊度(清澈),红色代表高浊度(浑浊)。
(二)区域均值时间序列
javascript
var monthlyMean = monthlyNDTI.map(function (img) {
var mean = img.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: study_area,
scale: 30,
maxPixels: 1e13
});
return ee.Feature(null, {
'date': ee.Date(img.get('system:time_start')).format('YYYY-MM'),
'mean_ndti': mean.get('ndti')
});
});
reduceRegion()计算研究区内所有有效像元的NDTI均值。scale:30匹配Sentinel-2大多数波段的空间分辨率。maxPixels:1e13确保大区域计算不溢出。
(三)时序图表
javascript
var chart = ui.Chart.feature.byFeature({
features: monthlyMean,
xProperty: 'date',
yProperties: ['mean_ndti']
})
.setChartType('LineChart')
.setOptions({
title: 'Monthly Mean NDTI Time Series',
hAxis: {title: 'Date'},
vAxis: {title: 'Mean NDTI'},
lineWidth: 2,
pointSize: 4
});
生成折线图,横轴为时间,纵轴为区域平均NDTI,直观呈现浊度的季节变化与年际趋势。
七、数据导出策略
CSV时序数据导出:
javascript
Export.table.toDrive({
collection: monthlyMean,
description: 'Monthly_NDTI_Mean',
fileFormat: 'CSV'
});
导出包含日期与NDTI均值字段的表格,便于后续统计分析。
逐月栅格批量导出:
javascript
var list = monthlyNDTI.toList(monthlyNDTI.size());
var count = list.size().getInfo();
for (var i = 0; i < count; i++) {
var img = ee.Image(list.get(i));
var dateStr = ee.Date(img.get('system:time_start'))
.format('YYYY_MM')
.getInfo();
Export.image.toDrive({
image: img.clip(study_area),
description: 'NDTI_' + dateStr,
fileNamePrefix: 'NDTI_' + dateStr,
region: study_area,
scale: 30,
maxPixels: 1e13
});
}
toList()将ImageCollection转为List以便遍历。逐月导出时,description与fileNamePrefix均包含年月标识,便于文件管理。scale:30确保输出空间分辨率与源数据一致。
八、总结
本文系统介绍了基于GEE与Sentinel-2的河流浊度(NDTI)遥感估算全流程,核心价值与可复用技术经验可归纳为:
-
数据配准策略 :通过
ee.Join实现SR与云概率影像的精确配对,确保云掩膜的有效性,是高质量时序分析的基础。 -
双重掩膜机制:云概率掩膜(<20%)+ NDWI水体掩膜(>0.1),有效排除大气干扰与陆地像元,保障NDTI计算的纯净度。
-
最大值合成策略 :
qualityMosaic('ndti')逐像元选取月度NDTI峰值,兼具抗云与捕捉浊度极端事件的双重优势,优于传统均值合成。 -
全链条输出:从空间分布图、时序折线图到CSV表格与逐月栅格,覆盖科研分析的全数据需求。
本方案适用于河流、湖泊、水库等各类水体的浊度长时序监测,可作为水质遥感反演、生态环境评估及跨境河流管理等场景的标准化处理流程。代码结构清晰、参数可调,便于迁移至其他区域或扩展至更多年份。
九、运行结果
研究区河流浊度指数(NDTI)遥感监测结果可视化
控制台输出的相关结果信息
月平均河流浊度指数(NDTI)时间序列
点击RUN即可下载月平均河流浊度指数(NDTI)计算结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!