基于 GEE 的 Sentinel-2 多光谱数据实现河流浊度指数(NDTI)遥感监测

目录

一、研究区与数据准备

(一)研究区定义

(二)数据源选择

二、SR产品与云概率产品配对

三、NDTI计算与水陆分离

(一)NDTI算法原理

(二)核心计算函数

四、时间筛选与NDTI集合生成

五、月度最大值合成

六、空间可视化与时间序列分析

(一)多年月均NDTI展示

(二)区域均值时间序列

(三)时序图表

七、数据导出策略

八、总结

九、运行结果


若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!

水体浊度是评价河流水质与生态环境的重要指标,传统地面监测手段成本高、覆盖有限。本文基于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'为键存入其属性中。leftFieldrightField均为'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以便遍历。逐月导出时,descriptionfileNamePrefix均包含年月标识,便于文件管理。scale:30确保输出空间分辨率与源数据一致。

八、总结

本文系统介绍了基于GEE与Sentinel-2的河流浊度(NDTI)遥感估算全流程,核心价值与可复用技术经验可归纳为:

  1. 数据配准策略 :通过ee.Join实现SR与云概率影像的精确配对,确保云掩膜的有效性,是高质量时序分析的基础。

  2. 双重掩膜机制:云概率掩膜(<20%)+ NDWI水体掩膜(>0.1),有效排除大气干扰与陆地像元,保障NDTI计算的纯净度。

  3. 最大值合成策略qualityMosaic('ndti')逐像元选取月度NDTI峰值,兼具抗云与捕捉浊度极端事件的双重优势,优于传统均值合成。

  4. 全链条输出:从空间分布图、时序折线图到CSV表格与逐月栅格,覆盖科研分析的全数据需求。

本方案适用于河流、湖泊、水库等各类水体的浊度长时序监测,可作为水质遥感反演、生态环境评估及跨境河流管理等场景的标准化处理流程。代码结构清晰、参数可调,便于迁移至其他区域或扩展至更多年份。

九、运行结果

研究区河流浊度指数(NDTI)遥感监测结果可视化
控制台输出的相关结果信息
月平均河流浊度指数(NDTI)时间序列
点击RUN即可下载月平均河流浊度指数(NDTI)计算结果

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!

相关推荐
DolitD1 小时前
云流技术深度剖析:单服务器下如何实现3D应用的多实例并发?
java·服务器·前端·3d·云原生·云计算
小马同学-3 小时前
四、虚拟化技术
运维·云计算
Lifangyun_WD12 小时前
第一次租 GPU 服务器怎么开始?镜像、SSH、数据存储和停机前要做什么
服务器·云计算·gpu算力·gpu算力租赁
Huazhongzhanhui15 小时前
极智防护与绿色表改:2026中国(武汉)国际表面处理展览会涂装涂料展会前瞻
人工智能·云计算
workflower16 小时前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
翼龙云_cloud17 小时前
阿里云国际渠道代理商:如何在ECS上部署Flask应用?
运维·数据库·阿里云·flask·云计算
Eric.461 天前
秋叶ComfyUI-AKI最新整合包|完整部署教程+核心指令手册
云计算·百度云·comfyui·ai漫剧
NJCloud1 天前
OpenStack(四)——进阶篇之私有网络配置与块存储服务(Cinder)部署
linux·网络·云计算·openstack
小马同学-1 天前
一、云计算
云计算