使用 Google Earth Engine 监测乌代布尔的 NO2 月度趋势
在本博客中,我们将探讨如何使用 Google Earth Engine (GEE) 来监测指定地区的二氧化氮(NO₂)月度浓度趋势。通过整合遥感数据,我们可以分析不同年份的空气质量变化。
1. 定义感兴趣区域(AOI)
首先,我们需要定义我们的研究区域,这里我们选择的是乌代布尔。使用 GEE 的 FeatureCollection
来过滤出该地区的边界:
var aoi = ee.FeatureCollection("FAO/GAUL/2015/level2")
.filter(ee.Filter.eq('ADM2_NAME', 'Udaipur'));
Map.addLayer(aoi); // 将AOI添加到地图中
2. 创建月份名称列表
接下来,我们创建一个包含月份名称的列表,以便在后续的分析中使用:
var monthNames = ee.List(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']);
3. 定义年份范围
我们将分析从2019年到2024年的数据,创建一个年份序列:
var years = ee.List.sequence(2019, 2024); // 从2019到2024的年份序列
4. 定义处理每年的函数
我们需要一个函数来处理每年的数据,计算每个月的 NO₂ 平均值:
var getMonthlyNO2 = function(year){
year = ee.Number(year); // 将年份转换为数字
var start = ee.Date.fromYMD(year, 1, 1); // 年的开始日期
var end = start.advance(1, 'year'); // 年的结束日期
var collection = ee.ImageCollection("COPERNICUS/S5P/OFFL/L3_NO2")
.filterDate(start, end) // 过滤指定年份的数据
.filterBounds(aoi) // 过滤感兴趣区域内的数据
.select('NO2_column_number_density'); // 选择NO2浓度波段
var months = ee.List.sequence(1, 12); // 月份序列
var monthlyData = months.map(function(month){
var startMonth = ee.Date.fromYMD(year, month, 1); // 每个月的开始日期
var endMonth = startMonth.advance(1, 'month'); // 每个月的结束日期
var monthlyCollection = collection.filterDate(startMonth, endMonth); // 过滤每个月的数据
var monthlyMeanImage = monthlyCollection.mean(); // 计算每个月的平均图像
var meanDict = monthlyMeanImage.reduceRegion({
reducer: ee.Reducer.mean(), // 使用均值计算
geometry: aoi, // 在AOI区域内计算
scale: 10000, // 像素尺度
bestEffort: true, // 尽力而为
maxPixels: 1e13 // 最大像素数
});
var meanValue = ee.Number(meanDict.get('NO2_column_number_density')); // 获取NO2的平均值
// 将µmol/m²转换为µg/m³(通过乘以NO2的摩尔质量)
var meanValueInUGm3 = meanValue.multiply(46.0055);
// 将月份数字(1-12)转换为索引(0-11)以用于monthNames列表
var monthName = monthNames.get(ee.Number(month).subtract(1));
return ee.Algorithms.If(
meanValueInUGm3, // 如果有平均值
ee.Feature(null, { // 创建一个特征
'Month': month, // 月份
'MonthName': monthName, // 月份名称
'NO2': meanValueInUGm3, // NO2浓度
'Year': year // 年份
}),
null // 否则返回null
);
});
return ee.FeatureCollection(ee.List(monthlyData).filter(ee.Filter.notNull(['NO2']))) // 返回非空的特征集合
};
5. 对每个年份应用该函数
我们将上述函数应用于所有年份,并将结果扁平化为一个特征集合:
var allData = ee.FeatureCollection(years.map(getMonthlyNO2)).flatten(); // 扁平化所有数据
6. 生成 NO₂ 浓度趋势图表
最后,我们使用 GEE 的图表功能生成 NO₂ 月度趋势图:
var chart = ui.Chart.feature.groups({
features: allData, // 使用所有数据
xProperty: 'MonthName', // x轴属性为月份名称
yProperty: 'NO2', // y轴属性为NO2浓度
seriesProperty: 'Year' // 系列属性为年份
}).setChartType('LineChart') // 设置图表类型为折线图
.setOptions({
title: '每月NO2趋势 (µg/m³)', // 图表标题
hAxis: {
title: '月份', // x轴标题
slantedText: true // 斜体文本
},
vAxis: {title: 'NO2柱密度 (µg/m³)'}, // y轴标题
});
// 打印图表
print(chart);
总结
通过以上步骤,我们成功地使用 Google Earth Engine 提取并可视化了地区的 NO₂ 月度浓度趋势。这种分析方法可以帮助我们更好地理解空气质量的变化,为环境保护和政策制定提供支持。如果您对遥感数据分析感兴趣,欢迎尝试类似的方法!
全部代码
// 定义感兴趣区域(AOI) - 示例:印度拉贾斯坦邦乌代布尔
var aoi = ee.FeatureCollection("FAO/GAUL/2015/level2")
.filter(ee.Filter.eq('ADM2_NAME', 'Udaipur'));
Map.addLayer(aoi); // 将AOI添加到地图中
// 月份名称列表
var monthNames = ee.List(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']);
// 年份列表
var years = ee.List.sequence(2019, 2024); // 从2019到2024的年份序列
// 处理每年的函数
var getMonthlyNO2 = function(year){
year = ee.Number(year); // 将年份转换为数字
var start = ee.Date.fromYMD(year, 1, 1); // 年的开始日期
var end = start.advance(1, 'year'); // 年的结束日期
var collection = ee.ImageCollection("COPERNICUS/S5P/OFFL/L3_NO2")
.filterDate(start, end) // 过滤指定年份的数据
.filterBounds(aoi) // 过滤感兴趣区域内的数据
.select('NO2_column_number_density'); // 选择NO2浓度波段
var months = ee.List.sequence(1, 12); // 月份序列
var monthlyData = months.map(function(month){
var startMonth = ee.Date.fromYMD(year, month, 1); // 每个月的开始日期
var endMonth = startMonth.advance(1, 'month'); // 每个月的结束日期
var monthlyCollection = collection.filterDate(startMonth, endMonth); // 过滤每个月的数据
var monthlyMeanImage = monthlyCollection.mean(); // 计算每个月的平均图像
var meanDict = monthlyMeanImage.reduceRegion({
reducer: ee.Reducer.mean(), // 使用均值计算
geometry: aoi, // 在AOI区域内计算
scale: 10000, // 像素尺度
bestEffort: true, // 尽力而为
maxPixels: 1e13 // 最大像素数
});
var meanValue = ee.Number(meanDict.get('NO2_column_number_density')); // 获取NO2的平均值
// 将µmol/m²转换为µg/m³(通过乘以NO2的摩尔质量)
var meanValueInUGm3 = meanValue.multiply(46.0055);
// 将月份数字(1-12)转换为索引(0-11)以用于monthNames列表
var monthName = monthNames.get(ee.Number(month).subtract(1));
return ee.Algorithms.If(
meanValueInUGm3, // 如果有平均值
ee.Feature(null, { // 创建一个特征
'Month': month, // 月份
'MonthName': monthName, // 月份名称
'NO2': meanValueInUGm3, // NO2浓度
'Year': year // 年份
}),
null // 否则返回null
);
});
return ee.FeatureCollection(ee.List(monthlyData).filter(ee.Filter.notNull(['NO2']))) // 返回非空的特征集合
};
// 对每个年份应用该函数
var allData = ee.FeatureCollection(years.map(getMonthlyNO2)).flatten(); // 扁平化所有数据
// 生成包含月份NO2浓度的图表
var chart = ui.Chart.feature.groups({
features: allData, // 使用所有数据
xProperty: 'MonthName', // x轴属性为月份名称
yProperty: 'NO2', // y轴属性为NO2浓度
seriesProperty: 'Year' // 系列属性为年份
}).setChartType('LineChart') // 设置图表类型为折线图
.setOptions({
title: '每月NO2趋势 (µg/m³)', // 图表标题
hAxis: {
title: '月份', // x轴标题
slantedText: true // 斜体文本
},
vAxis: {title: 'NO2柱密度 (µg/m³)'}, // y轴标题
})
// 打印图表
print(chart);