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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: ENVI_IDL: 创建HDF5文件并写入数据(以将Geotiff文件写入HDF文件为例) + 详细解析

1. 学习内容

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

创建HDF5文件的基本流程:

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

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

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

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

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

6. 将数据写入数据集

7. 关闭文件


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
目录
相关文章
|
2月前
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
56 8
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
85 2
|
1天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
31 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
2月前
|
数据采集 自然语言处理 搜索推荐
基于qwen2.5的长文本解析、数据预测与趋势分析、代码生成能力赋能esg报告分析
Qwen2.5是一款强大的生成式预训练语言模型,擅长自然语言理解和生成,支持长文本解析、数据预测、代码生成等复杂任务。Qwen-Long作为其变体,专为长上下文场景优化,适用于大型文档处理、知识图谱构建等。Qwen2.5在ESG报告解析、多Agent协作、数学模型生成等方面表现出色,提供灵活且高效的解决方案。
181 49
|
29天前
|
XML JSON JavaScript
HttpGet 请求的响应处理:获取和解析数据
HttpGet 请求的响应处理:获取和解析数据
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
43 3
|
2月前
|
数据采集 存储 自然语言处理
基于Qwen2.5的大规模ESG数据解析与趋势分析多Agent系统设计
2022年中国上市企业ESG报告数据集,涵盖制造、能源、金融、科技等行业,通过Qwen2.5大模型实现报告自动收集、解析、清洗及可视化生成,支持单/多Agent场景,大幅提升ESG数据分析效率与自动化水平。
119 0
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
87 0
|
7天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
7天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多