MCD19A2 Python 处理

# 处理MCD19A2数据需要一定的数据处理和编程能力,需要一定的学习和实践。如果您对Python基础没有很好的掌握,建议您先学习一些Python基础知识,例如变量、条件语句、循环、函数、列表和字典等,然后再逐步学习如何使用Python处理遥感数据。以下是处理MCD19A2数据的大致步骤:

# 1.导入Python库和模块,例如numpy、pandas和gdal等。
# 2.打开MCD19A2数据文件,使用gdal库读取数据集。
# 3.读取数据集中的时间、经度、纬度和AOD等数据,并将其保存到numpy数组或pandas数据框中。
# 4.对AOD数据进行质量控制,去除质量较差的数据,例如AODQA值低于某一阈值的数据。
# 5.将处理后的数据保存为文本文件或其他格式的数据文件,例如CSV、NetCDF等。
# 以下是一个处理MCD19A2数据的Python代码示例:

from osgeo import gdal
import numpy as np
import pandas as pd
import time

#将QA字段十进制转化为二进制  在进行位掩码运算
def convert_two(ten):
    '''数组十进制转二进制'''#转为二进制掩膜矩阵  最好质量为1 最差质量为0 进行掩膜
    two='{:0>16}'.format(str(bin(ten)[2:]))
    Best_quality=two[-12:-8]
    if Best_quality=='0000':
        result=int(1) 
    else:
        result=int(0)
    return result

# 打开MCD19A2数据文件
hdf_path=r'MCD19A2.A2023048.h33v11.006.2023050090446.hdf'
dataset = gdal.Open(hdf_path)#"MCD19A2.A2018001.h27v05.006.2018011223007.hdf"
# 读取AOD数据
SubDatasets=dataset.GetSubDatasets()#数据子集
# print(SubDatasets)
aod_band = SubDatasets[1][0]#grid1km:Optical_Depth_055 气溶胶550字符串
# print(aod_band)

#其中有多个波段 (4,1200,1200) 四是代表波段号
#以第一个波段为例
aod_dataset=gdal.Open(aod_band)
aod_data = np.array(aod_dataset.GetRasterBand(1).ReadAsArray())#1代表第一波段 从1开始 
# print(aod_data)

aodqa_band=SubDatasets[5][0]
# print(aodqa_band)
aodqa_dataset=gdal.Open(aodqa_band)
aodqa_data = np.array(aodqa_dataset.GetRasterBand(1).ReadAsArray())#1代表第一波段 从1开始 
# print(aodqa_data)

#对aod_data做质量控制
function_vector = np.vectorize(convert_two)#对矩阵做函数运算
mask_array=function_vector(aodqa_data)#转为二进制掩膜矩阵0-1矩阵
aod_qa_array=aod_data*mask_array#AOD*掩膜矩阵0-1矩阵
# print(aodqa_data)


#读取时间
Orbit_time_stamp=dataset.GetMetadata()['Orbit_time_stamp']#卫星白天过境时间
# print(Orbit_time_stamp)

Orbit_time_stamp_list=Orbit_time_stamp.split()#以空格分隔
# print(Orbit_time_stamp)

#读取波段1的时间
data_time=Orbit_time_stamp_list[0]
# print(data_time)

#判断是 Aqua Terra
if data_time.endswith('T'):#结尾是T 结尾
    print('Terra')
else:
    print('Aqua')


#时间读取转换
# 将字符串时间转换成时间组后在将其转换成时间戳格式
str_time=data_time[:-1]
# print(str_time) 
#'20230480210A' 
strptime=time.strptime(str_time,'%Y%j%H%M')#字符串转化为时间戳
# print(strptime)
# year=strptime.tm_year
# month=strptime.tm_mon
# mday=strptime.tm_mday
# hour=strptime.tm_hour
# mins=strptime.tm_min

#时间戳转为日期
time_list= time.strftime("%Y-%m-%d %H:%M:%S", strptime)
#print(time_list)

print(time_list, aod_data.flatten(),aodqa_data.flatten())

由于HDF文件里并没有直接给出经纬度信息, 但有相关的投影信息可以转换为sin 正弦投影,代码如下:

def HDF_to_GeoTiff(hdf_file_path,geotiff_outpath):
    dataset = gdal.Open(hdf_file_path)#打开文件
    subdatasets = dataset.GetSubDatasets()#获得子数据集
    str_Optical_Depth_055 = subdatasets[1][0]  # 气溶胶字符串
    aod_dataset=gdal.Open(str_Optical_Depth_055)#打开文件
    #aod_dataset = gdal.Open(path)
    im_width = aod_dataset.RasterXSize #栅格矩阵的列数
    im_height = aod_dataset.RasterYSize #栅格矩阵的行数
    im_bands = aod_dataset.RasterCount#栅格波段数
    im_geotrans=aod_dataset.GetGeoTransform()#获得仿射矩阵
    im_pro=aod_dataset.GetProjection()##获得空间投影
    driver = gdal.GetDriverByName('GTiff')
    #driver.CreateCopy(geotiff_outpath, aod_dataset)#, callback=progress, options=["TILED=YES", "COMPRESS=LZW"]
    dataset1=driver.Create(geotiff_outpath, im_width, im_height, im_bands, gdal.GDT_Int16)
    dataset1.SetGeoTransform(im_geotrans)  # 写入仿射变换参数
    dataset1.SetProjection(im_pro)  # 写入投影
    for num in range(im_bands):
        im_array=aod_dataset.GetRasterBand(num+1).ReadAsArray()
        im_array=im_array.astype(float)
        im_array[im_array<=0]=np.nan
        im_array[im_array>=5000]=np.nan
        im_array=np.nan_to_num(im_array)
        # print(im_array)
        dataset1.GetRasterBand(num+1).WriteArray(im_array)
        dataset1.GetRasterBand(num+1).SetNoDataValue(0)
        dataset1.GetRasterBand(num+1).FlushCache()
        dataset1.GetRasterBand(num+1).ComputeStatistics(False)#计算每个波段的统计数据 
        dataset1.BuildOverviews('average', [2,4,8,16,32])#创建概视图
    del dataset
    del aod_dataset
    del dataset1
    return geotiff_outpath +' ok !'

hdf_file_path=r'MCD19A2.A2023048.h33v11.006.2023050090446.hdf'
geotiff_outpath= r'MCD19A2.A2023048.h33v11.006.2023050090446_geo.tif'
HDF_to_GeoTiff(hdf_file_path,geotiff_outpath) #转化为sin 投影

希望以上能给大家带来帮助!