netCDF数据格式
netCDF缺点:
1、只能有一个维可变化,因此非方型的数组难以存储
2、虽然说是完全自说明的,但是一个变量仅能有几种基本类型的属性变量,复杂的属性变量(如像C++中的类)无法建立,故对于复杂的原数据也是无法自说明的
3、不支持嵌套结构
4、不支持同时访问,一个文件一次只能由一个用户访问,不支持多用户同时访问
netCDF数据模型
一个netCDF数据集包含维、变量和属性三种描述类型,每种类型都会被分配一个名字和一个ID,这些类型共同描述了一个数据集,netCDF库可以同时访问多个数据集,这时就是用ID来识别的。
另外,这三种类型的命名是有规则的,只能由字母组成(再加上’_',’.',’-'),而且字母是大小写敏感的,即大小写不一样时是不同的,例如,temperature和_temp都是可以的,而Temp和temp是两个不同的东西
netCDF数据集的组成
维(dimensions)
定义方法:维的名字 = 维的大小
例如:
我们要定义经度维,这个经度维含有5个经度,那么可以定义
lon = 5
定义高度维,如含有19个高度值,那么定义
level = 19
另外在一个数据集中,可以且最多可以含有一个无限大小的维,可以把它定义为unlimited。例如时间,我们一时不确定时间具体会有多少,那么我们就把时间定义为一个无限的维(unlimited dimension),如果一个变量用有一个无限的维时,那么这个变量可以无限的增长。
time = unlimited
无限的维也称为记录维(record dimension),因为netCDF系统内部是用这个维作为ID标示记录的。
变量(variable)
变量用来储存数据,使用前必须定义,包括变量的数型、维数、属性等等
数型:就是数据的类型,一般有整数型、实数型等,跟C语言中的变量类型很相似,例如,可以定义:
float temperature(time, lat, lon);
int lat(lat);
其中温度是浮点型,纬度是整型
维数:这个应该由前面已经定义好的维来定义,当一个变量没有维的定义时,很显然,这个变量只储存一个值,那么这个变量是一个标量,如果有了维的定义,那么这个变量变成类似数组的东西,可以储存多个值。
float temperature(time, lat, lon);
括号里面的就是维
坐标变量(coordinate variables)
就是一系列变量,他们的名字跟维的名字是一样的,维的定义只说明了维的大小,这里可以分别指定维具体取什么值,例如高度维我们定义有4个,那么我们可以分别把这4个高度定为1000、850、700、500这4个值,但是在内部还是以原始的方式表示,如C语言数组起始的第一个元素的索引是0,而FORTRAN中是1。
使用坐标变量的意义是,我们可以通过一些方法,用这个值来索引得我们的数据,例如netCDF库中提供的一些函数,很可能就是使用这个值来索引,NCL(NCARG Command Language)中也是直接用变量坐标的取值来索引的,例如我们要取1000高度上的数据,直接用1000来索引,而不需要像C语言的数组那样有特定的索引,必需从0开始,当然,这必须通过一些特定的函数来实现,用法如:
variables:
int level(level);
data:
level = 1000, 850, 700, 500;
属性(attributes)
变量属性(variable attributes)
一个变量可以拥有很多属性,变量的属性一般是用来说明变量本身的,如对单位、取值范围的说明等,如:
int lat(lat);
lat:units = "degrees_north";
这里说明经度的单位是度,向北递增,又如:
float rh(time,lat,lon);
rh:long_name = "relative humidity";
rh:valid_range = 0.0, 1.0;
这里说明rh的全名是relative humidity,其有效范围是0.0到1.0,注意这里的属性的值可以有多个,即可以是单一的值(标量),也可以是多个值(矢量),但是这时矢量只允许有一维。
全局属性(global attributes)
用来说明整个数据集的一些信息,和变量的attributes一样,但是定义时,前面不加变量名
:attribute_name = list_of_value;
如:
:dataset_name = "meteorology dataset";
数据(Data)
netCDF有6种原始的外部数据类型:
char 8-bit
byte 8-bit integers
short 16-bit signed integers
int 32-bit signed integers
float 32-bit IEEE floating-point
real 32-bit IEEE floating-point
double 64-bit IEEE floating-point
CDL notation
CDL表示法是一种表示netCDF文件格式的文本规范,以下是一个范例,非常容易理解
netcdf example_1 { // example of CDL notation for a netCDF dataset
dimensions: // dimension names and lengths are declared first
lat = 5, lon = 10, level = 4, time = unlimited;
variables: // variable types, names, shapes, attributes
float temp(time,level,lat,lon);
temp:long_name = "temperature";
temp:units = "celsius";
float rh(time,lat,lon);
rh:long_name = "relative humidity";
rh:valid_range = 0.0, 1.0; // min and max
int lat(lat), lon(lon), level(level);
lat:units = "degrees_north";
lon:units = "degrees_east";
level:units = "millibars";
short time(time);
time:units = "hours since 1996-1-1";
// global attributes
:source = "Fictional Model Output";
data: // optional data assignments
level = 1000, 850, 700, 500;
lat = 20, 30, 40, 50, 60;
lon = -160,-140,-118,-96,-84,-52,-45,-35,-25,-15;
time = 12;
rh =.5,.2,.4,.2,.3,.2,.4,.5,.6,.7,
.1,.3,.1,.1,.1,.1,.5,.7,.8,.8,
.1,.2,.2,.2,.2,.5,.7,.8,.9,.9,
.1,.2,.3,.3,.3,.3,.7,.8,.9,.9,
0,.1,.2,.4,.4,.4,.4,.7,.9,.9;
}
解读netCDF文件(转)
最新推荐文章于 2024-04-19 18:11:09 发布