IDL遥感应用入门(12):读取HDF4影像数据 您所在的位置:网站首页 envi无法打开hdf文件 IDL遥感应用入门(12):读取HDF4影像数据

IDL遥感应用入门(12):读取HDF4影像数据

2023-06-22 05:34| 来源: 网络整理| 查看: 265

IDL遥感应用入门(12):读取HDF4影像数据 发布时间: 2014-01-16 所属分类: IDL遥感应用教程 文章标签: none 当前位置: 麻辣GIS » GIS笔记 » IDL遥感应用教程 » IDL遥感应用入门(12):读取HDF4影像数据

在遥感应用中,会遇到一些HDF4格式的影像数据,HDF是一种自描述性的文件,不像之前介绍的SSMI / SSMIS数据和QuikScat数据那样,需要一个专门的数据描述文档,然后我们通过文档获取相关参数去读取文件。HDF的好处是完全跨平台,只要给定一个完整的HDF文件,我们就可以根据相关的规则去读取而不需要任何文档。关于HDF的文件的详细介绍,你可以看这篇文章:关于HDF文件的一点概述(HDF4,HDF5)

一些前提

言归正传,下面介绍一个完整的读取HDF文件的过程,本文中所用到的HDF文件,你可以从这里下载。链接:http://pan.baidu.com/s/1gdxhBv9 密码:hmcn

所有代码 ;Author:Sailor ;2014-01-15 PRO Course_11 ;定义文件路径 MyRootDir='D:\8\' ;遍历文件夹 filearr = file_search(MyRootDir+'day','*-sst.hdf',count=num); FOR fileindex=0,num-1,1 DO BEGIN ;打开SDS模式的HDF文件&返回文件信息 hdfid=hdf_sd_start(filearr[fileindex]) hdf_sd_fileinfo,hdfid,datasets,attributes ;遍历每个属性 FOR attrindex=0,attributes-1 DO BEGIN hdf_sd_attrinfo,hdfid,attrindex,name=a,data=b,count=c,hdf_type=d,type=e print,'Name',':',a print,'Data',':',b print,'Count',':',c print,'Hdf_type',':',d print,'Type',':',e print,'+++++++++++++++++++++++++++++++++++++' ENDFOR ;遍历每个数据集 FOR dsindex=0,datasets-1 DO BEGIN ;读取数据集数据 varid=hdf_sd_select(hdfid,dsindex) hdf_sd_getdata,varid,Data hdf_sd_getinfo,varid,name=dstName,natts=dstNum ;如果数据集不为0 IF(dstNum NE 0) THEN BEGIN print,'Name',':',dstName help,Data print,'Num',':',dstNum FOR ind2=0,dstNum-1 DO BEGIN hdf_sd_attrinfo,varid,ind2,name=disName,data=disData print,disName print,disData ENDFOR print,'******************************' hdf_sd_endaccess,varid ENDIF ENDFOR ;显示数据 ;读取sst数据集 ind=hdf_sd_nametoindex(hdfid,'sst');得到sst数据集的索引号 var_id=hdf_sd_select(hdfid,ind) hdf_sd_getdata,var_id,sst sst=congrid(sst,1440,720) ;对sst数组进行处理 sst=sst*0.075-3 sst=reverse(sst,2) sst=bytscl(sst,min=-3,max=33,top=255) Img=image(sst,rgb_table=39,title=filearr(fileindex),grid_units=1,POSITION=[0.1,0,0.85,1]) xaxis=axis('X',location=[0,0],range=[-180,180],minor=0, major=19,coord_transform=[-180,0.25],title='Longitude(°)') yaxis=axis('Y',location=[0,0],range=[-90,90],minor=0, major=7,coord_transform=[-90,0.25],title='Latitude(°)') ;COLORBAR c = COLORBAR(TARGET=Img, ORIENTATION=1,TITLE='SST(Deg)') ENDFOR END 效果图

代码解释 MyRootDir='D:\8\'

这句代码规定了HDF的数据路径,当然你要换成你自己的路径,测试数据可以从这里下载。

filearr = file_search(MyRootDir+'day','*-sst.hdf',count=num); FOR fileindex=0,num-num,1 DO BEGIN

这句代码段是对上面的路径做一个遍历,找出所有的.hdf数据,之所以这么写是为了方便批处理,因为不可能只处理一个文件。不过如果仅仅是做测试,这里可以改为num-num只处理一个文件测试效果,效果满意再做批处理。关于file_search函数的详细使用,你可以看这篇文章:IDL使用file_search函数遍历某个文件夹下的所有文件

