HDF4文件访问中间件的设计与实现

2015-02-20 08:16沈夏炯韩道军
计算机工程 2015年3期
关键词:数据类型中间件函数

沈夏炯,马 瑞,韩道军,周 兵,2

(1.河南大学a.计算机与信息工程学院;b.数据与知识工程研究所,河南开封475004;

2.图像处理与模式识别研究所,河南开封475004)

HDF4文件访问中间件的设计与实现

沈夏炯1a,1b,马 瑞1a,韩道军1a,1b,周 兵1a,2

(1.河南大学a.计算机与信息工程学院;b.数据与知识工程研究所,河南开封475004;

2.图像处理与模式识别研究所,河南开封475004)

HDF4文件常用于中分辨率成像光谱仪(MODIS)产品数据的存储,可存储多种类型的数据,但是文件数据结构复杂。目前,HDF GROUP开发的操作HDF4文件的函数库只可用于Fortran语言和C语言,其他编程语言缺少比较系统读写HDF4文件的方法。ArcGIS虽支持大部分栅格数据格式,但不支持多数据集层次式存储的HDF数据格式。为此,设计基于C#语言操作的HDF4文件中间件,解决ArcGIS无法创建多数据集HDF4文件等问题,并给出中间件的核心思想和具体应用实例。将该中间件应用于环保部生态环境遥感产品生产分系统项目中,结果表明,在处理MODIS产品数据时,解决了C#语言无法创建多数据集HDF4文件等问题,验证了该中间件的实用性。

分层数据格式;科学数据集;中间件;中分辨率成像光谱仪;栅格数据;C#语言

1 概述

分层数据格式(Hierarchical Data Format,HDF)是目前遥感卫星数据普遍采用的数据存储格式,因此利用软件编程提取包括在HDF文件里的数据是应用遥感数据的前提[1],具有重要的现实意义。HDF4是HDF文件的一种常用格式,也是中分辨率成像光谱仪(Moderate-resolution Imaging Spectroradiometer,MODIS)产品数据的常用存储格式。MODIS是搭载在地球观测系统(Earth Observing

System,EOS)AM和PM卫星上的关键设备,每两天就可以提供从可见光到红外波段的地球陆地、海洋和大气全面的全球观测数据[2]。随着MODIS数据在国内遥感研究领域的大量应用,HDF格式逐渐广为人知[3],众多学者也开展了一系列相关研究,为遥感信息产品的广泛使用进行积极的探索。

HDF4可以存储多种类型的数据,但是文件数据结构复杂。目前,HDF Group开发出HDF函数库来实现对HDF文件的读写,但HDF库函数只支持C和FORTRAN语言[1],导致其他常见开发语言无法直接读写HDF4文件,为遥感产品的广泛应用带来不便。在环保部生态环境遥感产品生产分系统项目中,需要对一系列MODIS产品进行处理,而C#语言没有系统地操作HDF4文件的方法,在操作多数据集的HDF4文件时遇到了问题。目前流行的GIS桌面操作软件ArcGIS Desktop尽管支持访问各种矢量格式及大部分的栅格数据格式,但不支持多数据集层次式存储的HDF数据格式[4]。

针对以上问题,同时考虑到技术开发路线以及.net平台和C#开发语言在实际应用中非常广泛,本文以C#为例,设计一种读写HDF4文件数据集的中间件,解决HDF4中多数据集文件的创建问题与普通数据类型向高级语言常用数据类型的转换。

2 总体设计思想

HDF的数据结构基本上可表示任何类型的数据[5]。HDF格式还提供命令方式,分析现存HDF文件的结构,并即时显示图像内容[6]。HDF4和HDF5是HDF文件的2种格式,目前,HDF4在科学界使用得较为广泛。HDF4有6种基本数据类型:光栅图像,调色板,科学数据集,注释,虚拟数据和虚拟组[7]。在HDF4文件中通常将含有相关性的数据对象分为一组,这些数据对象组称为科学数据集[8]。科学数据集有一些属性参数,可以对数据对象进行自我描述[9]。图1为HDF4文件科学数据集中间件的示意图,本文通过对C语言应用程序接口以及C#应用程序接口的设计,实现了C#读写多数据集、多波段的HDF4文件等各种功能。

