IDL学习笔记(二)IDL处理卫星数据

IDL处理卫星数据

  • HDF文件
    • 数据集属性
    • 通用属性
  • 常用HDF4操作函数
  • 常用的HDF5操作函数
    • 读取HDF文件的一般步骤
  • HDF4文件读取-----数据信息查询
  • HDF4文件读取示例-----目标数据TIFF输出

HDF文件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

数据集属性

数据集名称,是“:”前的一部分,不是long_name中的文字
在这里插入图片描述

通用属性

查看hdf的软件为HDF Explorer。也可以尝试使用Panoply进行简单的数据可视化(该软件也可以读nc文件)。
在这里插入图片描述

常用HDF4操作函数

在这里插入图片描述
HDF_SD_START函数是打开一个hdf文件。
HDF_SD_FILEINFO函数是查询hdf文件信息的。

在这里插入图片描述
HDF_SD_SELECT是选择数据集。
HDF_SD_NAMETOINDEX,已知数据集名称的情况下,获取数据集id号。
在这里插入图片描述

HDF_SD_GETDATA,获取指定数据集的id号所包含的数据。
HDF_SD_ATTRINFO,获取hdf属性信息。
在这里插入图片描述

使用完之后必须要关闭这个文件,不然的话相当于这个文件一直被占用,需要关闭、释放后掉。

常用的HDF5操作函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

读取HDF文件的一般步骤

1.指定文件名

2.打开文件

3.获取数据集/属性名称

4.获取数据集/属性ID

5.获取数据集/属性内容

6.下一步处理

HDF4文件读取-----数据信息查询

流程:
指定文件名–打开文件–获取文件数据集、属性的个数—循环获取数据集信息—(循环)—选中当前循环的数据集----获取当前数据集名称、属性个数、循环获取数据集属性信息----(是否完成循环)----否----获取属性名。-----是----判断数据集循环是否结束,若是则释放文件,若否循环继续。最后,释放文件

把光标放在函数上,按f1会直接跳转帮助

hdf_sd_fileinfo,sd_id,sds_num,att_num
文件名,文件id,(再任意定义两个文件名装返回结果),DataSets(数据集个数), Attributes(属性个数)--------获取文件数据集/属性个数

循环获取数据集信息:

pro hdf4_file_info_extractmodis_data = 'E:\Data\modis\2019\05\MOD09GA.A2019130.h27v05.061.2020293213719.hdf'sd_id = hdf_sd_start(modis_data,/read)hdf_sd_fileinfo,sd_id,sds_num,att_num;print,sds_num;print,att_numfor sds_i = 0, sds_num - 1 do beginsds_id = hdf_sd_select(sd_id, sds_i)hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num ;此时这一行的左边赋值给右边,name是关键字,特例print, 'The sds name of '+strcompress(string(sds_i))+':'print,sds_att_numprint,'The include attributes name:'if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_nameendforprint,string('****************************************')endifhdf_sd_endaccess, sds_id;关闭释放数据集endforend
  1. sds_id = hdf_sd_select(sd_id, sds_i)选中数据集.在sd_id文件下,sds_i的地址id是多少传递给sds_id
  2. hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num获取在sds_id位置上,文件的名字是什么,在这个文件下,又有多少数据集的属性att_num,赋值给natts
  3. hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num ;此时这一行的左边赋值给右边,name是关键字,特例
  4. hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name;通过name关键字传递属性名称给右边的sds_att_name
  5. hdf_sd_endaccess, sds_id;关闭释放数据集
  6. hdf_sd_attrinfo, sds_id, att_i, name=sds_att_name只是显示了数据集名字,如果想显示内容,可以加一个关键词,data = sds_data_info,获取到的信息很多时候是一个数组
pro hdf4_file_info_extractmodis_data = 'E:\Data\modis\2019\05\MOD09GA.A2019130.h27v05.061.2020293213719.hdf'sd_id = hdf_sd_start(modis_data,/read)hdf_sd_fileinfo,sd_id,sds_num,att_num;print,sds_num;print,att_numfor sds_i = 0, sds_num - 1 do beginsds_id = hdf_sd_select(sd_id, sds_i)hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num ;此时这一行的左边赋值给右边,name是关键字,特例print, 'The sds name of '+strcompress(string(sds_i))+':'print,sds_att_numprint,'The include attributes name:'if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_namehelp,sds_attnamehelp,sds_data_infoendforprint,string('****************************************')endifhdf_sd_endaccess, sds_id;关闭释放数据集endforend

在这里插入图片描述
如果想把sds_att_name、sds_attname同时输出的时候呢?

    if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + sds_data_infoendforprint,string('****************************************')endif

此时有内部转换错误,因为字符串和数据集内变量相加,不能直接相加,需要强制类型转换为string

    if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + string(sds_data_info)endforprint,string('****************************************')endif