;打开SDS模式的HDF文件&返回文件信息 hdfid=hdf_sd_start(filearr[fileindex]) hdf_sd_fileinfo,hdfid,datasets,attributes

这段代码是读取某一个具体的hdf文件,并且获取这个文件的ID,数据集个数 datasets 和属性个数 attributes。

;遍历每个属性 FOR attrindex=0,attributes-1 DO BEGIN hdf_sd_attrinfo,hdfid,attrindex,name=a,data=b,count=c,hdf_type=d,type=e print,'Name',':',a print,'Data',':',b print,'Count',':',c print,'Hdf_type',':',d print,'Type',':',e print,'+++++++++++++++++++++++++++++++++++++' ENDFOR

这段代码遍历了文件的全局属性,并输出。

;遍历每个数据集 FOR dsindex=0,datasets-1 DO BEGIN ;读取数据集数据 varid=hdf_sd_select(hdfid,dsindex) hdf_sd_getdata,varid,Data hdf_sd_getinfo,varid,name=dstName,natts=dstNum ;如果数据集不为0 IF(dstNum NE 0) THEN BEGIN print,'Name',':',dstName help,Data print,'Num',':',dstNum FOR ind2=0,dstNum-1 DO BEGIN hdf_sd_attrinfo,varid,ind2,name=disName,data=disData print,disName print,disData ENDFOR print,'******************************' hdf_sd_endaccess,varid ENDIF ENDFOR

这段代码遍历了全局的数据集,并且对每个数据集的属性做了一个遍历。

;读取sst数据集 ind=hdf_sd_nametoindex(hdfid,'sst');得到sst数据集的索引号 var_id=hdf_sd_select(hdfid,ind) hdf_sd_getdata,var_id,sst sst=congrid(sst,1440,720)

这里通过上面两步遍历,找出我们要找的数据集sst,这里读取sst数据集,并且根据数据集信息做了一个采样。

;对sst数组进行处理 sst=sst*0.075-3 sst=reverse(sst,2) sst=bytscl(sst,min=-3,max=33,top=255) Img=image(sst,rgb_table=39,title=filearr(fileindex),grid_units=1,POSITION=[0.1,0,0.85,1]) xaxis=axis('X',location=[0,0],range=[-180,180],minor=0, major=19,coord_transform=[-180,0.25],title='Longitude(°)') yaxis=axis('Y',location=[0,0],range=[-90,90],minor=0, major=7,coord_transform=[-90,0.25],title='Latitude(°)') ;COLORBAR c = COLORBAR(TARGET=Img, ORIENTATION=1,TITLE='SST(Deg)')

最后对整个数据集做了一个处理,这里的sst=sst*0.075-3 也是通过之前的属性遍历得到的,如图:

这就是整个HDF4文件的读取过程,如果有什么问题,欢迎留言。

相关阅读 IDL遥感应用入门(4):利用QuikScat 数据绘制纬向平均风速趋势图(单图显示) IDL遥感应用入门(4):利用QuikScat 数据绘制纬向平均风速趋势图(单图显示) 2014-01-08 时态GIS数据模型 时态GIS数据模型 2014-03-09 2014年Esri技术公开课(14)实用企业级空间数据库设计及优化配置技巧 2014年Esri技术公开课(14)实用企业级空间数据库设计及优化配置技巧 2014-10-20 VC++开发GIS系统(113)重置地图 VC++开发GIS系统(113)重置地图 2016-01-07 关于我国三种参心大地坐标系的说明 关于我国三种参心大地坐标系的说明 2017-11-14 「GIS漫谈」谈谈开发一个防溺水GIS系统的思路 「GIS漫谈」谈谈开发一个防溺水GIS系统的思路 2021-07-21 麻辣GIS-Sailor

作者:Sailor

GIS爱好者,学GIS,更爱玩GIS。 B站关注 加入QQ群 声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读 公众号关注 微信打赏 手机阅读 麻辣GIS微信公众号关注 最新GIS干货 赞助麻辣GIS 谢谢老板!! 上一篇:IDL遥感应用入门(11):利用QuikScat数据绘制风速矢量图(色标表示大小箭头表示方向) 下一篇:IDL遥感应用入门(13):采用IDL进行几何校正


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有