AERONET 对比验证 MCD19A2 AOD 数据 (GEE代码)


前言

基于 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站点数据,筛选出需要验证的站点进行上传验证。例如:
所筛选AERONET 站点数据
在GEE 中上传所利用的数据即可。
上传csv
复制以下内容引用到自己的代码中。
在这里插入图片描述

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数据集进行了时空匹配及验证。
希望以上内容能给大家带来帮助!

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香橙橙V

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值