图1 HDF4文件科学数据集中间件示意图

3 中间件的设计与实现

本文研究使用的操作系统是Windows 7,开发工具是Microsoft Visual Studio 2012,通过对2种接口的设计与实现,该中间件解决了C#读写HDF4文件的问题。本节主要介绍该中间件的具体实现过程。

3.1 核心技术

HDF4文件中的属性包括预定义属性和用户定义属性,用户可以更改预定义属性值,可以添加和删除用户自定义属性及属性值。通过该中间件,用户可以读写HDF4文件的影像相关信息,也可以读写科学数据集中各个波段的信息,如图像4个边界的经纬度信息、图像4个角及中心点的坐标、太阳高度角信息等。

由于HDF4文件中含有一些不常见的数据类型,C#语言中没有与之对应的数据类型,故C#无法读写HDF4文件。针对这个问题,本文通过设计2种接口,使得C#也可以读写HDF4文件。本节以数据类型char8的用户自定义属性为例,介绍C#实现读写不常见类型char8的过程。

3.1.1 C语言库与C++之间的接口设计

首先,建立一个VC++的动态链接库项目,项目属性为X64,在可执行文件的同级目录下放入它的几个C语言依赖项(HDF官网下载[10]),如szip.lib, zlib.lib,hdfdll.lib,hdf_fcstubdll.lib,hdf_fortandll.lib等。

其次,添加头文件“mfhdf.h”,编写C语言与

C++的函数接口。下面以其中一个功能为获得类型为字符串的属性值函数Example1为例进行说明。

变量file_data中数据的类型为char8,而C#中没有与之对应的类型,这就需要C++对其进行转换,这里使用了指针类型int8∗,以供C#通过C++与C#的相应接口获得数据。

此外,C++函数的关键字extern"C"和declspec (dllexport)在生成动态链接库时必须添加,extern" C"使C++能够调用C语言的库文件,__declspec (dllexport)的作用是将函数名存储在DLL的导出表中。所有接口函数编写完毕时,即可编译生成相应的动态链接库HDF4Write.dll。

3.1.2 C++与C#之间的接口设计

首先,将VC++项目生成的动态链接库HDF4Write.dll添加到相应的C#项目中,并声明与VC++项目中对应的接口函数。此时,该C#项目即可对HDF4文件进行读写操作。下面是与Example1相对应的在C#项目中声明的函数。

Example2中的关键内容是函数上方的Dll-Import属性,其中“HDF4Write.dll”指的是引用的动态链接库的名称,EntryPoint指的是动态链接库中定义的函数(此处为Example1的函数)名称。IntPtr是指针类型,这里与Example1中的int8∗对应,得到指针IntPtr后再经过字符串转换就可以得到file_data的值。从Example1和Example2可以看出,函数的返回值和参数要一一对应,并需要相应的关键字进行接口匹配,这是C#调用VC++动态链接库的核心部分。以上操作即可实现将char8类型的数据转换为相应字符串。其他不常见数据类型的转换过程与char8类似。

3.2 基本函数的再封装

通过C#项目调用VC++动态链接库得到的函数,是一些具有单一功能的基本函数(如Example2中的函数),为使读写HDF4文件更加简便,减少代码的重复编写,提高编程效率,对这些基本函数进行再封装,详见Example3。

如Example3所示,语句(4)、语句(5)、语句(7)、语句(8)的作用分别是打开指定HDF4文件、选择数据集、关闭已选择的数据集,关闭已打开文件。每对某个数据集写入一次数据,都需要进行打开文件、选定数据集等同样的操作,语句(4)、语句(5)、语句(7)、语句(8)都要重复添加,Example3把数据集写入函数writeSD(),以及对语句(4)、语句(5)、语句(7)、语句(8)进行了封装,封装为WriteSDByFile()函数。封装后,只需调用WriteSDByFile()函数即可完成数据集的写入。

