目录
一、基础设置模块:定义核心参数与研究范围
二、数据加载与 QA 预处理模块:筛选原始数据并消除无效值
三、日尺度合成模块:将多颗粒影像合并为日均值
四、时间序列图表模块:可视化 AOD 日均值变化趋势
五、地图可视化模块:展示 AOD 年均值空间分布
六、代码运行流程与依赖条件
七、关键注意事项与常见问题
八、代码应用场景与扩展方向
九、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
AOD(气溶胶光学厚度)是衡量大气中气溶胶对太阳辐射消减能力的核心指标,反映悬浮颗粒物的浓度、种类与垂直分布特征。它是全球气候模型、空气质量预警及卫星遥感定标的 key 参数,直接影响气溶胶辐射强迫效应评估和跨境污染追踪。MODIS MCD19A2 产品通过 MAIAC 算法提供 1 公里分辨率的 AOD 数据(如 0.47μm 和 0.55μm 波段),适用于年际变化分析。2000-2024 年中国 AOD 数据集显示,该指标在沙尘暴、霾污染等事件中呈现显著峰值,且城市区域常年高于农村。
本代码基于 Google Earth Engine(GEE)平台,实现了2024 年研究区 MODIS AOD(气溶胶光学厚度)数据的预处理、日尺度合成、时间序列分析与空间可视化。核心目标是从原始 MODIS 影像集中提取有效 AOD 数据,消除噪声和无效值,最终以图表和地图形式呈现研究区全年 AOD 的时间变化趋势和空间分布特征。
一、基础设置模块:定义核心参数与研究范围
初始化研究的空间范围、时间周期,为后续数据筛选提供基础条件。
- 若使用自有边界数据,需确保
table变量与导入的资产名称一致,且矢量数据的投影与后续影像投影兼容(默认 EPSG:4326)。 - 备用区域的
ADM2_NAME筛选条件需根据实际存在的行政单位名称修改(如替换为具体城市、区县名),否则会返回空集合。
// 研究区边界矢量(依赖外部导入资源) var ROI = table; // 备用测试区域(资源报错时启用) // var ROI = ee.FeatureCollection("FAO/GAUL/2015/level2") // .filter(ee.Filter.eq('ADM2_NAME', 'ROI')); // 设定时间范围:2024年全年 var start = ee.Date('2024-01-01'); var end = ee.Date('2024-12-31');- 研究区(ROI)定义:
- 主方式:直接使用外部导入的矢量数据(变量名
table),需用户提前上传自有研究区边界文件(如 Shapefile 转换的资产)。 - 备用方式:调用 GEE 内置的 FAO 全球行政边界数据集(2 级行政单位),通过筛选行政单位名称(
ADM2_NAME)获取测试区域,适用于无自有数据时的调试。
- 主方式:直接使用外部导入的矢量数据(变量名
- 时间范围设定:通过
ee.Date()函数定义 2024 年 1 月 1 日至 2024 年 12 月 31 日的完整时间序列,为后续数据的时间筛选划定范围。
二、数据加载与 QA 预处理模块:筛选原始数据并消除无效值
加载 MODIS AOD 原始影像集,通过质量控制(QA)掩膜、数据缩放等操作,筛选出高质量的 AOD 有效数据,剔除云污染、低质量观测值。
- MODIS AOD 数据的 QA 波段采用位编码存储质量信息,需通过按位运算解析;不同数据集的 QA 编码规则不同,需参考对应数据集的产品说明文档。
- 缩放系数是遥感数据的常见处理步骤,目的是在有限的存储空间内保留数据精度,需严格按照数据集说明设置(不可随意修改)。
// 加载MODIS AOD数据(MCD19A2_GRANULES V061) var rawCollection = ee.ImageCollection("MODIS/061/MCD19A2_GRANULES") .filterBounds(ROI) // 空间筛选:研究区范围 .filterDate(start, end); // 时间筛选:2024年 // 预处理函数:去云 + 缩放 + 质量控制 var preprocess = function(img) { // 选择AOD波段(0.47μm光学厚度) var aod = img.select('Optical_Depth_047'); // 选择QA波段(质量控制) var qa = img.select('AOD_QA'); // QA掩膜:保留Best(0)和Good(1)等级的数据 var qualityMask = qa.bitwiseAnd(7).lte(1); // 数据处理:缩放系数(0.001) + 质量掩膜 + 保留时间属性 return aod .multiply(0.001) // 缩放至实际值 .updateMask(qualityMask) // 应用质量掩膜 .copyProperties(img, ['system:time_start']); // 保留原始时间属性 }; // 应用预处理函数到整个影像集 var processedCol = rawCollection.map(preprocess);- 原始数据加载:
- 数据集选择:加载 MODIS 传感器的 MCD19A2_GRANULES V061 版本数据集,该数据集提供 500m 分辨率的气溶胶光学厚度产品,核心波段为
Optical_Depth_047(0.47μm 波长的 AOD 值,对近地面气溶胶敏感)。 - 双重筛选:通过
filterBounds(ROI)筛选研究区范围内的影像(剔除研究区外数据,减少计算量);通过filterDate(start, end)筛选 2024 年的影像(匹配设定的时间范围)。
- 数据集选择:加载 MODIS 传感器的 MCD19A2_GRANULES V061 版本数据集,该数据集提供 500m 分辨率的气溶胶光学厚度产品,核心波段为
- 预处理函数(preprocess):
- 波段选择:分别提取 AOD 核心波段(
Optical_Depth_047)和质量控制波段(AOD_QA)。 - 质量掩膜(QA Mask):
qa.bitwiseAnd(7):对 QA 波段进行按位与运算(7 的二进制为111),提取 QA 波段中代表质量等级的低 3 位信息。.lte(1):保留质量等级≤1 的数据(即 “最佳”(0 级)和 “良好”(1 级)数据),剔除 “中等”(2 级)、“差”(3 级)及无效等级(4-7 级)的数据,实现去云、去噪声。
- 数据缩放:原始 AOD 数据以整数形式存储,缩放系数为 0.001,通过
multiply(0.001)将数据转换为实际的光学厚度值(范围通常为 0-5,值越大表示气溶胶浓度越高)。 - 属性保留:通过
copyProperties()保留原始影像的时间戳属性(system:time_start),为后续日合成提供时间依据。
- 波段选择:分别提取 AOD 核心波段(
- 函数应用:通过
map(preprocess)将预处理函数批量应用于原始影像集,生成高质量的 AOD 影像集(processedCol)。
三、日尺度合成模块:将多颗粒影像合并为日均值
由于原始 MODIS 影像为 “颗粒”(Granule)级数据(单天内可能有多个影像覆盖研究区),需通过日合成将单天内的所有有效影像合并为 1 个日均值影像,最终生成 365 个(最多)日尺度 AOD 数据。
- 日合成的核心是 “时间窗口筛选 + 空间统计”,通过固定单日时间窗口,对窗口内的所有有效影像进行均值统计,实现数据的时间尺度聚合。
- 重投影步骤是 GEE 中避免 “投影不匹配” 错误的关键,尤其是当原始影像投影与地图显示投影不一致时,需统一为常用投影(如 EPSG:4326)。
// 计算总天数 var dayDiff = end.difference(start, 'day'); // 生成日期偏移序列(0,1,2,...,364) var dayList = ee.List.sequence(0, dayDiff.subtract(1)); // 循环每一天,计算当日AOD平均值 var dailyCollection = ee.ImageCollection.fromImages( dayList.map(function(dayOffset) { // 计算当前日期和次日日期 var currentDay = start.advance(dayOffset, 'day'); var nextDay = currentDay.advance(1, 'day'); // 筛选当天的所有影像 var dailyImages = processedCol.filterDate(currentDay, nextDay); // 计算日均值 + 重投影 + 设置属性 return dailyImages .mean() // 计算当日所有有效影像的平均值 .reproject({crs: 'EPSG:4326', scale: 1000}) // 统一投影和分辨率 .set('system:time_start', currentDay.millis()) // 设置时间戳 .set('date_string', currentDay.format('YYYY-MM-dd')); // 设置日期字符串 }) ); // 过滤掉完全无数据的天数(避免空值影像) dailyCollection = dailyCollection.filter( ee.Filter.listContains('system:band_names', 'Optical_Depth_047') ); // 打印结果:合并后的有效日数据量 print('合并后的日数据量 (应≤365):', dailyCollection.size());- 日期序列生成:
end.difference(start, 'day'):计算时间范围内的总天数(2024 年为 366 天?实际代码中按差值计算,若为平年则 365 天)。ee.List.sequence(0, dayDiff.subtract(1)):生成 0 到(总天数 - 1)的整数序列,每个数字代表相对于起始日期的偏移天数(如 0 代表 2024-01-01,1 代表 2024-01-02)。
- 日合成循环:
- 日期计算:通过
start.advance(dayOffset, 'day')计算当前偏移天数对应的日期(currentDay),并定义次日日期(nextDay),用于筛选单天影像(GEE 的filterDate为左闭右开区间)。 - 单日影像筛选:通过
filterDate(currentDay, nextDay)从预处理后的影像集中提取当前天的所有有效影像(dailyImages)。 - 日均值计算:通过
mean()对单日所有影像的 AOD 值取平均,得到当日的 AOD 日均值(若单天无有效影像,会生成空影像)。 - 重投影与分辨率统一:通过
reproject()将日均值影像统一投影为 EPSG:4326(WGS84 经纬度投影),分辨率设置为 1000m(高于原始 500m,平衡精度与计算效率),避免后续可视化和分析时出现投影不匹配错误。 - 属性设置:为日均值影像添加时间戳(
system:time_start,以毫秒为单位)和日期字符串(date_string,格式为 YYYY-MM-dd),方便后续图表生成和数据筛选。
- 日期计算:通过
- 空值过滤:通过
filter(ee.Filter.listContains('system:band_names', 'Optical_Depth_047'))筛选出包含有效 AOD 波段的影像,剔除单天无有效数据的空影像(如持续阴雨天气导致无观测数据的日期)。 - 结果打印:通过
print()在 GEE 控制台输出有效日数据量,用于验证合成结果(正常情况下应≤365/366 天)。
四、时间序列图表模块:可视化 AOD 日均值变化趋势
基于日合成后的影像集,生成研究区 2024 年 AOD 日均值的时间序列折线图,直观展示全年气溶胶浓度的变化趋势(如季节波动、峰值时段等)。
- 折线的高低对应 AOD 值大小:峰值越高表示当日气溶胶浓度越高(可能与雾霾、沙尘、秸秆焚烧等事件相关)。
- 折线的连续性:若出现较长时间的断档,可能是该时段研究区持续阴雨(云覆盖导致无有效数据)或传感器故障。
var chart = ui.Chart.image.series({ imageCollection: dailyCollection, // 日均值影像集 region: ROI, // 分析区域:研究区 reducer: ee.Reducer.mean(), // 区域统计方式:平均值 scale: 1000, // 空间分辨率:1000m xProperty: 'system:time_start' // X轴:时间 }).setOptions({ title: '研究区 2024 年 AOD 日均值趋势 (已去云处理)', vAxis: {title: 'AOD 值 (光学厚度)'}, hAxis: {title: '日期', format: 'MM-dd'}, lineWidth: 1.5, pointSize: 3, series: {0: {color: '#d63031'}}, // 红色折线 legend: {position: 'none'} // 隐藏图例(单系列) }); // 打印图表到控制台 print(chart);- 图表生成:
- 函数选择:使用
ui.Chart.image.series()生成时间序列图表,该函数专门用于处理影像集的时间序列数据,支持区域统计和可视化配置。 - 核心参数:
imageCollection:输入的日均值影像集(dailyCollection)。region:统计区域(研究区ROI),函数会自动对该区域内的 AOD 值进行统计。reducer:区域统计方法,此处使用ee.Reducer.mean()计算研究区内的 AOD 平均值(也可选择最大值、最小值、中位数等)。scale:统计时的空间分辨率(需与影像重投影后的分辨率一致,避免采样错误)。xProperty:X 轴的时间属性,对应影像的system:time_start字段。
- 函数选择:使用
- 图表样式配置:
- 标题与轴标签:设置图表标题(明确研究区、年份、数据类型)、Y 轴标签(AOD 值,光学厚度)、X 轴标签(日期,格式为月 - 日)。
- 视觉样式:折线宽度 1.5px、数据点大小 3px,折线颜色设置为红色(
#d63031),隐藏图例(因仅单系列数据,无需图例)。
- 图表输出:通过
print(chart)将图表打印到 GEE 控制台,用户可在控制台查看、下载(支持 PNG、CSV 格式)图表。
五、地图可视化模块:展示 AOD 年均值空间分布
计算 2024 年研究区 AOD 年平均值,通过地图可视化展示气溶胶浓度的空间分布特征(如高值区、低值区的空间格局)。
- 若研究区 AOD 值整体偏低(如多为 0-0.5),可缩小
min/max范围(如 0-0.5),增强空间差异的辨识度;若存在高值区,需扩大max值,避免高值区被统一显示为红色(无法区分差异)。 - 边界图层的颜色和透明度可调整,建议选择与 AOD 图层颜色对比度高的颜色(如黑色、白色),避免遮挡 AOD 空间分布信息。
// 计算2024年AOD年平均值并裁剪到研究区范围 var aodYearlyMean = dailyCollection.mean().clip(ROI); // 可视化参数设置 var vizParams = { min: 0, // 最小值 max: 1.0, // 最大值 palette: [ // 颜色渐变:蓝→青→黄→红 '#0000ff', '#00ffff', '#ffff00', '#ff0000' ] }; // 设置地图显示 Map.centerObject(ROI, 8); // 居中显示研究区(缩放级别8) Map.addLayer(aodYearlyMean, vizParams, '2024 年平均 AOD'); // 图层名称 Map.addLayer( ROI, {color: 'black', fillColor: '00000000'}, // 黑色边界,透明填充 '研究区行政边界' );- 年均值计算与裁剪:
dailyCollection.mean():对所有日均值影像取平均,得到 2024 年 AOD 年平均值影像。.clip(ROI):将年均值影像裁剪到研究区范围,剔除研究区外的无效数据,使可视化结果更清晰。
- 可视化参数配置(vizParams):
min/max:数据显示范围(0-1.0),超出该范围的值会被拉伸到对应极值颜色(可根据研究区实际 AOD 范围调整,如污染严重区域可设为 0-2.0)。palette:颜色渐变方案,从蓝色(低 AOD,清洁大气)→青色→黄色→红色(高 AOD,污染严重),符合常规遥感影像的可视化逻辑(人眼对渐变颜色的辨识度更高)。
- 地图显示设置:
Map.centerObject(ROI, 8):将地图中心定位到研究区,缩放级别设为 8(可根据研究区大小调整:区域越大,缩放级别越小;区域越小,缩放级别越大,建议范围 6-12)。Map.addLayer():添加两个图层:- AOD 年均值图层:使用上述可视化参数,图层名称为 “2024 年平均 AOD”。
- 研究区边界图层:黑色边界线(
color: 'black'),透明填充(fillColor: '00000000',前 6 位为 RGB 颜色,后 2 位为透明度,00 表示完全透明),图层名称为 “研究区行政边界”,用于标识分析范围。
六、代码运行流程与依赖条件
运行流程:1.定义研究区和时间范围→2.加载原始 MODIS AOD 数据并筛选时空范围→3.预处理(质量控制 + 缩放 + 去无效值)→4.日尺度合成(生成日均值影像集)→5.生成时间序列图表→6.计算年均值并可视化到地图。
依赖条件:
- 平台依赖:需在 Google Earth Engine 平台运行(需注册 GEE 账号,且账号已开通访问权限)。
- 数据依赖:
- 自有研究区边界数据(矢量格式,如 Shapefile、GeoJSON),或使用 GEE 内置行政边界数据集。
- MODIS MCD19A2_GRANULES V061 数据集(GEE 内置,无需额外上传,但需确保网络可访问 GEE 数据目录)。
- 环境依赖:需保证网络稳定(数据加载和计算需联网),浏览器支持 GEE 的前端交互(推荐 Chrome、Firefox)。
七、关键注意事项与常见问题
关键注意事项:
- 数据路径与变量名一致性:自有研究区数据的导入名称需与
table变量一致,否则会报 “变量未定义” 错误。 - 质量控制参数不可随意修改:QA 波段的按位运算逻辑(
bitwiseAnd(7).lte(1))是基于 MCD19A2 数据集的质量编码规则,修改后会导致无效数据筛选错误。 - 分辨率与投影匹配:重投影的
scale参数需与后续图表统计、地图可视化的scale一致,避免因分辨率不匹配导致的统计偏差。
常见问题:
- 日数据量远小于 365:可能是研究区全年云覆盖较多(如热带雨林、多雨地区),或 QA 筛选条件过严(可适当放宽至
lte(2),即包含 “中等” 质量数据,但需注明数据质量)。 - 地图无显示:检查研究区边界是否有效(可通过
print(ROI)验证是否为空集合),或 AOD 年均值影像是否全为无数据(可通过print(aodYearlyMean)查看影像信息)。 - 图表报错:多为时间属性缺失,需确保预处理步骤中
copyProperties(img, ['system:time_start'])未遗漏,且日合成时正确设置了system:time_start属性。
八、代码应用场景与扩展方向
应用场景:
- 区域气溶胶污染长期监测(如城市全年雾霾天数统计、沙尘天气影响范围分析)。
- 生态环境评估(如气溶胶对植被光合作用的影响、大气能见度关联分析)。
- 气候与大气科学研究(如气溶胶季节变化规律、与降水 / 风速的相关性分析)。
扩展方向:
- 时间尺度扩展:将日合成改为月合成、季合成(修改
ee.List.sequence的时间步长,如按月偏移),分析更长周期的变化趋势。 - 空间统计扩展:增加分区统计(如按研究区内的行政单元、土地利用类型统计 AOD 均值),使用
ee.FeatureCollection.map()实现。 - 多数据源融合:结合其他卫星 AOD 数据(如哨兵 - 5P、VIIRS),对比不同传感器的观测结果。
- 异常值分析:通过统计方法(如标准差、箱线图)识别 AOD 高值异常天数,结合气象数据、人为活动数据(如秸秆焚烧火点、工业排放数据)分析异常原因。
九、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!