海洋信息技术6 海 洋 信 息 2006年
IDL语言处理HDF格式遥感数据的研究
路文海
1,2
(1.中国海洋大学 青岛市266003 2.国家海洋信息中心 天津市300171)
摘 要 本文分别介绍了 HDF 格式与 IDL 语言,说明了数据下载的相关问题。并以 MODIS 的 SST 数据为例,详细介绍了用 IDL 处理 HDF 格式数据和相应的制图方法。关键词 IDL HDF MODIS SST 制图
代计算机语言。它可以快速地分析数据和实现可
1 HDF 格式与 IDL 语言
1.1 HDF 格式
由美国伊利诺伊大学(the University of Illinois)的NCSA组织(The National Center for Supercomputing Applications)开发的HDF(Hierarchical data formats)文件格式是一种超文本文件格式,能够综合管理 2D、3D、矢量、属性、文本等多种信息,帮助科学家摆脱不同数据格式之间相互繁琐的转换,将更多的时间和精力用于数据分析。HDF 格式能够存储不同种类的SDS(Scientific Data Set),包括图像、数组、指针及文本数据。HDF 格式还提供命令方式,分析现存 HDF 文件的结构,并即时显示图像内容。科学家可以用这种标准数据格式快速熟悉文件结构,并能立即着手对数据文件进行管理和分析。由于 HDF 的诸多优点,这种格式已经被广泛应用于目前国外各种卫星传感器的标准数据格式。读取HDF文件的软件很多,包括 C、IDL、MATLAB、FORTRAN 等,本文以 MODIS的SST 数据为例将详细讲解用 IDL 语言读取 HDF 格式数据的方法。1.2 IDL语言
IDL (Interactive Data Language)交互式数据语言是由美国 Kodak 公司的全资子公司 RSI(Research System Inc)开发并投向市场、面向矩阵且用于数据可视化研究与应用开发的第四
收稿日期:2006 年7月3日视化。IDL 语言提供了大量的基础数据类型,能读入几乎所有的数据格式。IDL 适用于各种主要平台,如 Windows,UNIX 等,使用户在多平台环境下的数据分析变得更加容易,并确保在硬件变动的情况下,由某平台开发的程序能成功地移植到另一个平台,从而提高了程序的可移植性。本文数据处理使用的是 IDL6.1,以下简称 IDL 。
2 数据下载
2.1 数据来源
美国宇航局JPL实验室物理海洋学数据现有档案分发中心(PO.DAAC/JPL)的网站提供了大量的卫星遥感信息和资料,可以使用匿名 FTP 登陆下载数据。本文数据的FTP地址为:
ftp://128.149.225.30/sea_surface_temperature/modis/data/aqua/L3_mapped/sst/monthly/04km/2005
2.2 数据说明
MODIS (Moderate Resolution Imaging Spectroradiometer)中分辨率成像光谱仪是NASA联合其他一些科研机构开发的卫星搭载的传感器。MODIS是搭载在 EOS(Earth Observing System)AM 和 PM 卫星上的关键设备,每两天就可以提供从可见光到红外波段的地球陆地、海洋和大气的全面的全球观测数据。
SST(Sea Surface Temperature)海表温度资料是容易获得的,特别是近年来从卫星观测海
第 3 期 路文海:IDL语言处理HDF格式遥感数据的研究 7海洋信息技术表温度快速而准确,有利于海洋气候和海气相互作用的研究。本文下载了2005年1~12月的全球 4km 白天月平均温度数据。
MODIS 的 SST 数据对应着两个文件:SST 数据文件和数据质量文件。在处理数据文件时,若数据质量文件中点值不为零,则对应的 SST 数据点必须剔除掉。
strQ=reverse(strQ,2)strChina=fltarr(m,n) for i=0,m-1 do begin for j=0,n-1 do begin case strQ[i,n1+j] of 0 : begin
strChina [i,j]=(str[m1+i,n1+j]*0.01)-300 end 255: begin
strChina [i,j]=100 end else:begin
strChina [i,j]=99 end endcase endfor endfor
3 数据制图
(1)首先用 spawn 函数将所有 SST 数据名读入到 filelist 中。经常需要一次处理许多遥感数据文件,手工修改文件名工作量会相当大,IDL中提供的spawn函数可以直接调用“DOS命
令提示符”对文件名进行读取。语法为:spawn ,
‘dir /b ‘ + 文件所在目录 + 文件名(允许使用
(4)对数据做拉伸处理以增加显示度。将无效数据赋为白色,陆地部分赋为浅褐色。用户可以采用 IDL 自带色板,也可以根据需要自定义色板。命令可以加载 IDL 预定义的 41 个色板中的一个,本文采用自定义的色板。
index1=where(strChina eq 100.0) ;返回陆地点数组下标值index2=where(strChina eq 99.0) ;返回无效点数组下标值strChina =bytscl(strChina,0,35,top=191) ;数据拉伸范围(0,191)
strChina [index1]=254 ;陆地点赋值为浅褐色strChina [index2]=0 ;无效点赋值为白色
通配符), filelist
(2)读取 HDF 数据。IDL 中有很多函数可以直接读取 HDF 数据信息,下面列举 HDF 数据读取的方法,执行完下列命令后,获得数据值,即 str矩阵。
sd_id=hdf_sd_start(tempdir+ filename [i],/read) ;打开 HDF 文件
result=hdf_sd_select(sd_id,0) ;获取 SDS ID hdf_sd_getdata,result,str ;获取 SDS 数据值 hdf_sd_end,sd_id ;关闭 HDF 文件
(3)从 str 矩阵中截取中国海区(东经105°~150°,北纬5°~45°)进行处理。由于 IDL画图时默认从左下角开始,数据第一行显示在下方,最后一行显示在上方,正好和 str 矩阵存放数据顺序相反,因此需要对 str 矩阵做翻转。另外,读 HDF 属性数据时会发现转换公式:Y=slope * x + intercept ,str 矩阵要按照此公式进行转换才能得到真实值。在数据处理过程中,陆地值赋 100,无效值赋 99。实现代码如下:
m1=fix((8192/360.0) *(105+180))n1=fix((4096/180.0)*(5+90))m2=fix((8192/360.0) *(150+180))n2=fix((4096/180.0)*(45+90))m=m2-m1n=n2-n1str=reverse(str,2)
(5)用 tv 命令来显示图像。同时,为图像加上陆地、配置色板和文字标注,进行整饰输出。
图1 四月份白天西北太平洋海表面月平均温度