01 说明
关于HDF5文件的读取如果想详细了解可以查阅下方代码,写的比较详细;如果想直接使用,请在下方位置处填写好自己电脑HDF5文件的一些环境信息即可进行GLT文件的几何校正。
02 完整代码
; 该函数用于获取hdf5文件的数据集数据和数据集的属性 function get_hdf5, file_path, ds_path, att_path ; 传参:文件路径,数据集路径 ; 获取hdf5文件的id hdf_id = H5F_OPEN(file_path) ; 获取数据集id ds_id = H5D_OPEN(hdf_id, ds_path) ; 获取数据集数据 ds = H5D_READ(ds_id) ; 判断是否获取属性信息 if att_path then begin att = H5A_OPEN_NAME(ds_id, att_path) return, att endif ; 关闭已打开的hdf5文件 H5F_CLOSE, hdf_id ; 返回值(注意,是return, ds 而不是return ds) return, ds end ; 本程序使用二次开发接口进行glt文件的创建并基于glt文件对影像进行校正最后输出为TIFF格式 pro glt_parallel start_time1 = systime(1) ; 输入路径(存放HDF5文件的文件夹) in_path = 'D:\ENVI_Exercise\fy3' ; 输出路径(输出TIFF文件<已进行GLT校正>的文件夹) out_path = 'D:\ENVI_Exercise\fy3\glt_data1' ; 需要校正的数据集的路径(以下简称校正数据集) ds_path = 'EV_RefSB' ; 校正数据集的缺失值属性(_FillValue),比例系数(scale_factor) fv_name = '_FillValue' sf_name = '' ; 如果无该属性,赋值为 sf_name = '' ; 二次开发接口的环境设置(由于这里需要使用envi的api接口,所以需要声明) compile_opt idl2 envi,/restore_base_save_files envi_batch_init ; 获取输入路径中所有HDF5文件的路径 paths_arr = file_search(in_path, '*.he5', count=hdfs_count) ; hdfs_count表示该文件夹中hdf5文件的个数 ; 进入循环对每一个HDF5文件进行GLT文件的创建并进行几何校正最后转化为TIFF文件 for hdf_i = 0, hdfs_count - 1 do begin start_time2 = systime(2) ; 获取当前循环下hdf5文件的路径 path = paths_arr[hdf_i] ; 获取当前循环下hdf5文件的经纬度数据集 lon = get_hdf5(path, 'Longitude', '') lat = get_hdf5(path, 'Latitude', '') ; 获取校正数据集 ds = get_hdf5(path, ds_path, '') ; 获取校正数据集的缺失值并进行scale处理 ; 获取校正数据集的属性_FillValue, scale_factor fv = get_hdf5(path, ds_path, fv_name) if sf_name then begin sf = get_hdf5(path, ds_path, sf_name) ; scale处理 ds = (ds ne fv[0]) * ds * sf[0] ; 注意返回的属性值是以数组形式返回 endif ; 当前循环下输出路径的设置 lon_out = out_path + '\Longitude.tif' lat_out = out_path + '\Latitude.tif' ds_out = out_path + '\ds.tif' ; 由于ds维度是[2048, 1800, 7], 而write_tiff需要[7, 2048, 1800]的样式,所以需要修改 ds_size = size(ds) new_ds = fltarr(ds_size[3], ds_size[1], ds_size[2]) for i = 0, ds_size[3] - 1 do begin new_ds[i, *, *] = ds[*, *, i] endfor ds = new_ds ; 这是临时加的代码,我懒得改后面的代码所以这里又重新赋值回去了 WRITE_TIFF, lon_out, lon, /float WRITE_TIFF, lat_out, lat, /float WRITE_TIFF, ds_out, ds, /float ; 打开刚刚存储的文件(使用ENVI的api打开) ENVI_OPEN_FILE, lon_out, R_FID=lon_id ENVI_OPEN_FILE, lat_out, R_FID=lat_id ENVI_OPEN_FILE, ds_out, R_FID=ds_id ; 输出glt文件的路径 glt_out = out_path + '\glt.img' glt_hdr_path = out_path + '\' + 'glt.hdr' ; 输出校正之后的数据集存放路径 final_ds_out = out_path + '\' + FILE_BASENAME(path, '.he5') + '.img' final_ds_hdr_out = out_path + '\' + FILE_BASENAME(path, '.he5') + '.hdr' ; 输入输出的投影信息 in_prj = ENVI_PROJ_CREATE(/GEOGRAPHIC) out_prj = ENVI_PROJ_CREATE(/GEOGRAPHIC) ; 创建GLT文件 ENVI_DOIT, 'ENVI_GLT_DOIT', dims=dims, i_proj=in_prj, o_proj=out_prj, $ out_name=glt_out, pixel_size=pixel_size, rotation=0.0, $ x_fid=lon_id, y_fid=lat_id, x_pos=0, y_pos=0, r_fid=glt_id ; 利用创建好的glt文件进行几何校正 ENVI_DOIT, 'ENVI_GEOREF_FROM_GLT_DOIT', fid=ds_id, glt_fid=glt_id, $ pos=0, out_name=final_ds_out ; 将所有打开的文件全部关闭 envi_file_mng, id=lon_id, /REMOVE envi_file_mng, id=lat_id, /REMOVE envi_file_mng, id=ds_id, /REMOVE envi_file_mng, id=glt_id, /REMOVE print, 123 ; 删除中间文件 file_delete, [lon_out, lat_out, ds_out, glt_out, glt_hdr_path] end_time2 = systime(2) print, file_basename(path) + ' 几何校正成功, 用时: ' + strcompress(string(end_time2 - start_time2)) + ' s.' endfor end_time1 = systime(1) print, '程序运行完毕! 用时: ' + strcompress(string(end_time1 - start_time1)) + ' s.' end
以下是实操输出:
(创建GLT文件太慢了,代码执行过程我就不等了,已经实验过是可以正常显示的)
(代码输出结果)