麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

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文件的读取过程,如果有什么问题,欢迎留言。

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

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

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

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

已有 22 条评论

  1. 麻辣GIS-skylover
    1#
    skylover  · 2014-10-09 09:41

    文中的HDF文件无法下载。

  2. 麻辣GIS-skylover
    2#
    skylover  · 2014-10-10 05:16

    可不可以把HDF文件的下载链接重新发一下,谢谢!

      1. 麻辣GIS-Sailor
        Sailor  · 2014-10-10 18:07

        你试试这个,链接:http://pan.baidu.com/s/1gdxhBv9 密码:hmcn

  3. 麻辣GIS-skylover
    3#
    skylover  · 2014-10-10 08:52

    代码的最后在画X轴和Y轴的时候range应改成xrange和yrange吧。

      1. 麻辣GIS-Sailor
        Sailor  · 2014-10-10 18:00

        不用的,因为用的axis函数,如果在image函数绘图,需要设置xrange和yrange,那个数据我找找,百度网盘出问题了。

  4. 麻辣GIS-123
    4#
    123  · 2016-07-13 16:59

    出效果图还需要加其他命令吗?

  5. 麻辣GIS-xiaomeng
    5#
    xiaomeng  · 2016-08-18 16:02

    range 改为axis_range

  6. 麻辣GIS-yaogan
    6#
    yaogan  · 2016-12-22 21:29

    您好,我最近下载OMI L1b数据反演SO2,后缀是 .HE4,我想问一下这种格式与HDF4有什么差距呢,为什么ENVI也打不开,不知道如何处理这个数据

      1. 麻辣GIS-Sailor
        Sailor  · 2016-12-26 09:48

        这个.he4文件我没有用过,你可以找相关的介绍文档看一下。

  7. 麻辣GIS-hailin
    7#
    hailin  · 2017-10-11 12:29

    你好HDF5文件读取 有代码嘛 求帮助

      1. 麻辣GIS-Sailor
        Sailor  · 2017-10-11 16:52

        暂无现成代码。

  8. 麻辣GIS-River
    8#
    River  · 2017-11-28 22:48

    你好,我想用IDL显示ENVI反演得到的水汽含量,得到像你文中那样的图片可以吗?

      1. 麻辣GIS-Sailor
        Sailor  · 2017-11-29 08:58

        肯定可以啊,就是可视化的工具嘛。

  9. 麻辣GIS-12222
    9#
    12222  · 2018-03-14 13:33

    你好,请问地图底图是怎么出来的,在代码哪里体现的?

      1. 麻辣GIS-Sailor
        Sailor  · 2018-03-14 14:05

        自己加个断点调,就明白了。

  10. 麻辣GIS-Dousa
    10#
    Dousa  · 2018-03-31 19:12

    Unable to start the HDF-SD interface.
    请问调试出现这个问题怎么解决?

      1. 麻辣GIS-没脾气
        没脾气  · 2018-06-22 20:33

        请问您的这个问题解决了么,我也出现了同样的问题

  11. 麻辣GIS-Lonkk
    11#
    Lonkk  · 2018-12-14 19:22

    请问&是什么?

      1. 麻辣GIS-Lonkk
        Lonkk  · 2018-12-14 19:25

        &

          1. 麻辣GIS-Sailor
            Sailor  · 2018-12-16 14:26

            “并且”的意思

  12. 麻辣GIS-kris
    12#
    kris  · 2021-05-09 15:20

    你好,有IDL读取nc格式的代码吗

      1. 麻辣GIS-Sailor
        Sailor  · 2021-05-11 22:29

        https://malagis.com/idl-remote-sensing-reads-netcdf.html

留言板(小编看到第一时间回复) 取消回复