NetCDF

NetCDF:Network Common Data Format,网络通用数据格式。

NetCDF是由美国大学气象研究协会的Unidata项目科学家针对科学数据的特点开发的一种面向数组的数据描述和编码标准。非常适合通过网络进行共享。

NetCDF和zip、jpeg、bmp文件格式类似,都是一种文件格式的标准。NetCDF文件开始时目的是用于存储气象科学中的数据,现在已经成为许多数据采集软件生成文件的格式。利用NetCDF可以对网络数据进行高效地存储、管理、获取和分发等操作。由于其灵活性,能够传输海量的面向阵列(array-oriented)数据,目前广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。

从数学上来说,netcdf存储的数据就是一个多自变量的单值函数。用公式来说就是f(x,y,z,...)=value,函数的自变量x,y,z等在netcdf中叫做维(dimension)或坐标轴(axis),函数值value在netcdf中叫做变量(Variables)。而自变量和函数值在物理学上的一些性质,比如计量单位(量纲)、物理学名称等等在netcdf中就叫属性(Attributes)。

从数学的角度去理解,NetCDF存储的数据就是一个多自变量的单值函数,用公式来说就是f(x,y,z)=value,函数的自变量在NetCDF中叫做维(Diemnsion),函数值在NetCDF叫做变量(Variables),自变量和函数值所代表的含义,例如单位等,在NetCDF中叫做属性(Attributes)。

相关网站:

一、文件格式

NetCDF文件的拓展名为.nc,文件中包含维、变量、属性三种描述类型,每种类型都会被分配一个名字和一个ID。

  1. 变量(Variables)

变量对应着真实的物理数据。比如我们家里的电表,每个时刻显示的读数表示用户的到该时刻的耗电量。这个读数值就可以用netcdf里的变量来表示。它是一个以时间为自变量(或者说自变量个数为一维)的单值函数。再比如在气象学中要作出一个气压图,就是“东经xx度,北纬yy度的点的大气压值为多少帕”,这是一个二维单值函数,两维分别是经度和纬度。函数值为大气压。

从上面的例子可以看出,netcdf中的变量就是一个N维数组,数组的维数就是实际问题中的自变量个数,数组的值就是观测得到的物理值。变量(数组值)在netcdf中的存储类型有六种,ascii字符(char) ,字节(byte), 短整型(short), 整型(int), 浮点(float), 双精度(double). 显然这些类型和C语言中的类型一致。

  1. 维(Dimensions)

一个维对应着函数中的某个自变量,或者说函数图象中的一个坐标轴,在线性代数中就是一个N维向量的一个分量(这也是维这个名称的由来)。在netcdf中,一个维具有一个名字和范围(或者说长度,也就是数学上所说的定义域,可以是离散的点集合或者连续的区间)。在netcdf中,维的长度基本都是有限的,最多只能有一个具有无限长度的维。

  1. 属性(Attributes)

属性对变量值和维的具体物理含义的注释或者说解释。因为变量和维在netcdf中都只是无量纲的数字,要想让人们明白这些数字的具体含义,就得靠属性这个对象了。

在netcdf中,属性由一个属性名和一个属性值(一般为字符串)组成,例如:

***
Variables:
float longitude(lon=361);
    :units = "degress_east";
float latidude(lat=281);
    :units = "degress_north";
***

longitude和latidude是已经定义好的变量(Variable),即纬度和经度,冒号后面的units就是属性名,表示物理单位,=后面的就是units这个属性的值,分别为degress_east、degress_north,即东经和北纬。

  1. 数据(data)

NetCDF支持的数据类型是char,byte,short,int。float或者real,double。NetCDF接口对数据的访问是直接访问的。

四、举个例子

netcdf文件如下:

netcdf simple_xy {
dimensions:
x = 6 ;
y = 12 ;
variables:
int data(x, y) ;
data:
data =
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71 ;
}

这个结构包括三个部分

1、维的定义,以dimensions:关键字开头

dimensions:
x = 6 ;
y = 12 ;

定义了两个轴(或者说两维),名字分别为x和y,x轴的长度(准确的说是坐标点的个数)为6, y轴的长度为12。

2、变量的定义:以variables:开头

variables:
int data(x, y);

定义了一个以x轴和y轴为自变量的函数data,数学公式就是f(x,y)=data,注意维出现的顺序是有序的,它决定data段中的具体赋3、数据的定义,以data:开头

data:
data =
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71;

这个段数据用数学的函数公式f(x,y)=data来看,就是

x=0,y=0时,data = 0;
x=0,y=1时,data = 1;
x=5,y=11是,data=71;

二、Java读取

需要用的依赖包:https://www.unidata.ucar.edu/

具体的看JavaDocs,不同版本之间差异较大,不在此处赘述。

最后修改:2021 年 12 月 30 日
如果觉得我的文章对你有用,请随意赞赏