netCDF
网络通用数据格式
NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。NetCDF广泛应用于大气科学、水文、海洋学环境模拟地球物理等诸多领域。用户可以借助多种方式方便地管理和操作 NetCDF 数据集
简介
对程序员来说,它和zip、jpeg、bmp文件格式类似,都是一种文件格式的标准。netcdf文件开始的目的是用于存储气象科学中的数据,已经成为许多数据采集软件的生成文件的格式。利用NetCDF可以对网格数据进行高效地存储、管理、获取和分发等操作。由于其灵活性,能够传输海量的面向阵列(array-oriented)数据,广泛应用于大气科学、水文、海洋学环境模拟地球物理等诸多领域,例如,NCEP(美国国家环境预报中心)发布的再分析资料,NOAA的CDC(气候数据中心)发布的海洋与大气综合数据集(COADS)均采用NetCDF作为标准。
从数学上来说,netcdf存储的数据就是一个多自变量的单值函数。用公式来说就是f(x,y,z,...)=value,函数的自变量x,y,z等在netcdf中叫做维(dimension)或坐标轴(axis),函数值value在netcdf中叫做变量(Variables).而自变量和函数值在物理学上的一些性质,比如计量单位(量纲)、物理学名称等等在netcdf中就叫属性(Attributes).
NetCDF软件实现形式是一个免费的NetCDF 软件包 ,内含可访问 NetCDF 数据的工具程序和多种语言的接口函数库。
数据结构
NetCDF数据集(文件名后缀为.nc) 的格式不是固定的,它是使用者根据需求 自己定义的。一个NetCDF数据集包含维(dimensions)、变量(variables)和属性(attributes)三种描述类型,每种类型都会被分配一个名字和一个ID,这些类型共同描述了一个数据集,NetCDF库可以同时访问多个数据集,用ID来识别不同数据集。变量存储实际数据,维给出了变量维度信息,属性则给出了变量或数据集本身的辅助信息属性,又可以分为适用于整个文件的全局属性和适用于特定变量的局部属性,全局属性则描述了数据集的基本属性以及数据集的来源。一个NetCDF文件的结构包括以下对象:
数据特点
1、自描述性:它是一种自描述的二进制数据格式,包含自身的描述信息;
2、易用性:它是网络透明的,可以使用多种方式管理和操作这些数据;
3、高可用性:可以高效访问该数据,在读取大数据集中的子数据集时不用按顺序读取,可以直接读取需要访问的数据;
4、可追加性:对于新数据,可沿某一维进行追加,不用复制数据集和重新定义数据结构
5、平台无关性:NetCDF数据集支持在异构的网络平台间进行数据传输数据共享。可以由多种软件读取并使用多种语言编写,其中包括C语言,C++,Fortran,IDLPython,Perl和Java语言等。
文件内容
1、变量(Variables)变量对应着真实的物理数据。比如我们家里的电表,每个时刻显示的读数表示用户的到该时刻的耗电量。这个读数值就可以用netcdf里的变量来表示。它是一个以时间为自变量(或者说自变量个数为一维)的单值函数。再比如在气象学中要作出一个气压图,就是“东经xx度,北纬yy度的点的大气压值为多少帕”,这是一个二维单值函数,两维分别是经度和纬度。函数值为大气压。
从上面的例子可以看出,netcdf中的变量就是一个N维数组,数组的维数就是实际问题中的自变量个数,数组的值就是观测得到的物理值。变量(数组值)在netcdf中的存储类型有六种,ascii字符(char),字节(byte),短整型(short),整型(int),浮点(float),双精度(double).显然这些类型和c中的类型一致,搞C的朋友应该很快就能明白。
2、维(dimension)一个维对应着函数中的某个自变量,或者说函数图象中的一个坐标轴,在线性代数中就是一个N维向量的一个分量(这也是维这个名称的由来)。在netcdf中,一个维具有一个名字和范围(或者说长度,也就是数学上所说的定义域,可以是离散的点集合或者连续的区间)。在netcdf中,维的长度基本都是有限的,最多只能有一个具有无限长度的维。
3、属性(Attribute)属性对变量值和维的具体物理含义的注释或者说解释。因为变量和维在netcdf中都只是无量纲的数字,要想让人们明白这些数字的具体含义,就得靠属性这个对象了。
在netcdf中,属性由一个属性名和一个属性值(一般为字符串)组成。比如,在某个cdl文件(cdl文件的具体格式在下一节中讲述)中有这样的代码段
前面的temperature是一个已经定义好的变量(Variable),即温度,冒号后面的units就是属性名,表示物理单位,=后面的就是units这个属性的值,为“celsius”,即摄氏度,整个一行代码的意思就是温度这个物理量的单位为celsius,很好理解。
接口函数库
NetCDF 接口函数库是提供给用户以编程方式访问 NetCDF 数据的工具。NetCDF 数据的接口函数库有支持诸如 C、C+ +和Fortran等语言的不同版本 。对于Fortran 语言 ,Unidata 又提供分别支持 F77 和 F90标准的接口函数库 ,后者是在前者基础上的进一步封装 ,其包含的库函数更少 ,更便于编程 ;主流的 Fortran 编译器都支持 F90 标准。因此 ,本文只介绍支持 Fortran 90 版本的接口函数库。
Fortran 90 版本的接口函数库只包含 26 个库函数 ,对应于 NetCDF 文件结构 ,可分为以下 4 类 :
①文件处理函数 ,实现以写或创建的形式打开文件 ,关闭文件等。
②变量处理函数 ,实现变量的定义或检索 ,包括定义或检索变量名、变量 ID。
维数处理函数 ,实现维数的定义或检索 ,包括定义或检索维数名称、维数 ID。
④属性处理函数 ,实现属性的定义或检索。
文件读写
1、在命令行下读写netcdf文件
⑴建立一个simple_xy.cdl文件,内容就是上一节“CDL结构”中的第一个例子。
⑵用ncgen.exe工具(下载地址见前面的第二节)建立netcdf文件:①将ncgen所在目录加到系统path变量中或者直接将ncgen.exe拷到simple_xy.cdl所在目录下;②执行ncgen-osimple_xy.ncsimple_xy.cdl生成netcdf格式文件simple_xy.nc;
⑶生成的simple_xy.nc是一个二进制文件,要想从这个文件中还原出数据信息,就要用ncdump工具:①将ncdump所在目录加到系统path变量中或者直接将ncdump.exe拷到simple_xy.nc所在目录下;②在命令行下执行ncdumpsimple_xy.nc,这时屏幕的输出和simple_xy.cdl内容完全一样。说明文件读写操作都是正确的。
2、编程读写netcdf文件
前面我们知道如何手工去建立和读取netcdf文件,下面我们来看看如何在程序中用代码实现netcdf文件的建立和分析。我的编程环境为win2000vc6.0并安装了vcsp6补丁包。
⑴将netcdf的源代码解压。我们将用到里面的libsrc etcdf.h头文件
⑵在vc6中建立一个空的win32控制台项目.名字为SimpleXyWrite,这个项目用来建立netcdf文件
cpp;③netcdf预编译包中的netcdf.dll文件和netcdf.lib文件
⑷把netcdf.h文件和simple_xy_wr.cpp加入到项目的文件列表中(具体菜单操作project->addtoproject->files)
⑸把netcdf.lib加入到项目的lib列表中(具体菜单操作project->addtoproject->settings->Link->object/librarymodules)
编译并运行这个项目,会在项目目录下生成一个simple_xy.nc文件,其内容和我们手工生成的文件内容完全一样。
3、用ncgen命令自动生成c代码给定了simple_xy.cdl文件后,可以ncgen-csimple_xy.cdl命令直接在屏幕上输出c代码。不过,这个办法只限于cdl的数据比较简单时才可以采用。
参考资料
最新修订时间:2024-06-01 19:22
目录
概述
简介
参考资料