Python将MCD19A2气溶胶HDF数据3D数组转换为带坐标的DataFrame
MCD19A2栅格数组转带坐标DataFrame Python实现
承接你已有的代码,不需要生成临时TIFF文件,直接基于GDAL读取的地理变换参数和数组即可完成转换,全程在内存中处理,内存占用远低于R语言方案。
# 承接你已有的代码 from osgeo import gdal, osr import pandas as pd import numpy as np # 你已完成的读取步骤 rds = gdal.Open("MCD19A2.A2006001.h26v04.006.2018036214627.hdf") names = rds.GetSubDatasets() aod_047 = gdal.Open(names[0][0]) a47 = aod_047.ReadAsArray() # 取你需要的时间/轨道切片,这里取索引为1的切片 target_aod = a47[1] n_rows, n_cols = target_aod.shape # 1. 获取栅格地理变换参数 gt = aod_047.GetGeoTransform() # gt参数顺序:左上角X坐标、X方向分辨率、旋转系数、左上角Y坐标、旋转系数、Y方向分辨率(通常为负) # 2. 生成所有像素的投影坐标 x_coords = gt[0] + np.arange(n_cols) * gt[1] y_coords = gt[3] + np.arange(n_rows) * gt[5] xx, yy = np.meshgrid(x_coords, y_coords) # 3. 展平数组拼接为DataFrame df = pd.DataFrame({ "X (n=1200)": xx.flatten(), "Y (n=1200)": yy.flatten(), "AOD_047": target_aod.flatten() }) # 可选:过滤MCD19A2默认填充值-28672,去除无效观测 df = df[df["AOD_047"] != -28672].reset_index(drop=True) # 可选:如果需要转为WGS84经纬度坐标,增加以下投影转换代码 src_srs = osr.SpatialReference() src_srs.ImportFromWkt(aod_047.GetProjection()) tgt_srs = osr.SpatialReference() tgt_srs.ImportFromEPSG(4326) # 适配GDAL 3+的坐标顺序 tgt_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) transformer = osr.CoordinateTransformation(src_srs, tgt_srs) coords = np.column_stack((xx.flatten(), yy.flatten())) lon_lat = np.array(transformer.TransformPoints(coords)) df["lon"] = lon_lat[:, 0] df["lat"] = lon_lat[:, 1]
1200*1200的栅格展开后共144万行数据,内存占用仅几十MB,不会出现内存溢出问题。
内容的提问来源于stack exchange,提问作者ay__ya
相关产品推荐
相关产品推荐