此时可以相加,但是结果如图所示

valid_range           0
valid_range  2147483647
_FillValue          -1

中间有很长的空格,此时是因为强制类型转换后,把转换前前面有多少个位也显示出来了,因此需要添加函数strcompress,使得空格不再那么长

    if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + strcompress(string(sds_data_info))endforprint,string('****************************************')endif

此时结果:

The include attributes name:
long_nameNumber of additional observations per row
unitsnone
valid_range 0 valid_range 2147483647
_FillValue -1

如果一个空格都不想要,就可以添加关键字“/remove_all”

    if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + strcompress(string(sds_data_info),/remove_al)endforprint,string('****************************************')endif

结果为:

The include attributes name:
long_nameNumberofadditionalobservationsperrow
unitsnone
valid_range0 valid_range2147483647
_FillValue-1

此时结果不好区分,可以认为在中间加一个冒号

 print,sds_att_name + ':'+strcompress(string(sds_data_info),/remove_al)

获取全局信息,以及释放文件:

pro hdf4_file_info_extractmodis_data = 'E:\Data\modis\2019\05\MOD09GA.A2019130.h27v05.061.2020293213719.hdf'sd_id = hdf_sd_start(modis_data,/read)hdf_sd_fileinfo,sd_id,sds_num,att_num;print,sds_num;print,att_numfor sds_i = 0, sds_num - 1 do beginsds_id = hdf_sd_select(sd_id, sds_i)hdf_sd_getinfo,sds_id,name = sds_name,natts = sds_att_num ;此时这一行的左边赋值给右边,name是关键字,特例print, 'The sds name of '+strcompress(string(sds_i))+':'print,sds_att_numprint,'The include attributes name:'if sds_att_num gt 0 then begin ;循环获取属性信息for att_i=0,sds_att_num-1 do beginhdf_sd_attrinfo, sds_id, att_i, name=sds_att_name,data = sds_data_info;通过name关键字传递属性名称给右边的sds_att_nameprint,sds_att_name + ':'+strcompress(string(sds_data_info),/remove_al)endforprint,string('****************************************')endifhdf_sd_endaccess, sds_id;关闭释放数据集endforfor att_i = 0, att_num-1 do beginhdf_sd_attrinfo,sd_id,att_i, name = att_nameprint,'global att name:'print,att_nameendforhdf_Sd_end,sd_idend

HDF4文件读取示例-----目标数据TIFF输出

数组和数字 sf[0] 相乘 VS 数组和数组 sf 相乘 注意区分!

pro hdf4_dataset_readfilename = 'E:\Data\modis\2019\05\MOD09GA.A2019130.h27v05.061.2020293213719.hdf'result_name = 'E:\Data\modis\2019\result\MOD09GA.A2019130.h27v05.061.2020293213719.tiff'modis_sd_id = hdf_sd_start(filename,/read)modis_sds = 'sur_refl_b02_1'modis_sds_index = hdf_sd_nametoindex(modis_sd_id,modis_sds);找到文件地址modis_sds_id = hdf_sd_select(modis_sd_id,modis_sds_index);转换为文件id号hdf_sd_getdata,modis_sds_id,modis_band2 ;由id找到文数据集,赋值给modis_band2modis_sds = 'sur_refl_b03_1'modis_sds_index = hdf_sd_nametoindex(modis_sd_id,modis_sds)modis_sds_id = hdf_sd_select(modis_sd_id,modis_sds_index)hdf_sd_getdata,modis_sds_id,modis_band3modis_att_index = hdf_sd_attrfind(modis_sds_id,'scale_factor')hdf_sd_attrinfo, modis_sds_id,modis_att_index,data=sfmodis_att_index = hdf_sd_attrfind(modis_sds_id,'_FillValue')hdf_sd_attrinfo,modis_sds_id,modis_att_index,data=fvhdf_sd_endaccess,modis_sds_idhdf_SD_end,modis_sd_idmodis_target_data = modis_band2modis_target_data = (modis_target_data ne fv[0])*modis_target_data*sf[0] ;注意这里乘以的是一个数,而不是一个恶搞数组write_tiff,result_name, modis_target_data,/float ;必须要加一个 /float 否则可能输出的是一个黑白图end

保存出去的图为:
在这里插入图片描述
保存成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读——量子退火Experimental signature of programmable quantum annealing

摘要:量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明,在理想化的封闭系统条件下,量子退火可以胜过基于经典热化的算法(例如模拟退火)。当前设计的量子退火装置的退相干时间比绝热演…

TCP/IP协议簇自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记,当前清理空间,本来想直接删除掉的,但是感觉有些舍不得,因此先搬移过来。 曾经,我只知道socket函数能进行网络间数据的通信,知道tcp/ip协议也是用来进行网络数据…

