发布时间:2022-11-21 22:00
目录
1. 学习内容
2. 知识储备
3. 编程
文如标题:就是自己创建HDF文件并将数据写入其中
——————————————————————————————————————————————————————————————————————————————————————
创建HDF5文件的基本流程:
1. 指定路径创建好HDF5文件
2. 创建存储相同类型数据的组
3. 获取数据集的数据类型id
4. 获取数据集的数据空间id
5. 创建数据集id(创建属性也是类似的步骤)
6. 将数据写入数据集
7. 关闭文件
——————————————————————————————————————————————————————————————————————————————————————
这里会有一些函数你可能会使用到。
——————————————————————————————————————————————————————————————————————————————————————
—————————————————————————————————————————————————————————————————————————————————————
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
——————————————————————————————————————————————————————————————————————————————————————
我是炒茄子,不用谢