导读
在过去的几十年里,我们越来越多地接触到一系列监测地球大气成分的卫星传感器。然而,重要的是要注意,卫星测量的是对流层和平流层的污染物浓度,对流层和平流层在地球表面以上延伸许多公里。因此,卫星测量不一定代表人类在地面上接触到的浓度,因此不建议仅依靠卫星数据进行人类健康应用。然而,更复杂的方法将来自卫星遥感数据的信息、复杂的大气化学模型和地面监测仪相结合,以提供高可信度的地面污染物浓度。
主要内容
- 了解Sentinel-5P数据;
- 量化空气污染物浓度随时间的变化;
- 计算人口加权空气污染物浓度。
Section 1 数据导入与清洗
- 在GEE中有一系列基于卫星的空气污染数据集可供选择。
- Sentinel-5 于2017年10月发射,但是数据最早是2018年7月才可以用。
- TROPMI是Sentinel-5 卫星携带的传感,可以感应紫外线(ultraviolet)可见光(visible), 近红外(near-infrared), 短波红外(shortwave infrared wavelengths);
- 可用来监测大气中的NO2, O3, aerosol(气溶胶), methane (CH4), formaldehyde(甲醛),CO, and SO2 ;
- TROPOMI在地面上的条带宽度约为2600公里,可实现7 × 7公里的空间分辨率的全球日覆盖;
- 除CH4外,所有Sentinel-5P数据集都有两个版本:近实时(NRTI)和离线(OFFL);CH4仅有OFFL可用。
示例使用OFFL NO2产品。
代码中涉及到的数据集:
人口数量和密度数据集:(世界第 4 版网格化人口 (GPWv4) 修订版30 弧秒1公里格网)CIESIN/GPWv411/GPW_Population_Count;
(GEE中还有两个人口数据集 WorldPop和Global Human Settlement Layers)
全球行政单位层(GAUL)国家-省/州层面数据集:FAO/GAUL_SIMPLIFIED_500m/2015/level1
// 导入GAUL全球行政单元 1级产品
var adminUnits = ee.FeatureCollection( 'FAO/GAUL_SIMPLIFIED_500m/2015/level1');
// 根据自定义的(武汉)区域选择GAUL图层
var adminSelect = adminUnits.filterBounds(geometry);
// Center the map on this area.
Map.centerObject(adminSelect, 7);
// 设置地图显示选项指定了地图的底图样式。
//'HYBRID' 选项将地图显示为混合模式,即卫星图像和地图图层的组合.
//结合了卫星影像和地理信息,如道路、地名等
Map.setOptions('HYBRID');
Map.addLayer(adminSelect, {}, 'selected admin unit');
// 导入人口统计数据 Gridded Population of the World Version 4.
var population = ee.ImageCollection( 'CIESIN/GPWv411/GPW_Population_Count')
// Filter for 2020 using the calendar range function.
.filter(ee.Filter.calendarRange(2020, 2020, 'year'))
// There should be only 1 image, but convert to an image using .mean().
.mean();
// 根据区域裁剪人口数据
var populationClipped = population.clipToCollection(adminSelect);
// 将其添加到地图上以查看人口分布。
var popVis = {
min: 0,
max: 4000,
palette: ['black', 'yellow', 'white'],
opacity: 0.55
};
Map.addLayer(populationClipped, popVis, 'population count');
//=========================================================================================
//导入Sentinel-5P NO2离线产品
var no2Raw = ee.ImageCollection('COPERNICUS/S5P/OFFL/L3_NO2');
// 去云函数.
function maskClouds(image) {
// Get the cloud fraction band of the image.
var cf = image.select('cloud_fraction');
// Create a mask using 0.3 threshold.
var mask = cf.lte(0.3); // You can play around with this value.
// Return a masked image.
return image.updateMask(mask).copyProperties(image);
}
// Clean and filter the Sentinel-5P NO2 offline product.
var no2 = no2Raw
.filterBounds(adminSelect)
.map(maskClouds)
.select('tropospheric_NO2_column_number_density');
// 创建2021年3月的中值合成影像
var no2Median = no2.filterDate('2021-03-01', '2021-04-01').median();
var no2MedianClipped = no2Median.clipToCollection(adminSelect);
// Visualize the median NO2.
var no2Viz = {
min: 0,
max: 0.00015,
palette: ['black', 'blue', 'purple', 'cyan', 'green', 'yellow', 'red' ]
};
Map.addLayer(no2MedianClipped, no2Viz, 'median no2 Mar 2021');
Section 2 量化和可视化变化
测试一下看看我们是否能看到2020年COVID-19封锁期间二氧化氮浓度的变化。
将2020年3月(湖北省封城期间)二氧化氮浓度中值与2019年3月的二氧化氮浓度中值进行比较。
// Define a lockdown NO2 median composite.
var no2Lockdown = no2.filterDate('2020-03-01', '2020-04-01')
.median().clipToCollection(adminSelect);
// Define a baseline NO2 median using the same month in the previous year.
var no2Baseline = no2.filterDate('2019-03-01', '2019-04-01')
.median().clipToCollection(adminSelect);
// Create a ui map widget to hold the baseline NO2 image.
var leftMap = ui.Map().centerObject(adminSelect, 8).setOptions( 'HYBRID');
// Create ta ui map widget to hold the lockdown NO2 image.
var rightMap = ui.Map().setOptions('HYBRID');
// Create a split panel widget to hold the two maps.
var sliderPanel = ui.SplitPanel({
firstPanel: leftMap,
secondPanel: rightMap,
orientation: 'horizontal',
wipe: true,
style: {
stretch: 'both'
}
});
var linker = ui.Map.Linker([leftMap, rightMap]);
// Make a function to add a label with fancy styling.
function makeMapLab(lab, position) {
var label = ui.Label({
value: lab,
style: {
fontSize: '16px',
color: '#ffffff',
fontWeight: 'bold',
backgroundColor: '#ffffff00',
padding: '0px'
}
});
var panel = ui.Panel({
widgets: [label],
layout: ui.Panel.Layout.flow('horizontal'),
style: {
position: position,
backgroundColor: '#00000057',
padding: '0px'
}
});
return panel;
}
// Create baseline map layer, add it to the left map, and add the label.
var no2BaselineLayer = ui.Map.Layer(no2Baseline, no2Viz);
leftMap.layers().reset([no2BaselineLayer]);
leftMap.add(makeMapLab('Baseline 2019', 'top-left'));
// Create lockdown map layer, add it to the right map, and add the label.
var no2LockdownLayer = ui.Map.Layer(no2Lockdown, no2Viz);
rightMap.layers().reset([no2LockdownLayer]);
rightMap.add(makeMapLab('Lockdown 2020', 'top-right'));
// Reset the map interface (ui.root) with the split panel widget.
// Note that the Map.addLayer() calls earlier on in Section 1
// will no longer be shown because we have replaced the Map widget
// with the sliderPanel widget.
ui.root.widgets().reset([sliderPanel]);
对比分块图中的两幅图,发现封锁期间二氧化氮浓度有所下降