综上所述,对基本函数进行再封装,使封装后的函数具有独立的功能,使得操作HDF4文件时方便易用,减少了冗余代码,结构更加清晰易懂。

4 HDF4文件的操作流程及功能介绍

4.1 函数功能

本节对本文设计的主要基本功能函数进行介绍,这些基本函数主要包括文件操作类、属性操作类和数据集操作类。通过这些基本函数,可以实现更多复杂的功能,如获取和设置数据集中各个波段的名称、图像的地理空间范围、图像的表观反射率值等,可以满足本项目对MODIS产品数据处理的要求。

表1为中间件主要基本功能函数列表,并对各个函数的功能进行了简单的介绍。

表1 中间件主要基本功能函数列表

4.2 HDF4文件操作的基本流程

科学数据集是一组用来存储和描述多维数组的科学数据的数据结构[11]。HDF4文件能够存储不同种类的科学数据集,为了方便地在C#环境下使用HDF4文件,本文在实现了C#中读写HDF4文件的功能后,对C#中的功能函数进行了再封装,使得在C#项目下操作HDF4文件简单易用,使研究遥感图像的人员能够将更多的时间和精力用于数据分析。

图2为关于读写HDF4文件的基本流程。

图2 读写HDF4文件的基本流程

Step 1用本文的自定义函数StartFile()打开文件,打开方式有创建、读和写,当打开文件失败时,返回状态值-1。其中,以创建方式打开会新建一个文件,并覆盖原重名文件。

Step 2如果只对HDF4文件的公共属性进行读写、查看各个数据集的名称和索引,即处理的是该HDF4文件的公共信息,不需选择数据集,则处理过公共信息之后,直接跳至Step6。

Step 3如果需要对指定的数据集进行属性或者数据集中数据的操作。首先,可以使用函数GetIndexByName()获得该数据集在HDF4文件中的索引号;然后,根据该索引号,使用函数SelectSD()选择科学数据集,并返回数据集的ID号;如果需要创建新的数据集,则可利用函数CreateSD()创建一个新的数据集,根据需要创建二维科学数据集或者三维科学数据集,并返回该数据集的ID号;如果选择数据集失败,则返回状态值-1。

Step 4根据Step3中返回的ID号,可以对选定的数据集进行读写操作,如果数据集中有多个波段,可以对特定波段进行操作;如果读写数据集失败,则返回状态值-1。

Step 5在对数据集操作结束后,使用函数EndSD()关闭选定的数据集。

Step 6在对某个HDF4文件操作结束后,使用函数EndFile()关闭数据文件。

5 用例分析

为了更直观、形象地说明该中间件访问HDF4文件的功能,本节通过对项目中用到一个MODIS产品的介绍和一个具体的例子,说明该中间件的使用方法,同时验证本研究的实用性。

5.1 项目需求

环保部生态环境遥感产品生产分系统项目主要是对各种遥感数据进行提取和分析。本项目中用到的

产品有土地利用与生态系统产品、城市环境遥感应用产品、国家级自然保护区动态监测与评价产品等。本节以叶绿素吸收比值指数CARI产品为例进行分析。

叶绿素吸收比值指数CARI产品是通过测量位于670 nm,550 nm和700 nm处的叶绿素相对深度来获取叶绿素的含量信息。CARI值的计算公式如下:

其中,a,b指叶绿素a和叶绿素b;ρx为反射率;X=700, 670,500,550波段的DN值。ρx的获取过程为ρx=X/ax×cosθ,θ为太阳天顶角,θ=90-α,α可通过对应的HDF影像的属性太阳高度角SunElevation获得。

综上可知,只需通过本中间件获取HDF4文件中相应波段的DN值和属性太阳高度角Sun-Elevation即可计算出叶绿素吸收比值指数CARI的值,其他MODIS产品处理过程与此例类似。

5.2 应用实例

本节主要介绍如下内容:

