ENVI_IDL:(批量处理)如何对HDF5文件进行GLT文件的创建并进行几何校正最终输出为IMG格式?

简介: ENVI_IDL:(批量处理)如何对HDF5文件进行GLT文件的创建并进行几何校正最终输出为IMG格式?

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文件太慢了,代码执行过程我就不等了,已经实验过是可以正常显示的)


(代码输出结果)

目录
相关文章
|
1月前
|
安全 Windows
windows系统中,通过LOAD到入csv格式的文件到neo4j中,如何写文件路径
windows系统中,通过LOAD到入csv格式的文件到neo4j中,如何写文件路径
43 0
|
4月前
|
数据库
提取本地路径Jpg或者mp4文件的名字,导入mp4的名字,并导入数据库的源码
提取本地路径Jpg或者mp4文件的名字,导入mp4的名字,并导入数据库的源码
|
存储 Python
【可定制、转换时间戳】解析nc文件,并保存为csv文件
【可定制、转换时间戳】解析nc文件,并保存为csv文件
498 4
|
6月前
分享:批量多目录图片如何转换PDF,一次性转换多级目录批量的PDF的转换,合并,输出另存等问题,图片转PDF文件,批量图片转PDF文件,多级目录的图片转PDF文件,并且保存到不同的地方,全部搞定
本文介绍了如何高效地将图片转换为PDF,包括单张、多张及多级目录下的图片转换和合并。提供了软件下载链接(百度网盘、腾讯云盘),软件操作简便,支持保存原目录或自定义新目录。转换选项包括单个文件、多个文件夹单独转换以及合并转换。用户可通过双击路径访问源图片和转换结果。该工具特别解决了多级目录图片批量转换的难题,实现保存地址的自由设定,满足不同业务需求。
396 0
|
Web App开发 存储 数据可视化
VCF文件修改染色体格式的方法
VCF文件修改染色体格式的方法
ENVI_IDL:如何读取HDF4文件和HDF5文件的数据集和属性?
参考Documentation Center (l3harrisgeospatial.com) 由于时间和精力,这里并没有对其中的函数进行详细的说明,只是介绍了函数作用以及用法。
232 0
|
存储 C语言 索引
ENVI IDL:熟悉IDL语法+输出多幅TIFF影像的MAX文件和MEAN文件
ENVI IDL:熟悉IDL语法+输出多幅TIFF影像的MAX文件和MEAN文件
306 0
成信大ENVI_IDL第三周课堂内容1:读取OMI数据(HDF5文件)以及输出+解析
成信大ENVI_IDL第三周课堂内容1:读取OMI数据(HDF5文件)以及输出+解析
184 0
|
索引
ENVI_IDL:批量拼接Modis Swath的逐日数据并输出为Geotiff格式
ENVI_IDL:批量拼接Modis Swath的逐日数据并输出为Geotiff格式
145 0
|
存储 编解码
ENVI_IDL:读取OMI数据(HDF5)并输出为Geotiff文件+详细解析
ENVI_IDL:读取OMI数据(HDF5)并输出为Geotiff文件+详细解析
412 1