基于 GEE 使用 Sentinel-5P 数据实现研究区多种大气污染物(SO₂、NO₂、CO、气溶胶)监测

目录

一、前言

二、研究区与时间基础设置

[三、Sentinel-5P 数据集配置](#三、Sentinel-5P 数据集配置)

四、影像集合获取函数定义与调用

五、数据预处理:中位数计算与裁剪

六、空间可视化配置

七、时间序列统计与图表生成

八、代码特点与注意事项

九、运行结果


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

本代码基于 Google Earth Engine(GEE)平台开发,核心用途是获取 2019 年 4 月指定研究区域内的 4 种大气污染物(SO₂、NO₂、CO、吸收性气溶胶)的 Sentinel-5P 卫星遥感数据,通过数据筛选、预处理、统计分析和可视化,最终呈现污染物的空间分布特征与时间序列变化规律,为大气环境质量分析提供数据支撑。

一、前言

卫星遥感技术的发展,为区域大气污染的监测提供了先进的手段。相比传统地面监测站点,卫星观测具有高空间覆盖度、连续时间序列、可跨区域比较等优势。其中,欧洲航天局(ESA)于2017年发射的 Sentinel-5P 卫星,搭载高光谱成像仪 TROPOMI,可监测多种大气痕量气体,如二氧化氮(NO₂)、二氧化硫(SO₂)、一氧化碳(CO)及气溶胶(Aerosol),成为全球空气质量监测的重要数据源。本文分享利用 Sentinel-5P 多源大气产品,分析SO₂、NO₂、CO 及气溶胶指数(AAI)的空间分布与时间变化特征。

Sentinel-5 Precursor(简称 Sentinel-5P)是欧洲哥白尼计划中首颗专注大气监测的卫星,于 2017 年 10 月发射。其核心载荷为TROPOMI(TROPOspheric Monitoring Instrument),能在光谱范围270--2380 nm进行观测,每日覆盖地球一次,空间分辨率约为7 km × 3.5 km(2019年后升级至5.5 km × 3.5 km),Sentinel-5P 可提供包括以下产品:

|---------------------|-------------------------------|-------------|---------------------------|
| 产品名称 | 产品ID | 观测目标 | 常用波段/变量 |
| SO₂(硫氧化物) | COPERNICUS/S5P/OFFL/L3_SO2 | 工业排放、燃煤污染 | SO2_column_number_density |
| NO₂(氮氧化物) | COPERNICUS/S5P/OFFL/L3_NO2 | 交通污染、化石燃料燃烧 | NO2_column_number_density |
| CO(一氧化碳) | COPERNICUS/S5P/OFFL/L3_CO | 燃烧产物、能源活动 | CO_column_number_density |
| AER_AI(气溶胶吸收指数) | COPERNICUS/S5P/OFFL/L3_AER_AI | 沙尘、烟雾、颗粒物浓度 | absorbing_aerosol_index |
[Sentinel-5P产品数据]

Sentinel-5P NRTI SO2:近实时二氧化硫
Sentinel-5P NRTI NO2:近实时二氧化氮监测
Sentinel-5P NRTI CO:近实时一氧化碳
Sentinel-5P NRTI AER AI:近实时紫外线气溶胶指数

二、研究区与时间基础设置

javascript 复制代码
var roi = table;
Map.addLayer(roi, {}, "研究区");
Map.centerObject(roi, 7);
var start2019 = "2019-04-01";
var end2019 = "2019-05-01";
  • 研究区定义与加载
    • var roi = tableroi(Region of Interest,感兴趣区域)是核心空间参数,此处赋值为预先导入 GEE 平台的矢量数据集(通常为 Shapefile 格式转换后的 FeatureCollection),代表研究的地理范围。
    • Map.addLayer(roi, {}, "研究区"):将研究区矢量边界添加到 GEE 地图界面,第三个参数为图层命名,方便在地图控制面板中识别。
    • Map.centerObject(roi, 7):设置地图视角,以研究区为中心显示,第二个参数 "7" 为缩放级别(GEE 缩放级别 1-20,数值越小视野越广,此处适合区域尺度显示)。
  • 时间范围限定 :定义start2019end2019两个时间变量,明确数据获取的时间窗口为 2019 年 4 月 1 日至 5 月 1 日(GEE 中时间筛选为左闭右开区间,实际包含 4 月整月数据),确保数据的时间统一性。

三、Sentinel-5P 数据集配置

javascript 复制代码
var products = {
  SO2: {id: "COPERNICUS/S5P/OFFL/L3_SO2", band: "SO2_column_number_density"},
  NO2: {id: "COPERNICUS/S5P/OFFL/L3_NO2", band: "NO2_column_number_density"},
  CO:  {id: "COPERNICUS/S5P/OFFL/L3_CO", band: "CO_column_number_density"},
  Aerosol: {id: "COPERNICUS/S5P/OFFL/L3_AER_AI", band: "absorbing_aerosol_index"}
};
  • 数据集组织方式 :采用 JavaScript 对象products统一管理 4 种污染物的数据集信息,每个污染物作为对象的一个属性,属性值包含两个关键参数,结构清晰,便于后续调用和维护。
  • 关键参数说明
    • id:GEE 平台中 Sentinel-5P 数据集的唯一标识符,用于定位具体产品。Sentinel-5P 是欧盟哥白尼计划下的大气监测卫星,L3 级产品为经过预处理的全球栅格数据,精度适合区域尺度分析。
    • band:目标数据波段名称,对应污染物的核心观测指标:
      • SO₂、NO₂、CO 的波段均为 "column_number_density"(柱浓度),单位通常为 mol/m²,反映大气中该污染物的垂直累积含量;
      • 气溶胶的波段为 "absorbing_aerosol_index"(吸收性气溶胶指数),是无量纲指标,用于表征吸收性气溶胶(如黑碳)的存在和相对浓度。

四、影像集合获取函数定义与调用

javascript 复制代码
function getCollection(productInfo, start, end) {
  return ee.ImageCollection(productInfo.id)
    .filterDate(start, end)
    .select(productInfo.band)
    .filterBounds(roi);
}
var y2019_SO2 = getCollection(products.SO2, start2019, end2019);
// 其余3种污染物集合获取逻辑一致,略去重复代码
  • 函数设计目的 :定义getCollection函数封装数据筛选的重复逻辑,避免代码冗余,提高可复用性。函数接收 3 个参数:productInfo(污染物数据集信息)、start(起始时间)、end(结束时间)。
  • 数据筛选流程
    • ee.ImageCollection(productInfo.id):根据数据集 ID 创建影像集合(ImageCollection),影像集合是 GEE 中管理时序遥感影像的核心数据结构,包含多幅同一区域、不同时间的影像。
    • .filterDate(start, end):按时间窗口筛选影像,仅保留指定时间段内的影像,剔除无关时间数据。
    • .select(productInfo.band):选择目标波段,只保留污染物浓度相关的波段,排除数据集中原有的辅助波段(如质量控制波段),减少数据处理量。
    • .filterBounds(roi):按空间范围筛选,仅保留与研究区有交集的影像,确保数据聚焦于目标区域。
  • 函数调用 :通过传入不同污染物的products属性和统一的时间变量,分别获取 4 种污染物的 2019 年 4 月影像集合(如y2019_SO2为 SO₂的影像集合)。

五、数据预处理:中位数计算与裁剪

javascript 复制代码
function medianClip(collection) {
  return collection.median().clip(roi);
}
var y2019_SO2_clipped = medianClip(y2019_SO2);
// 其余3种污染物预处理逻辑一致,略去重复代码
  • 预处理目的:将时序影像集合转换为单幅空间分布图,突出时间窗口内的污染物平均水平(此处用中位数更能抵抗异常值影响)。
  • 函数逻辑
    • collection.median():对影像集合中的所有影像计算中位数。中位数相较于平均值,受极端高值或低值的影响更小,能更稳健地反映该时间段内污染物的平均浓度水平。
    • .clip(roi):将计算得到的中位数影像按研究区边界裁剪,去除研究区外的无效数据,使结果更贴合研究范围。
  • 输出结果 :每个污染物最终得到一幅 "2019 年 4 月中位数浓度 + 研究区裁剪" 的单波段影像(如y2019_SO2_clipped),用于后续空间可视化。

六、空间可视化配置

javascript 复制代码
Map.addLayer(y2019_SO2_clipped, {min: 0, max: 0.001, palette: ['yellow', 'orange', 'red', 'purple', 'blue', 'cyan', 'white']}, "2019年4月 SO2");
Map.addLayer(y2019_NO2_clipped, {min: 0, max: 0.0002, palette: ['green', 'yellow', 'orange', 'red', 'purple', 'blue', 'white']}, "2019年4月 NO2");
// 其余2种污染物可视化逻辑类似,略去重复代码
  • 可视化核心参数 :通过Map.addLayer将预处理后的影像添加到地图,第二个参数为可视化配置对象,关键参数说明:
    • min/max:颜色映射的数值范围,即浓度从minmax对应调色板的完整渐变。不同污染物的min/max差异较大(如 SO₂为 0-0.001,NO₂为 0-0.0002),是根据各污染物的实际浓度量级设定,确保颜色区分度符合数据特征。
    • palette:颜色渐变序列,通过不同颜色表征浓度高低。例如 SO₂的调色板从黄色(低浓度)到红色、紫色(中高浓度)再到白色(极高浓度),直观反映空间分布差异。
  • 可视化意义:4 种污染物分别作为独立图层添加到地图,可通过地图控制面板的图层开关单独查看或叠加对比,清晰呈现研究区内各污染物的空间分布格局(如高浓度区集中位置、空间梯度变化等)。

七、时间序列统计与图表生成

javascript 复制代码
// 统计函数定义
function getStats(collection) {
  return collection.map(function(image) {
    var stats = image.reduceRegion({
      reducer: ee.Reducer.median(),
      geometry: roi,
      scale: 1000
    });
    return ee.Feature(null, stats).set('system:time_start', image.get('system:time_start'));
  });
}
// 特征集合生成
var feats2019_SO2 = getStats(y2019_SO2);
// 图表绘制函数
function makeChart(features, title, bandName) {
  return ui.Chart.feature.byFeature(features, 'system:time_start')
    .setSeriesNames([title])
    .setOptions({
      title: title,
      hAxis: {title: '日期'},
      vAxis: {title: bandName + ' 中位数'}
    });
}
// 图表打印
print(makeChart(feats2019_SO2, "2019年4月 SO2 中位值变化", "SO2"));
// 其余3种污染物图表生成逻辑一致,略去重复代码
  • 时间序列统计(getStats 函数)
    • 目的:对每幅时序影像计算研究区内的污染物中位数,将影像集合转换为包含 "时间 - 中位数" 对应关系的特征集合(FeatureCollection)。
    • 关键步骤:
      • collection.map(function(image) { ... }):遍历影像集合中的每一幅影像,对单幅影像执行统计操作。
      • image.reduceRegion(...):对影像的研究区范围进行区域统计,核心参数:
        • reducer: ee.Reducer.median():指定统计方法为中位数,与前文空间预处理的统计逻辑一致,保持数据一致性。
        • geometry: roi:统计的空间范围为研究区。
        • scale: 1000:统计的空间分辨率为 1000 米(即重采样到 1km 网格后计算),平衡计算效率与精度。
      • return ee.Feature(null, stats).set(...):将统计结果(中位数)作为属性创建空特征(Feature),并保留原影像的时间戳(system:time_start),使每个特征与具体日期对应。
  • 图表生成(makeChart 函数)
    • 目的:将特征集合中的 "时间 - 中位数" 数据转换为交互式折线图,直观展示污染物浓度的时间变化趋势。
    • 关键配置:
      • ui.Chart.feature.byFeature(features, 'system:time_start'):基于特征集合创建图表,x 轴为时间戳(自动转换为日期格式),y 轴为中位数数值。
      • setSeriesNames([title]):设置图表系列名称,与污染物对应。
      • setOptions(...):配置图表标题、x 轴标签(日期)、y 轴标签(污染物中位数),提升图表可读性。
  • 图表输出 :通过print(...)函数将图表打印到 GEE 的控制台,可查看 4 种污染物在 2019 年 4 月内的日度(或影像过境周期)中位数变化,分析浓度波动规律(如是否存在周期性变化、峰值出现时间等)。

八、代码特点与注意事项

代码特点:

  • 模块化设计:通过函数封装重复逻辑(如影像集合获取、预处理、图表生成),代码结构清晰,可维护性强,便于后续扩展(如增加污染物种类、调整时间范围)。
  • 数据处理严谨:采用中位数作为统计指标,减少异常值影响;统一空间分辨率和研究区范围,确保数据的可比性。
  • 结果呈现全面:同时输出空间分布图和时间序列图表,既展示污染物的空间分布差异,又反映时间变化趋势,满足多维度分析需求。
  • 适配 GEE 平台特性:充分利用 GEE 的影像集合、区域统计、可视化组件等核心功能,高效处理遥感大数据,无需本地算力支持。

注意事项:

  • 代码依赖预先导入 GEE 的研究区矢量数据(table),需确保矢量数据格式正确(FeatureCollection 类型),且投影与数据集一致。
  • 可视化参数(min/max、调色板)需根据污染物的实际浓度范围调整,若范围设置不当,可能导致颜色区分不明显,影响结果解读。
  • Sentinel-5P 的 L3 级产品存在数据缺失(如云层遮挡、仪器故障),可能导致部分日期无影像,图表中会出现断点,需在分析时结合数据质量报告考量。

九、运行结果

研究区范围(湖北省)
研究区2019年4月二氧化硫(SO₂)浓度计算结果可视化
研究区2019年4月二氧化氮(NO₂)浓度计算结果可视化
研究区2019年4月一氧化碳(CO)浓度计算结果可视化
研究区2019年4月气溶胶浓度计算结果可视化
控制台输出的相关信息
研究区2019年4月二氧化硫(SO₂)中位值变化
研究区2019年4月二氧化氮(NO₂)中位值变化
研究区2019年4月一氧化碳(CO)中位值变化
研究区2019年4月气溶胶中位值变化

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

相关推荐
九河云6 小时前
华为云 GaussDB 分布式架构解析:企业级数据库高可用与性能调优方案
分布式·架构·华为云·云计算·gaussdb
是Yu欸6 小时前
②【openFuyao】融合云原生与高性能计算
云原生·云计算·高性能计算·openfuyao
音沐mu.6 小时前
【33】人头数据集(有v5/v8模型)/YOLO人头检测
yolo·目标检测·计算机视觉·数据集·人头检测·人头数据集
AKAMAI20 小时前
无服务器计算架构的优势
人工智能·云计算
翼龙云_cloud1 天前
阿里云国际站渠道商:DDoS防护方案适合哪些类型的企业?
服务器·网络·阿里云·云计算·ddos
gaize12131 天前
服务器性能优化方式
服务器·云计算
打码人的日常分享1 天前
云计算大数据系统建设方案,私有云建设方案
运维·网络·安全·信息可视化·架构·云计算
数字时代全景窗1 天前
学习Palantir,对传统产业加速AI+有什么启示?(1)智能系统的“铁三角”
人工智能·学习·云计算·软件工程
月亮!1 天前
AI安全红线:模型投毒与防御策略全解读
java·网络·人工智能·python·测试工具·安全·云计算