(1)创建HDF4文件,并将其读入内存;

(2)为该HDF4文件添加一个用户自定义属性;

(3)创建含有多波段的三维数据集,将相应的栅格数据写入该数据集,并为其添加一个用户自定义属性;

(4)关闭该数据集以及HDF4文件。

下面为具体的例子及说明:

(1)创建一个HDF4文件,文件名为test.hdf。

int FileID=StartFile("E:\test.hdf","create")其中,第1个参数表示HDF4文件的绝对路径;第2个参数表示执行创建操作;最后返回文件ID号。

(2)向test.hdf文件中添加一个字符串类型的属性。

其中,第1个参数表示文件或数据集ID号;第2个参数表示属性名称;第3个参数表示属性值;第4个参数表示该属性的数据类型;第5个参数表示是否为文件的公共属性,如果为-1时表示该属性为文件的公共属性。

(3)创建一个三维数据集,数据集名称为firstSD。

sdsID=createThreeSD(FileID,"firstSD",4,5,6)其中,函数createThreeSD的第1个参数表示文件ID号,第2个参数表示数据集名称,后面的3个参数依次表示该数据集各维的大小。

(4)向数据集中写入数组。

WriteSDByFile(sdsID,ref data[0])

其中,第1个参数表示数据集的标识ID号;第2个参数是数组的首地址;数组data是float类型的数组;数组元素个数为120(即4×5×6)。

除了那些用途广泛的语言程序以外,目前还有多款专门用于浏览HDF文件的软件工具[12],HDF Explorer即是其中之一。图3为使用HDF Explorer打开test.hdf文件获取的该数据集中第1个波段的数据,该数据集共有6个波段,其他波段数据的显示方法与图3相同。

图3 第1个波段中的数据

(5)向数据集中添加float类型属性。

SetAttributeValue(sdsID,"testFloat","5","float",0)其中,第1个参数表示文件或数据集ID号;第2个参数表示属性名称;第3个参数表示属性值;第4个参数表示该属性的数据类型;第5个参数表示数据集名称,如果为0时表示该属性为数据集属性。

(6)先后关闭数据集以及文件。

EndSD(sdsID)

status=EndFile(FileID)

执行过上述步骤后,一个简单的实例完成。从以上例子可以看出,该中间件的引入使C#开发人员可以直接创建多数据集、多波段的HDF4文件,可以完整地对HDF4文件进行操作。

6 结束语

HDF4文件为MODIS数据常用的存储形式,全球许多国家和地区都在使用MODIS数据。HDF4文件是遥感图像的一种,由于它可以存储不同类型的数据,得到了较广泛的应用。目前,只有C语言和Fortran语言可以直接读写HDF4文件,其他语言则不能方便地读写HDF4文件。本文以C#为例,设计一种能够使C#直接访问HDF4文件的中间件,解决基于C#语言读写多数据集HDF4文件与普通数据类型向高级语言常用数据类型转换的问题,并通过进一步的封装,有效地提高了编程效率。

随着对HDF4文件的进一步探索,将在以下两方面继续对HDF4文件的读写进行研究:(1)对HDF4文件的另外5种数据类型进行研究,完善由C #语言操作HDF4文件的问题,为C#语言处理HDF4文件提供更方便、更高效的接口;(2)根据本文的设计理念,构造出一种面向多种常用语言的HDF4文件数据集的通用中间件。

[1]王继成,蒋狄微,谢智剑.基于GDAL的HDF文件格式栅格数据提取的研究[J].计算机技术与信息发展, 2011,(8):63-64.

[2]路文海.IDL语言处理HDF格式遥感数据的研究[J].海洋信息技术,2006,(3):6-8.

[3]王永韬,刘良明.HDF5格式特点及其对遥感数据格式标准化的几点启示[J].国土资源遥感,2005,(3): 39-43.

[4]申 焕,石晓春,胡勇修.利用GDAL扩展ArcGIS Engine对HDF文件的支持[J].测绘地理信息,2013, (3):43-45.

