使用HDF库读写HDF4文件(C/C++)

2010年8月27日星期五
一、引言

Hierarchical Data Format (HDF)是由HDF Group开发维护的一种开放文件格式,目前HDF有HDF4和HDF5两个版本,它们相互并不兼容。相应的HDF-EOS也有两个版本,基于HDF4的叫做HDF-EOS2,基于HDF5的叫做HDF-EOS5,MODIS数据产品使用的是HDF-EOS2文件格式。HDF Group提供了C/C++,Fortran,Java库以对HDF文件进行读写操作HDF4最新版本号是4.2.5,并针对多种平台进行了预先编译。本文讨论如何用官方编译好的Windows平台的C/C++库中的SD API对HDF4文件进行读写操作。

本文参考以下三个文档,均可从HDF Group网站获得
HDF4 User’s Guide
HDF4 Reference Manual
sd_rd.c

二、HDF文件格式

图片引自《HDF4 User’s Guide》
如上图所示,一个HDF文件中可以有6种数据结构:Raster Image,Palette,Scientific Data Set,Annotation,Vdata和Vgroup。与这六种数据结构相应的有5类API:

SD API - 对Scientific Data Set进行读写操作
VS API - 对Vdatas进行读写操作
V API - 对Vgroups进行读写操作
GR API - 对Raster Images和Palettes进行读写操作
AN API Stores - 对Annotations进行读写操作

说到这里则有必要提及两个现成的HDF查看软件:HDF Explorer和HDFView,HDF Explorer是私有软件,而HDFView是由HDF Group开发维护的。HDF Explorer默认支持HDF-EOS,HDFView则需要安装HDF-EOS_Plugin才能获得较好的HDF-EOS支持。下面是HDFView截图。


在HDFView中查看HDF文件中DataFields的Metadata
红框标示了数据集的类型和数据的类型

三、例子
本例子读入一个MOD15A2 HDF文件的LAI数据(uint8),将其除以10(float)再输出为新的HDF文件。在程序中使用数组来存储原始LAI数据和除以10的LAI数据,数组类型需要与相应HDF文件中指定的数据类型严格对应,否则会发生数据读写错误。

完整的程序(ReadWrite_SDS.c),makefile,数据文件MOD15A2.A2006361.h10v04.005.2008134052818.hdf。需要链接的库文件可以查阅下载下来的HDF库中的INSTALL_WINDOWS.txt。在本例子程序中,只链接了hd425m.lib和hm425m.lib,这可以从makefile中看出来。

读入HDF文件的代码如下:
/* Read data to LAI_MODIS array */
sd_id = SDstart("MOD15A2.A2006361.h10v04.005.2008134052818.hdf", DFACC_READ);
sds_index = SDnametoindex(sd_id, "Lai_1km");
sds_id = SDselect (sd_id, sds_index);

输出HDF文件代码如下:

/* Create and open the file and initiate the SD interface. */
sd_id = SDstart("MyMOD15A2.hdf", DFACC_CREATE);
sds_id = SDcreate(sd_id, "LAI_divided", DFNT_FLOAT32, rank, dims);
istat = SDwritedata(sds_id, start, NULL, edges, (VOIDP)LAI);

0 评论:

发表评论