c++领域展开第一幕——入门基础(命名空间、iostream、缺省参数、函数重载、nullptr、inline(内联函数))超详细!!!!

文章目录 前言一、c的第一个程序二、命名空间2.1 namespace 的价值2.2 namespace 的定义2.3 命名空间的使用 三、c的输入和输出四、缺省参数五、函数重载六、nullptr七、inline总结 前言 今天小编带着大家进入c的大门,虽然c难,但好事多磨,一起…

DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)

在工作中需要对DM-VIO算法进行测试,于是配置并记录了一下: 首先运行ros接口的dm-vio,一定要先配置源码 https://github.com/lukasvst/dm-vio在这个网址把源码下载下来并解压,并安装一下依赖: sudo apt-get install …

基于Java Springboot成人教育APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…

基于Java Springboot个人财务APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕 设置使用下载地址 设置 使用 下载地址 https://www.videohelp.com/software/PotPlayer

【软考网工笔记】网络基础理论——传输层

IPSec协议 Internet协议安全性是一种开放标准的框架结构,通过使用加密的安全服务以确保在Internet协议(IP)网络上进行保密而安全的通讯。 工作在OSI模型的第三层网络层上,使其在单独使用时适于保护基于TCP或UDP的协议&#xff0…

Fastify装饰器:增强你的路由处理功能加入日志

Fastify以其出色的性能和扩展性脱颖而出。装饰器是Fastify提供的一个强大功能,它允许开发者在不修改核心代码的情况下,向请求(Request)和响应(Response)对象添加自定义属性和方法。本文将通过一个简单的示例…

redis命令行常用的操作及数据备份

redis命令行常用的操作及数据备份 1.连接命令行2.常用的命令3.数据备份恢复4.桌面管理工具 在日常工作中,有时候会需要去查看redis中某个缓存key是否存在、是否过期等情况;因此,记录整理了一些常用的命令; 1.连接命令行 连接到re…

【大数据学习 | Spark-SQL】关于RDD、DataFrame、Dataset对象

1. 概念: RDD: 弹性分布式数据集; DataFrame: DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型…

分布式集群下如何做到唯一序列号

优质博文:IT-BLOG-CN 分布式架构下,生成唯一序列号是设计系统常常会遇到的一个问题。例如,数据库使用分库分表的时候,当分成若干个sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。实现思…

【算法刷题指南】优先级队列

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

java基础概念46-数据结构1

一、引入 List集合的三种实现类使用了不同的数据结构! 二、数据结构的定义 三、常见的数据结构 3-1、栈 特点:先进后出,后进先出。 java内存容器: 3-2、队列 特点:先进先出、后进后出。 栈VS队列-小结 3-3、数组 3-…

第一部分:基础知识 3. 数据类型 --[MySQL轻松入门教程]

第一部分:基础知识 3. 数据类型 --[MySQL轻松入门教程] MySQL 支持多种数据类型,这些数据类型可以分为几大类:数值类型、字符串类型、日期和时间类型、二进制类型以及枚举和集合。每种类型都有其特定的用途和存储需求。以下是 MySQL 中常用的…

Linux的基本操作及虚拟机设置

文章目录 Linux的目录结构Linux中的常见目录 VI和VIM编辑器什么是VI和VIM编辑器VIM的一般模式VIM的编辑模式VIM的命令模式模式间的切换 虚拟机网络配置查看网络信息修改网络配置信息查看和修改主机名服务管理类命令 虚拟机管理操作VMware为虚拟机拍摄快照VMware为虚拟机执行克隆…

【前端】安装hadoop后,前端启动报错,yarn命令

新安装hadoop后,前端启动项目用yarn命令,报错。 报错:系统找不到指定的路径。 No HADOOP_CONF_DIR set. Please specify it either in yarn-env.cmd or in the environment. 解决:删掉hadoop目录下yarn的文件 检查:…

神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲

(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置,可以仔细看官方文档。 pytorch 官网的库:torch.nn — PyTorch 2.5 documentation Containers库:用来搭建神经网络框架(包含所有的神经网络的框架)&#xff1b…

[382]基于springboot的辽B代驾管理系统

毕 业 设 计(论 文) 题目:辽B代驾管理系统 摘 要 使用旧方法对辽B代驾管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在辽B代驾管理系统的管理上面可以解决许多信息管理上面的难题,比…

使用Grafana K6来测测你的系统负载能力

背景 近期我们有个号称会有很高很高并发的系统要上线,为了测试一下自己开发的系统的负载能力,准备了点海克斯科技,来看看抗不抗的住。 之前笔者写过用Apache JMeter进行压力测试的文章(传送门👉:https://…