目录

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于 Google Earth Engine(GEE)平台,利用 Sentinel-2 卫星的表面反射率数据(COPERNICUS/S2_SR_HARMONIZED),通过特定算法反演指定区域的总悬浮固体(TSS)浓度,并实现数据可视化。以下从代码结构、核心功能、关键算法等方面进行详细解析。
一、前言
(一)总悬浮固体(TSS)
总悬浮固体(TSS)是指尺寸超过2微米的水性颗粒。大部分总悬浮固体由无机材料组成;然而,藻类和细菌也可能被认为是TSS。 总悬浮固体 (TSS) 过量存在对人体有害,在《清洁水法》中被列为常规污染物,它可以表示任何水样(从海水到废水)的质量。广义来讲的话,TSS可以是任何漂浮或“悬浮”在水中的东西,包括沙子、沉积物和浮游生物。当某些水源被腐烂的植物或动物污染时,释放到水中的有机颗粒通常是悬浮固体。
当水通过预先称重的过滤器时,过滤器干燥后剩余的颗粒物被归类为 TSS。这种测量方法提供了悬浮固体的实际干重,因此水质专家通常将 TSS 测量与标准浊度测量相结合,以建立特定地点的相关性,从而有助于节省时间、提高效率。
1. 总悬浮固体对环境的影响
总悬浮固体含量过高会影响浊度、提高水温并降低溶解氧 (DO)水平。这会导致水温更快升高,因为悬浮颗粒会吸收更多热量并消耗氧气,从而对水生生物产生不利影响。固体含量过高还会通过减少光传输来减缓水生植物的光合作用。TDS 浓度过高或过低可能会限制水生植物的生长,并可能导致许多海洋生物死亡。
高浓度的悬浮固体会影响过滤系统、资本设备和管道系统的性能。湖泊、水库、河流和溪流中悬浮固体含量高会对生态系统产生有害影响。监测污水处理厂、工厂或大面积农作物灌溉下游的固体对于维持受纳水体的整体健康至关重要。
2. TSS的计算公式为

