前言
基于 AERONET 站点观测数据对比验证 MCD19A2.061: Terra & Aqua MAIAC Land Aerosol Optical Depth Daily 1km 数据产品, 利用站点数据对卫星数据进行时空匹配。
一、时空匹配
由于 MODIS数据提供卫星过境时刻的区域性 AOD 值,而地面固定AERONET站点进行长时序连续观测.为保证地面站点与卫星数据的可比性,需要卫星和AERONET测量值在空间和时间上匹配。常采用Ichoku 等(2002)工作中使用的匹配策略,以 AERONET 站点为中心采用 50 km×50 km 的空间窗口计算卫星的 AOD 空间平均值,匹配地面观测点时间±30 min 地面 AOD 时间平均值。考虑到在多云或雪和冰的条件下反演性能无法代表匹配空间半径内的整体AOD,选取当匹配范围中有效像元≥40%作为匹配数据集进行验证分析。(Martins et al.,2017)
二、站点验证
1.上传 AERONET 站点数据
利用上一篇文章中所处理好的AERONET站点数据,筛选出需要验证的站点进行上传验证。例如:
在GEE 中上传所利用的数据即可。
复制以下内容引用到自己的代码中。
2.验证数据
代码如下(示例):
//引用站点数据
var table = ee.FeatureCollection( "projects/ee-cxgis001/assets/AOD20_Merger_2012_2023_CN" );
var table_szie = table.size()
print( table_szie ) //87173
var datalist = table.toList( table_szie );
// print(datalist)
//显示前十条
// var datalist = table.toList(10,0);
// print(datalist)
//提取站点平均值函数
var extract_value = ee.FeatureCollection( datalist.map( function ( element )
{
//利用站点的经纬度构建25km的圆形型缓冲区
var data = ee.Feature( element )
var site_point = ee.Geometry.Point( [ data.get( 'Site_Longitude(Degrees)' ), data.get( 'Site_Latitude(Degrees)' ) ] ) //point lon lat
var stations = [ ee.Feature( site_point ) ]
var bartStations = ee.FeatureCollection( stations );
var point_buffer = bartStations.map( function ( f )
{
return f.buffer( 25000 ); // 25km 缓冲区
} );
//时间格式筛选 ±30 分钟
var readableDate = ee.Date.parse( 'YYYY/MM/dd HH:mm', ee.String( data.get( 'Date' ) ) )
var star_Date = readableDate.advance( -30, 'minute' ) //minute
var end_Date = readableDate.advance( 30, 'minute' ) //minute
//筛选时空数据集
var MAIAC_ImageCollection = ee.ImageCollection( 'MODIS/061/MCD19A2_GRANULES' )
.filterBounds( point_buffer )
.filterDate( star_Date, end_Date )
//站点25km覆盖两个或多个图像取平均值
var MAIAC_Image = MAIAC_ImageCollection.mean()
//ImageCollection.size().gt(0) 判断是否有时空匹配数据集
var imageband_size = MAIAC_ImageCollection.size()
//true 匹配成功
var true_data = function ( data, MAIAC_ImageCollection )
{
var true_data = ee.Feature( data )
//QA
var QA_MAIAC_ImageCollection = MAIAC_ImageCollection.map( function ( img )
{
//bitmask
function bitwiseExtract ( value, fromBit, toBit )
{
if ( toBit === undefined ) toBit = fromBit
var maskSize = ee.Number( 1 )
.add( toBit )
.subtract( fromBit )
var mask = ee.Number( 1 )
.leftShift( maskSize )
.subtract( 1 )
return value.rightShift( fromBit )
.bitwiseAnd( mask )
}
//QA
var qa = img.select( "AOD_QA" );
var image = img.select( 'Optical_Depth_055' )
.multiply( 0.001 )
//Bits 8-11: QA for AOD
//0: Best quality
var qamask = bitwiseExtract( qa, 8, 11 )
.eq( 0 )
//aod550 mask
var aod550_mask = image.updateMask( qamask )
.rename( "Best_Aod550" )
// addBands
img = img.addBands( aod550_mask )
return img
} )
//对所选数据集选择最优质量数据集
var stats_image = QA_MAIAC_ImageCollection.mean() //stats
//Reduce
//计算未经过质量筛选数据集平均值
var Optical_Depth_055_mean = stats_image.select( "Optical_Depth_055" )
.multiply( 0.001 )
.reduceRegion(
{
reducer: ee.Reducer.mean(),
geometry: point_buffer,
scale: 1000,
maxPixels: 1e13,
bestEffort: true,
} );
//计算未经过质量筛选数据集范围中有效像元个数进行筛选
var Optical_Depth_055_count = stats_image.select( "Optical_Depth_055" )
.multiply( 0.001 )
.reduceRegion(
{
reducer: ee.Reducer.count(),
geometry: point_buffer,
scale: 1000,
maxPixels: 1e13,
bestEffort: true,
} );
//计算最好质量筛选数据集平均值
var Best_Aod550_mean = stats_image.select( "Best_Aod550" )
.reduceRegion(
{
reducer: ee.Reducer.mean(),
geometry: point_buffer,
scale: 1000,
maxPixels: 1e13,
bestEffort: true,
} );
//计算最好质量筛选数据集有效像元个数进行筛选
var Best_Aod550_count = stats_image.select( "Best_Aod550" )
.reduceRegion(
{
reducer: ee.Reducer.count(),
geometry: point_buffer,
scale: 1000,
maxPixels: 1e13,
bestEffort: true,
} );
//获取所需要的统计筛选属性
var get_mean = function ( data )
{
data = data.set(
{ //这里分别对两颗卫星类型 ('SATELLITE') TERRA(T) 和 AQUA(A) 进行站点验证
"Satellite_type": QA_MAIAC_ImageCollection.first()
.get( 'SATELLITE' ),
'Optical_Depth_055_mean': Optical_Depth_055_mean.get( 'Optical_Depth_055' ),
'Optical_Depth_055_count': Optical_Depth_055_count.get( 'Optical_Depth_055' ),
'Best_Aod550_mean': Best_Aod550_mean.get( 'Best_Aod550' ),
'Best_Aod550_count': Best_Aod550_count.get( 'Best_Aod550' ),
} )
//返回统计数据
return data
}
//判断条件 是否获取到空间上有效像元的平均值
var condition = ee.Algorithms.If(
Optical_Depth_055_mean.get( "Optical_Depth_055" ),
get_mean( true_data ),
null )
return condition
}
//对时空成功匹配到数据集进行判断
return ee.Algorithms.If( imageband_size.gt( 0 ), true_data( data, MAIAC_ImageCollection ), null )
} ) )
//输出测试数据
// var collection=ee.FeatureCollection(extract_value);
// print(collection)
//导出成功匹配结果为csv
Export.table.toDrive(
{
collection: extract_value,
description: 'AOD20_Merger_2012_2023_CN',
folder: 'AOD20_Merger_2012_2023_CN',
fileFormat: 'CSV'
} )
总结
文章主要通过GEE平台利用AERONET 站点数据对 MCD19A2 AOD数据集进行了时空匹配及验证。
希望以上内容能给大家带来帮助!