目录
[三、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 = table:roi(Region of Interest,感兴趣区域)是核心空间参数,此处赋值为预先导入 GEE 平台的矢量数据集(通常为 Shapefile 格式转换后的 FeatureCollection),代表研究的地理范围。Map.addLayer(roi, {}, "研究区"):将研究区矢量边界添加到 GEE 地图界面,第三个参数为图层命名,方便在地图控制面板中识别。Map.centerObject(roi, 7):设置地图视角,以研究区为中心显示,第二个参数 "7" 为缩放级别(GEE 缩放级别 1-20,数值越小视野越广,此处适合区域尺度显示)。
- 时间范围限定 :定义
start2019和end2019两个时间变量,明确数据获取的时间窗口为 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:颜色映射的数值范围,即浓度从min到max对应调色板的完整渐变。不同污染物的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月气溶胶中位值变化
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!