(二)总溶解固体(TDS)
溶解固体,小于 2 微米,是指以分子、原子、阳离子或阴离子形式溶解在水中的任何矿物质、盐、金属。总溶解固体 (TDS) 包括无机盐(主要是钙、镁、钾、钠、碳酸氢盐、氯化物和硫酸盐)和一些溶解在水中的少量有机物。
TDS 浓度是水中所有可过滤物质的总和,可通过重量法测定。但在大多数情况下,TDS 主要由离子组成。TDS 主要用于研究自然水体的水质,包括地表水和地下水源。
总溶解固体对环境的影响:
饮用水中的 TDS 可能来自自然水源、城市径流、市政和工业废物、用于处理水的化学品和实际的管道基础设施。虽然 TDS 不被视为主要污染物,但它是水质的一个指标。美国环保署的二级水质标准 TDS 浓度为 500 mg/L,以确保饮用水的适口性。饮用水中溶解固体含量高会影响口感,使其变苦或变咸。高浓度的 TDS 还会导致任何应用中结垢和腐蚀,尤其是在锅炉和冷却水中。
准确定量评估自然环境变化和人类活动对总悬浮固体(TSS)浓度的影响是水环境保护的重要内容之一。根据国家标准 GB11901-89,通常采用称重法测定 TSS 浓度,以表示水质。TSS 浓度是用 TSS 的质量除以过滤后水样的体积得出的,其中悬浮物的质量是将过滤后的水样在 40-80 °C 的烘箱中放置 8 小时得出的,基本单位是mg/L。
二、初始化与区域设置
研究区域定义(roi):
代码首先通过ee.Geometry.Polygon()函数定义了研究区域的边界,该区域为一个矩形,通过四组经纬度坐标确定(此处省略具体坐标值)。其中:
null参数表示不指定投影坐标系,默认使用 GEE 的默认坐标系(WGS84);false参数表示该多边形为 “非闭合” 状态(实际矩形由 4 个顶点顺序连接,最终会自动闭合)。
地图中心与缩放设置:
通过Map.centerObject(roi, 7)函数将地图视图中心定位到研究区域(roi),并设置缩放级别为 7。缩放级别范围为 0-24,数值越小视图范围越广(7 级对应约 10 公里级别的空间尺度),确保研究区域完整显示在地图窗口中。
三、云掩膜函数定义(去云处理)
Sentinel-2 卫星数据受云层影响较大,云层覆盖区域的反射率数据无效,因此需要通过 “云掩膜” 函数剔除云层像素。代码中定义了maskS2clouds(image)函数实现去云,核心逻辑如下:
(一)提取云检测波段(QA60)
function maskS2clouds(image) {
var qa = image.select('QA60'); // 提取QA60波段(云与 cirrus 云检测波段)
// 后续代码省略
}
Sentinel-2 的QA60波段是质量控制波段,通过特定比特位(Bit)存储云层、卷云等质量信息,其中:
- Bit 10:标识 “云层” 像素(1 表示有云,0 表示无云);
- Bit 11:标识 “卷云” 像素(1 表示有卷云,0 表示无卷云)。
(二)构建云掩膜规则
通过 “位运算” 构建云掩膜,筛选出 “无云且无卷云” 的有效像素:
// Bits 10 和 11 分别对应云层和卷云
var cloudBitMask = 1 << 10; // 将数字1左移10位,得到Bit 10的掩码(二进制10000000000)
var cirrusBitMask = 1 << 11; // 将数字1左移11位,得到Bit 11的掩码(二进制100000000000)
// 筛选“Bit10=0 且 Bit11=0”的像素(即无云、无卷云)
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
bitwiseAnd():位与运算,判断目标比特位是否为 1(如qa.bitwiseAnd(cloudBitMask)结果为 0,表示 Bit10 为 0,无云);eq(0):等于 0 判断,筛选出无云 / 无卷云的像素;and():逻辑与运算,同时满足 “无云” 和 “无卷云” 两个条件。
(三)应用掩膜与反射率归一化
return image.updateMask(mask).divide(10000);
updateMask(mask):将构建的掩膜应用到影像上,掩膜为 0 的区域(云层)会被设为透明(无效值),仅保留有效像素;divide(10000):Sentinel-2 表面反射率数据原始值为 “放大 10000 倍的整数”(如反射率 0.5 对应原始值 5000),除以 10000 后转换为实际反射率(小数形式),方便后续计算。
四、Sentinel-2 影像集合筛选与预处理
加载影像集合:
通过ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')加载 Sentinel-2 的 “harmonized 表面反射率集合”,该集合是经过辐射校正、大气校正后的标准化数据,适用于长时间序列分析。
多条件筛选影像:
通过链式调用filter()系列函数,筛选符合研究需求的影像:
var dataset = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate('2024-01-01', '2024-03-30') // 时间范围筛选:2024年1-3月
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',5)) // 云量筛选:整体云量<5%
.filter(ee.Filter.bounds(roi)) // 空间范围筛选:仅保留覆盖研究区的影像
.map(maskS2clouds); // 应用云掩膜函数(逐影像去云)
filterDate(start, end):筛选指定时间范围内的影像,此处为 2024 年第一季度,避免季节差异对 TSS 反演的影响;filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',5)):筛选 “整景影像云量 < 5%” 的影像,初步剔除云量较多的影像,减少后续云掩膜压力;filter(ee.Filter.bounds(roi)):仅保留空间上与研究区(roi)有交集的影像,避免加载无关区域数据,提高计算效率;map(maskS2clouds):对筛选后的每一幅影像执行maskS2clouds云掩膜函数,实现逐影像去云。
打印影像集合信息:
print(dataset)将筛选后的影像集合信息输出到 GEE 控制台,包括影像数量、每幅影像的时间、云量、波段列表等,方便用户检查数据筛选结果是否符合预期(如是否有足够数量的有效影像)。
五、真彩色影像可视化
为直观展示研究区的地表覆盖情况,代码基于去云后的影像集合,生成 “真彩色合成影像” 并添加到地图:
var visualization = {
min: 0.0, // 显示最小值(反射率)
max: 0.3, // 显示最大值(反射率)
bands: ['B4', 'B3', 'B2'], // 波段组合:B4(红)、B3(绿)、B2(蓝)
};
Map.addLayer(dataset.mean(), visualization, 'RGB');
dataset.mean():对影像集合中的所有有效影像计算 “逐像素均值”,得到 2024 年 1-3 月的 “月均反射率影像”,减少单幅影像的噪声影响;bands: ['B4', 'B3', 'B2']:Sentinel-2 的红(B4)、绿(B3)、蓝(B2)波段组合,符合人眼对色彩的感知,生成的影像与实地景观颜色一致(如植被呈绿色、水体呈蓝色);min: 0.0, max: 0.3:根据 Sentinel-2 反射率的实际范围设置显示阈值,避免反射率过高或过低的像素导致影像过亮 / 过暗,确保色彩层次清晰。
六、TSS 浓度反演(核心算法)
总悬浮固体(TSS)是水体环境的重要指标,代码通过 “基于绿波段与红波段反射率比值的对数模型” 反演 TSS 浓度,核心公式为:TSS = 172.191×[log(Green/Red)]² - 190.809×log(Green/Red) + 61.6(该公式为基于实测数据拟合的经验模型,适用于特定区域的水体类型)
计算 TSS 浓度影像:
var TSS_expression = dataset.mean().expression(
'172.191*log(Green/Red)**2 - 190.809 * log(Green/Red) + 61.6', {
'Green': dataset.mean().select('B3'), // 绿波段:Sentinel-2的B3波段
'Red': dataset.mean().select('B4') // 红波段:Sentinel-2的B4波段
}).rename('TSS_br'); // 为结果影像命名波段:TSS_br(br表示“经验模型反演”)
dataset.mean().expression(...):在 “月均反射率影像” 的基础上,通过expression()函数执行 TSS 反演公式;Green/Red:绿波段与红波段的反射率比值,TSS 浓度与该比值呈负相关(TSS 越高,水体对红光的吸收越强,Red 反射率越低,比值越小);log(...):对反射率比值取自然对数,将非线性关系线性化,符合经验模型的拟合假设;rename('TSS_br'):为反演结果影像的波段命名,方便后续识别和处理。
打印 TSS 影像信息:
print(TSS_expression)将 TSS 反演结果影像的信息输出到控制台,包括影像的空间范围、分辨率、波段名称、统计信息(如均值、最小值、最大值)等,用于验证反演结果的合理性(如 TSS 浓度是否在常见水体的合理范围内)。
七、TSS 浓度可视化与地图叠加
为直观展示 TSS 浓度的空间分布,代码定义了专属的可视化参数,并将 TSS 影像叠加到地图上:
var imageVisParam = {"opacity":1, // 透明度:1表示完全不透明
"bands":["TSS_br"], // 可视化波段:TSS_br
"min":8.74, // 可视化最小值:8.74 mg/L(基于研究区TSS实际范围设定)
"max":128.14, // 可视化最大值:128.14 mg/L
"palette":["14ffd5","0e36ff","22ff20","fff808","ffa908","ff3202"]}; // 颜色渐变
Map.addLayer(TSS_expression.clip(roi), imageVisParam, 'TSS_expression');
TSS_expression.clip(roi):将 TSS 影像 “裁剪” 到研究区(roi)范围,仅保留研究区内的 TSS 数据,避免无关区域干扰可视化效果;palette:颜色渐变方案,从浅蓝(14ffd5,低 TSS)到红色(ff3202,高 TSS),不同颜色对应不同 TSS 浓度区间,便于快速识别高浓度区域(如河口、岸边带可能因泥沙输入导致 TSS 偏高,呈红色或橙色);min/max:根据研究区历史 TSS 数据或实测数据设定可视化阈值,确保浓度差异能通过颜色清晰区分(若阈值设置过大,会导致大部分区域颜色一致,无法体现空间差异)。
八、代码核心逻辑总结
- 数据准备:加载 Sentinel-2 标准化表面反射率数据,通过时间、空间、云量多条件筛选,结合云掩膜函数,得到高质量的有效影像集合;
- 基础可视化:生成真彩色合成影像,直观展示研究区地表覆盖,为 TSS 反演结果提供背景参考;
- TSS 反演:基于绿 - 红波段反射率比值的对数经验模型,计算研究区的 TSS 浓度影像;
- 结果展示:通过专属颜色渐变方案,将 TSS 浓度的空间分布可视化,助力水体环境分析(如识别 TSS 高值区、评估水质状况)。
本代码的核心优势在于 “数据筛选严格”(多条件去云、时空限制)和 “结果直观”(真彩色 + TSS 专题图对比),但需注意:经验模型具有区域局限性,若应用于其他区域,需重新拟合 TSS 反演公式中的系数。
九、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
1118

被折叠的 条评论
为什么被折叠?



