NetCDF介绍
NetCDF介绍
目录
一、NetCDF文件介绍 ..................................................................................................................... 2
1、简介 .................................................................................................................................... 2 2、netCDF优点 ....................................................................................................................... 2 3、NetCDF缺点 ....................................................................................................................... 2 二、NetCDF文件结构 ..................................................................................................................... 3
1、结构描述 ............................................................................................................................ 3 2、结构之间的内在联系 ........................................................................................................ 3 三、NetCDF 接口函数库 ................................................................................................................ 5
1、NetCDF 接口函数库 .......................................................................................................... 5 2、C版本的NetCDF 数据的接口函数库简介 ...................................................................... 6 四、总结 .......................................................................................................................................... 6 五、附录: .................................................................................................... 错误!未定义书签。
1
NetCDF介绍
一、NetCDF文件介绍
1、简介
NetCDF(Network Common Data Form,通用的网络数据格式)是由美国大学大气研究协会UCAR(University Cooperation for AtmosphereResearch)下Unidata项目科学家针对科学数据的特点,提出的一种面向数组型数据,适于网络共享的数据描述和编码标准。其用意是在Unidata计划中不同的应用项目下,提供~种可以通用的资料存取方式,资料的形状包括单点的观测值、时间序列、规则排列的网格,以及人造卫星或雷达的影像文件。其软件实现形式是一个免费的NetCDF软件包,内含可访问NetCDF数据的工具程序和多种语言的接口函数库。
它独立于机器并用于保存科学数据,同时也是一个数据类库接口,该数据类库包含了访问数组格式的功能。这种格式的接口、类库都支持产生、访问和共享科学数据。
2、netCDF优点
(1)、可以使用统一的接口来直接读写不同的气象资料,方便数据的管理。 (2)、NetCDF格式文件具有自描述性,即NetCDF不仅包含了数据资料,还包括了描述数据特征的属性,这也是网络时代数据的趋势性特征。
(3)、平台无关性。即NetCDF文件支持在不同平台间的数据传输,这使得NetCDF文件易于网络中共享。
(4)、目前NetCDF最大可以支持2G的文件,且具有较高的数据存储效率。 (5)、易用性,有丰富的第三方软件操作NetCDF文件,如Grads、Matlab和IDL等。 (6)、可用性高,表示其较高的数据压缩比,以及基于数组下标的线性存储导致的高效存取。
(7)、方便数据的读取。
3、NetCDF缺点
(1)、只能有一个维可变化,因此非方型的数组难以存储
(2)、虽然说是完全自说明的,但是一个变量仅能有几种基本类型的属性变量,复杂的属性变量(如像C 中的类)无法建立,故对于复杂的原数据也是无法自说明的。
2
NetCDF介绍
(3)、不支持嵌套结构。
(4)、不支持同时访问,一个文件一次只能由一个用户访问,不支持多用户同时访问
二、NetCDF文件结构
NetCDF是一种二进制、自描述的文件格式,不需要其他文件来对它进行描述。每个NetCDF文件具备如下所示的结构,其中包含维数、变量、属性和数据4个子域,其中属性又分为适用于整个文件的全局属性和适用于特定变量的局部属性。
1、结构描述
一个netCDF数据集包含维、变量和属性三种描述类型,维、变量和属性都会被分配一个名字和一个ID,这些类型共同描述了一个数据集,netCDF库可以同时访问多个数据集,这时就是用ID来识别的。
dimensions(维):
一个维可以用来代表一个真实的物理空间,例如时间、纬度、经度或者高度。维也可以用来代表其他的属性,例如观测站点、模式运行版本号等。一个NetCDF的维有一个名字和长度,维的长度必须是一个正整数。
variables(变量):
在NetCDF数据集中,变量是用来存放数据块的。NetCDF数据集里的变量一般都是数组变量。一个变量代表着具有相同的数据类型的数组的值。每个变量都有一个名字、一个数据类型和数组形状。
attributes(属性):
NetCDF的属性是用来对数据进行辅助说明,存放关于数据的数据,例如变量的单位,在很多方面和数据字典中的信息很像。
data(数据):
NetCDF支持的数据类型是char,byte,short,int。float或者real,double。NetCDF接口对数据的访问是直接访问的。
2、 结构之间的内在联系
(1)内在联系
维、变量、属性三者之间联系十分紧密,并且三者的定义都依赖于所创建的Dataset的ID。
3
NetCDF介绍
netCDF数集的创建,首先定义维,紧接着定义变量,再定义变量的属性。 变量的定义要依赖于之前所定义的维。在定义变量时要指明变量的类型,变量所占空间的大小,它可以是一个向量,矩阵,三维数组,或更多维。它的每一维的长度都依赖于前面所定义的维,在定义时直接取所依赖的维的ID即可,如例一,变量Ele的定义依赖于维lay的ID。如果所要定义的变量是个矩阵,它的每一维的长度值也都来自前面所定义的维,将所以赖的两个维的ID放到一个数组里,便可以用此来确定变量的空间大小,如例二,变量Ref的空间大小是由维RadNum和RbNum共同来确定的。
首先创建一个Dataset,文件名为foo.nc。ID号为:ncid status = nc_create(\if (status != NC_NOERR) handle_error(status); 例一:
定义一个维,名为lay,ID号为:layid status = nc_def_dim(ncid, \
if (status != NC_NOERR) handle_error(status); 定义一个一维变量,名为Ele,ID号为:Eleid
status = nc_def_var (ncid, \if (status != NC_NOERR) handle_error(status); 例二:
下面定义了两个维,名分别为:RadNum、RbNum,ID号分别为:RadNumid、RbNumid。
status = nc_def_dim(ncid, RadNum, 255, &RadNumid); if (status != NC_NOERR) handle_error(status);
status = nc_def_dim(ncid, RbNum, 1000, &RbNumid); if (status != NC_NOERR) handle_error(status); 定义一个二维变量,名为Ref,ID号为:Refid
int Ref_dimids[2]; Ref_dimids[0] = RadNumid; Ref_dimids[1] = RbNumid; status = nc_def_var (ncid, Refname[i], NC_UBYTE, 2, Ref_dimids, &Refid[i]); (其中第四项的2代表定义的变量Ref是二维变量)
if (status != NC_NOERR) handle_error(status);
属性分为全局属性、变量所对应的属性。全局属性与整个netCDF数集有关。如netCDF数集的标题,历史。变量所对应的属性,是针对变量而定义的,根据变
4
NetCDF介绍
量的ID设置变量属性。
(2)该结构对于数据读取的方便性
NetCDF 读取数据时,直接读取所需要的数据就可以了。 ①
若我们预先知道了某个维,变量,或属性的名字,我们可以直接根据名字得到它的ID,然后用ID便可以得到它的值。如例三。
例三:在上面的foo.nc文件中例一,假定我们已经知道有个维它的名字是lay,那么我们通过下面的程序便可直接得到它的值。
status = nc_inq_dimid(ncid,\ if (status != NC_NOERR) handle_error(status); status = nc_inq_dimlen(ncid,layid,&laylen);
if (status != NC_NOERR) handle_error(status);
其中laylen就是我们所要得到的值。 ②
若我们不知道维,变量,或属性的名字,我们根据所提供的ID,便可以得知它的名字,值,类型,长度等信息。如例四。
例四:在上面例一中,假定我们不知道变量的信息,现在我们想得到ID号为0的变量的所有信息,可通过下面程序得到。
status = nc_inq_var (ncid, 0, &Varname, &Vartype, &Varndims,Vardimids, &Varnatts); if (status != NC_NOERR) handle_error(status);
其中Varname变量名,Vartype变量类型,Varndims变量的维数,Vardimids变量所以赖的维的ID号,Varnatts变量的属性。
但也就是因为这样, NetCDF 所需要的空间是很大的,因为他多了很多的变量宣告项目,与其具有既定的储存格式所致。
三、NetCDF 接口函数库
1、 NetCDF 接口函数库
NetCDF 接口函数库是提供给用户以编程方式访问NetCDF 数据的工具。NetCDF 数据的接口函数库有支持诸如C、C+ + 和Fort ran 等语言的不同版本。 函数库可分为以下4 类:
① 文件处理函数,实现以写或创建的形式打开文件,关闭文件等。
② 维数处理函数,实现维数的定义或检索,包括定义或检索维数名称、维数ID。
5