[5]Duerr R E,Cao P,Crider J,et al.Ensuring Long-term Access to Remotely Sensed Data with Layout Maps[J].IEEE Transactions on Geoscience and Remote Sensing, 2009,47(1):123-129.

[6]焦 飞,黄天文.基于.NET的HDF光栅图像数据的读取与处理[J].计算机系统应用,2007,(10):48-51.

[7]史 磊,张 柯,洪俊光.基于HDF4格式的MODIS 1B影像数据读取的算法研究[J].巢湖学院学报, 2008,(3):73-76.

[8]张 莉,曾致远.基于HDF4文件格式的MODIS 1B影像数据提取的研究与实现[J].国土资源遥感, 2004,(4):27-32.

[9]国家MODIS数据中心.安全数据表SDS[EB/OL].(2012-03-10).http://satellite.cma.gov.cn/PortalSite/ eos/format1b2.html.

[10]HDF4.HDF5/Tools API Specification[EB/OL].(2014-01-08).http://www.hdfgroup.org/products/hdf4.

[11]NCSA.HDF4.2.9 User's Guide.pdf[EB/OL].(2013-02-10).http://www.hdfgroup.org/doc.html.

[12]白 龙,雷 惠,张 翾.用MATLAB读取HDF格式数据的实用方法[J].仪器仪表学报,2010,(8):434-438.

编辑 顾逸斐

Design and Implementation of HDF4 File Access Middleware

SHEN Xiajiong1a,1b,MA Rui1a,HAN Daojun1a,1b,ZHOU Bing1a,2
(1a.School of Computer and Information Engineering;b.Institute of Data and Knowledge Engineering, Henan University,Kaifeng 475004,China;2.Institute of Image Processing and Pattern Recognition,Kaifeng 475004,China)

HDF4 files are used to store the data of Moderate-resolution Imaging Spectroradiometer(MODIS)products, and it can store various types of data,but its data structure is complex.At present,the function libraries of HDF4 file which are developed by HDF GROUP can only be used in Fortran and C language,other programming languages lack the method of reading and writing HDF4 file systematically.Although ArcGIS supports most of the raster data,it does not support multiple data sets hierarchical storage of HDF data format.This thesis designs a middleware based on C#language of operating HDF4 file,and it solves some problems such as ArcGIS unable to create multiple datasets HDF4 file,and it introduces the core idea and the concrete application of the middleware instances.This middleware is applied in environmental protection of the ecological environment of remote sensing products production system project,and it solves some problems such as C#language unable to create multiple datasets HDF4 file when handing MODIS product data,and it verifies the practicality.

HierarchicalDataFormat(HDF);scientificdataset;middleware;Moderate-resolutionImaging Spectroradiometer(MODIS);raster data;C#language

沈夏炯,马 瑞,韩道军,等.HDF4文件访问中间件的设计与实现[J].计算机工程,2015, 41(3):278-282,286.

英文引用格式:Shen Xiajiong,Ma Rui,Han Daojun,et al.Design and Implementation of HDF4 File Access Middleware[J].Computer Engineering,2015,41(3):278-282,286.

1000-3428(2015)03-0278-05

:A

:TP311

10.3969/j.issn.1000-3428.2015.03.052

国家自然科学基金资助项目(61272545);河南省科技厅科技攻关计划基金资助项目(142102210390);河南省教育厅自然科学基金资助项目(13B520918)。

沈夏炯(1963-),男,教授、博士,主研方向:空间数据处理;马 瑞,硕士研究生;韩道军、周 兵,副教授、博士。

2014-04-01

:2014-05-06E-mail:15093617922@163.com

猜你喜欢
数据类型中间件函数
二次函数
详谈Java中的基本数据类型与引用数据类型
第3讲 “函数”复习精讲
二次函数
函数备考精讲
如何理解数据结构中的抽象数据类型
RFID中间件技术及其应用研究
基于VanConnect中间件的设计与开发
基于SeisBase模型的地震勘探成果数据管理系统设计
中间件在高速公路领域的应用