netcdf介绍及在C语言中应用.doc_第1页
netcdf介绍及在C语言中应用.doc_第2页
netcdf介绍及在C语言中应用.doc_第3页
netcdf介绍及在C语言中应用.doc_第4页
netcdf介绍及在C语言中应用.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NetCDF介绍NetCDF介绍目录一、NetCDF文件介绍21、简介22、netCDF优点23、NetCDF缺点2二、NetCDF文件结构31、结构描述32、结构之间的内在联系3三、NetCDF 接口函数库41、NetCDF 接口函数库42、C版本的NetCDF 数据的接口函数库简介5四、总结5五、附录:6一、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 中的类)无法建立,故对于复杂的原数据也是无法自说明的。(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。netCDF数集的创建,首先定义维,紧接着定义变量,再定义变量的属性。变量的定义要依赖于之前所定义的维。在定义变量时要指明变量的类型,变量所占空间的大小,它可以是一个向量,矩阵,三维数组,或更多维。它的每一维的长度都依赖于前面所定义的维,在定义时直接取所依赖的维的ID即可,如例一,变量Ele的定义依赖于维lay的ID。如果所要定义的变量是个矩阵,它的每一维的长度值也都来自前面所定义的维,将所以赖的两个维的ID放到一个数组里,便可以用此来确定变量的空间大小,如例二,变量Ref的空间大小是由维RadNum和RbNum共同来确定的。首先创建一个Dataset,文件名为foo.nc。ID号为:ncidstatus = nc_create(foo.nc, NC_SHARE, &ncid);if (status != NC_NOERR) handle_error(status);例一: 定义一个维,名为lay,ID号为:layid status = nc_def_dim(ncid, lay, 25, &layid);if (status != NC_NOERR) handle_error(status);定义一个一维变量,名为Ele,ID号为:Eleidstatus = nc_def_var (ncid, Ele, NC_INT, 1, &layid, &Eleid);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号为:Refidint Ref_dimids2;Ref_dimids0 = RadNumid; Ref_dimids1 = RbNumid;status = nc_def_var (ncid, Refnamei, NC_UBYTE, 2, Ref_dimids, &Refidi); (其中第四项的2代表定义的变量Ref是二维变量)if (status != NC_NOERR) handle_error(status);属性分为全局属性、变量所对应的属性。全局属性与整个netCDF数集有关。如netCDF数集的标题,历史。变量所对应的属性,是针对变量而定义的,根据变量的ID设置变量属性。 (2)该结构对于数据读取的方便性NetCDF 读取数据时,直接读取所需要的数据就可以了。 若我们预先知道了某个维,变量,或属性的名字,我们可以直接根据名字得到它的ID,然后用ID便可以得到它的值。如例三。例三:在上面的foo.nc文件中例一,假定我们已经知道有个维它的名字是lay,那么我们通过下面的程序便可直接得到它的值。status = nc_inq_dimid(ncid,lay,&layid); 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。 变量处理函数,实现变量的定义或检索,包括定义或检索变量名、变量ID。 属性处理函数,实现属性的定义或检索。2、C版本的NetCDF 数据的接口函数库简介 (1)文件处理函数 NetCDF数集的创建:nc_create NetCDF数集的打开:nc_open NetCDF数集的关闭:nc_close (2)维处理函数 维的定义:nc_def_dim维的查询:nc_inq_dimid、nc_inq_dim Family维的重新命名:nc_rename_dim(3)变量处理函数 变量的定义:nc_def_var 变量的查询:nc_inq_varid、nc_inq_var Family 变量赋值:nc_put_var1/vars/vara/varm 变量的读取:nc_get_var1/vars/vara/varm 变量的重新命名:nc_rename_var 变量的复制:nc_var_copy(4)属性处理函数 属性的创建:nc_put_att 属性的查询:nc_inq_att Family 属性的读取:nc_get_att 属性的重新命名:nc_rename_att 属性的复制:nc_att_copy 属性的删除:nc_del_att四、简单的雷达数据资料模型设计NetCDF包括3个部分:维数,变量和属性。这3个部分相互参照、相互联系,构成NetCDF数据模型,见图l。Datasetlocation:URLnc.open()Attributename:Stringvalue:1D Arraytype:DataTypeDimensionname:Stringlength:intisUnlimited()Variablename:Stringshape:dimensionstype:DataTypeData Typebytecharshortint floatdouble 图1 NetCDF数据模型图图1中Dataset表示NetCDF文件数据集,由3个部分组成:属性(attributes)、变量(variables)和维数(dimensions)。其中,变量用于存放数据;维数用于指定气象资料在多维空间中形状;属性可以分为2类:一类为变量属性,用于对气象数据变量的名称、缺省值、单位以及格式等性质进行说明,另一类为全局属性,用于数据集的整体说明,如发布数据集的时间和机构,数据集遵循的约定等。图1只是给出了NetCDF的抽象数据模型,但将该抽象的数据模型具体应用到不同的维数、不同结构的气象资料上,还需要更为详细的数据模型设计。以下将给出1种简单的雷达资料数据模型设计。为了便于清楚地表示数据模型,在此用C语言描述。1、 简单的雷达数据资料Datasetradar.ncDimensionlayRadNumRbNumRbLenAttributeunitvariableEleRef 图2 简单的雷达数据资料模型图说明:文件名:radar.nc维:lay:扫描层数,RadNum:各层的径向数,RbNum:每个径向上的距离库数,RbLen:各层的距离库库长。变量:Ele:扫描层的仰角,Ref:每层的反射率数据。属性:unit:单位.2、具体的C语言程序假定cut里存放的是扫描层数,RadNum里存放的是各层的径向数,RbNum里存放的是每个径向上的距离库数,RbLen里存放的是各层的距离库库长。iEle里存放的是各个扫描层的仰角。data里存放的是所有扫描层的反射率数据。现在我们要按照上面的模型将这些数据存放到radar.nc文件中。具体程序如下:#include stdafx.h#include #include string.h#include netcdf.hvoid handle_error(int status);int _tmain(int argc, _TCHAR* argv) unsigned short int cut;unsigned short int *RadNum = new unsigned short intcut;unsigned short int *RbNum = new unsigned short intcut;unsigned short int *RbLen = new unsigned short intcut; short int *Ele = new short intcut;unsigned char *data = new unsigned charle;int status;int ncid;int layid;int *RadNumid = new int cut;int *RbNumid = new int cut; int *RbLenid = new int cut;int *Refid = new int cut;int Eleid;char RadNname10 = RadNum1,RadNum2,RadNum3,RadNum4,RadNum5,RadNum6,RadNum7,RadNum8,RadNum9,RadNum10,RadNum11,RadNum12,RadNum13,RadNum14,RadNum15,RadNum16,RadNum17,RadNum18,RadNum19,RadNum20,RadNum21,RadNum22,RadNum23,RadNum24,RadNum25,RadNum26,RadNum27,RadNum28,RadNum29,RadNum30;char RbNname10 = RbNum1,RbNum2,RbNum3,RbNum4,RbNum5,RbNum6,RbNum7,RbNum8,RbNum9,RbNum10,RbNum11,RbNum12,RbNum13,RbNum14,RbNum15,RbNum16,RbNum17,RbNum18,RbNum19,RbNum20,RbNum21,RbNum22,RbNum23,RbNum24,RbNum25,RbNum26,RbNum27,RbNum28,RbNum29,RbNum30;char RbLname10 = RbLen1,RbLen2,RbLen3,RbLen4,RbLen5,RbLen6,RbLen7,RbLen8,RbLen9,RbLen10,RbLen11,RbLen12,RbLen13,RbLen14,RbLen15,RbLen16,RbLen17,RbLen18,RbLen19,RbLen20,RbLen21,RbLen22,RbLen23,RbLen24,RbLen25,RbLen26,RbLen27,RbLen28,RbLen29,RbLen30;char Refname10 = Ref1,Ref2,Ref3,Ref4,Ref5,Ref6,Ref7,Ref8,Ref9,Ref10,Ref11,Ref12,Ref13,Ref14,Ref15,Ref16,Ref17,Ref18,Ref19,Ref20,Ref21,Ref22,Ref23,Ref24,Ref25,Ref26,Ref27,Ref28,Ref29,Ref30;/ Create a NetCDF Dataset radar.ncstatus = nc_create(radar.nc, NC_SHARE, &ncid);if (status != NC_NOERR) handle_error(status); / Create Dimension laystatus = nc_def_dim(ncid, lay, cut, &layid);if (status != NC_NOERR) handle_error(status); / Create variable Elestatus = nc_def_var (ncid, Ele, NC_INT, 1, &layid, &Eleid);if (status != NC_NOERR) handle_error(status);int i = 0;for (i=0;icut;i+) / 定义维:个层的径向数status = nc_def_dim(ncid, RadNnamei, RadNumi, &RadNumidi); if (status != NC_NOERR) handle_error(status); / 定义维:各层径向上距离库数status = nc_def_dim(ncid, RbNnamei, RbNumi, &RbNumidi);if (status != NC_NOERR) handle_error(status); / 定义维:各层径向的距离库库长status = nc_def_dim(ncid, RbLnamei, RbLeni, &RbLenidi);if (status != NC_NOERR) handle_error(status); /定义变量:反射率 int Ref_dimids2;Ref_dimids0 = RadNumidi; Ref_dimids1 = RbNumidi;status = nc_def_var (ncid, Refnamei, NC_INT, 2, Ref_dimids, &Refidi);if (status != NC_NOERR) handle_error(status); /定义属性:/*status = nc_put_att_text(ncid,Refidi,compresstion,strlen(ref),ref);if (status != NC_NOERR) handle_error(status);*/nc_enddef(ncid); /退出定义模式 / 为变量Ele赋值int *iEle = new intcut;for (i=0; icut; i+)iElei = Elei;status = nc_put_var_int(ncid, Eleid, iEle);if (status != NC_NOERR) handle_error(status); / 为变量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论