ENVI_IDL: 创建HDF5文件并写入数据(以将Geotiff文件写入HDF文件为例) + 详细解析

发布时间:2024-09-14 13:01

 

目录

 

1. 学习内容

2. 知识储备

3. 编程


1. 学习内容

文如标题:就是自己创建HDF文件并将数据写入其中

——————————————————————————————————————————————————————————————————————————————————————

创建HDF5文件的基本流程:

1. 指定路径创建好HDF5文件

2. 创建存储相同类型数据的组

3. 获取数据集的数据类型id

4. 获取数据集的数据空间id

5. 创建数据集id(创建属性也是类似的步骤)

6. 将数据写入数据集

7. 关闭文件

——————————————————————————————————————————————————————————————————————————————————————

2. 知识储备

这里会有一些函数你可能会使用到。

——————————————————————————————————————————————————————————————————————————————————————

ENVI_IDL: 创建HDF5文件并写入数据(以将Geotiff文件写入HDF文件为例) + 详细解析_第1张图片

ENVI_IDL: 创建HDF5文件并写入数据(以将Geotiff文件写入HDF文件为例) + 详细解析_第2张图片 

 —————————————————————————————————————————————————————————————————————————————————————

3. 编程

pro week_seven_study1
  ; 本程序用于解决创建hdf5文件并写入数据
  ; 这里的写入的数据是某些tiff文件的数据
  
  ; 程序开始的时间
  start_time = systime(1)
  
  ; 路径
  in_dir = 'D:/IDL_program/experiment_data/chapter_4'
  out_dir = 'D:/IDL_program/experiment_data/chapter_4/hdf/'
  if file_test(out_dir) eq 0.0 then file_mkdir, out_dir  ; 如果该目录没有则创建
  
  ; 获取in_dir下的air_quality相关的tiff文件的路径并获取tiff文件的个数(count=返回)
  tiff_path_list = file_search(in_dir, 'air_quality*.tiff', count=tiff_count)  ; 由于该目录下有一些tiff文件不是我们想要的,所以不能只*.tiff
  ; 获取tiff文件的名称
  tiff_name_list = file_basename(tiff_path_list, '.tiff')
  
  ; 创建hdf5文件——》通过h5f_create(路径)函数创建,返回创建的hdf5文件的id
  create_path = out_dir + 'air_quality.he5'  ; hdf5文件的后缀名是.he5
  h5_id = h5f_create(create_path)
  
  ; 创建HDF5组,用于存储数据集(上方tiff文件的主体数据)——》通过h5g_create(Loc_id, Name)函数(Loc_id可以是文件id也可以是组id)
  ; 你要把组放在哪个的下面,你就传入哪个的id,这里我直接放入在hdf5文件下面,所以传入hdf5文件的id(h5_id), 第二个参数是组的名称
  ds_group_id = h5g_create(h5_id, 'DataSets')
  
  ; 这里再创建一个全局属性用于描述该hdf5文件的简要概述
  decribe = 'Here are some data about air quality'
  ; 虽然你知道写入全局属性的数据类型是字符串,但是你需要让IDL知道也知道,所以需要知道数据类型的id
  ; 传入数据返回数据类型的id——》h5t_idl_create(Data)函数传入数据,返回该数据的数据类型
  global_att_type_id = h5t_idl_create(decribe)
  ; 另外你传入数据全部都是以类似与excel的形式传入,所以你需要知道你的数据需要几行几列——。即你需要告诉IDL写入数据的空间有多大
  ; 传入需要写入数据的空间大小返回这么多数据空间的id——》h5s_create_simple(传入行列)函数返回数据空间的id
  global_att_space_id = h5s_create_simple([1])  ; 由于我们的字符串理论上一行一列就够了,所以可以直接[1],如果以后需要x行y列那么写入[y, x]
  ; 创建hdf5的属性,返回该属性的id——》通过h5a_create(Loc_id, Datatype_id, Datasapce_id)函数
  ; 你需要将属性创建在哪个位置,那么就哪个位置的id,这里我们创建的是一个全局属性,很显然这是一个在hdf5文件下的,所以传入该文件的id,如果你需要将属性放置在某个组下面,那么你应该传入该组的id
  global_att_id = h5a_create(h5_id, 'Decribe', global_att_type_id, global_att_space_id)
  ; 现在可以在某一个属性下面写入数据了,因为你已经创建好了该属性而且获取到了该属性的id——》通过h5a_write函数对属性写入数据
  h5a_write, global_att_id, decribe  ; 第一个参数传入需要写入数据的属性的id,第二个参数传入需要写入的数据
  
  
  
  ; 现在进入循环将每个tiff文件的数据提取出来并写入到新创建好的hdf5文件中去
  for tiff_i = 0, tiff_count - 1 do begin
    ; 获取该tiff文件的数据,获取主体信息已经地理参考信息
    tiff_data = read_tiff(tiff_path_list[tiff_i], geotiff=tiff_geo)
    ; 获取该数据的size(行列数)
    tiff_size = size(tiff_data)
    ; 获取该数据的行列数
    tiff_column = tiff_size[1]
    tiff_row = tiff_size[2]
    ; 获取该数据的分辨率
    tiff_resolution = tiff_geo.(0)
    ; 获取该数据的角点信息
    tiff_geo = tiff_geo.(1)
    
    ; 在前面创建的DataSets组里面创建数据集,用于存储该tiff数据
    ; 类似地,你也需要获取数据类型id,获取数据空间id,创建数据集并获取该数据集的id
    ; 获取该数据集的数据类型id
    ds_type_id = h5t_idl_create(tiff_data)  ; 传入即将传入该数据集的数据,获取该数据类型的id
    ; 获取该数据集的数据空间id
    ds_space_id = h5s_create_simple([tiff_column, tiff_row])
    ; 创建该数据集并获取该数据集的id
    ds_id = h5d_create(ds_group_id, tiff_name_list[tiff_i], ds_type_id, ds_space_id, gzip=9)  ; 这里多了一个关键字参数gzip,这个表示传入的数据压缩的程度,数值越大,压缩的程度越高,得到hdf5文件大小会相应的更小,但是代码运行的时间也会加长
    ; 由于创建的数据集是需要放在组下面的,所以需要传入组的id而不是文件的id
    ; 往数据集写入数据
    h5d_write, ds_id, tiff_data
    
    ; 在上面创建的数据集里面创建数据集属性(这里创建一个分辨率属性)
    ; 获取数据类型id
    res_type_id = h5t_idl_create(tiff_resolution)
    ; 获取数据空间的id
    res_space_id = h5s_create_simple([3])
    ; 创建分辨率属性并返回该属性的id
    res_id = h5a_create(ds_id, 'resolution', res_type_id, res_space_id)
    ; 往该属性写入数据
    h5a_write, res_id, tiff_resolution
    
    ; 类似的,你也可以在数据集里面创建其它属性将角点信息等写入其中,这里就不再demo
  endfor
  
  ; 关闭打开的hdf5文件
  h5f_close, h5_id
  
  ; 程序结束的时间
  stop_time = systime(1)
  ; 给出提示信息
  print, '程序用时>>> ' + strcompress(string(stop_time - start_time)) + 's'
end

——————————————————————————————————————————————————————————————————————————————————————

我是炒茄子,不用谢

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号