netcdf数据结构解析


从一个实例在解析netcdf数据格式:

这是使用netcdfui打开netcdf文件的截图,在左边,描述了这个文件中包含了哪些变量和纬,可以看到这个文件包含了三个维度和四个变量,在右边,分别描述了四个变量的具体信息,这个在我之前的日志中有详细说明,略去一部分,要注意的是,在dimensions这一列中列出了这个变量需要的维度,在netcdf中,要得到变量的值就必须要给出这个变量的各个维度的值,然后才会将具体的值返回来,就相当于一个函数,给定需要的参数,返回函数值,所以,这里的变量叫成函数名更为贴切。

维和变量的关系,我们知道,函数的参数(维度)都是有取值范围,如果超过了取值范围,就取不到值,比如说有一个变量:温度(经度,维度),如果你给出的经度维度是负数,肯定不行啦,所以在netcdf的某个地方肯定会对这个进行描述,但是我们对于维度了解的信息就只有名字、长度,没了,但是我负责任地告诉你,这个就是维度的两个最有价值的信息,长度就是这个维度的取值范围,要知道,维度并没有数据类型的信息,netcdf规定了维度就是一系列的整型数字。从0开始,单调增长,但是如果我的参数是时间呢?是高度呢?这些肯定不可能刚好都是整型,而且都会有单位,这些信息都放在哪里呢?不管如何,想要从维度这里拿到这些信息是不可能的,维度就是老老实实的一堆整型数字,现在来解答这个问题,观察上图的“pr”这个变量:pr(t,yx),注意观察,发现这里涉及到的维度都有一个同名的变量,t(t),y(y),x(x),括号里面是维度,维度就是一系列的整型数字,我要获得编号为1的时间就是t(1),依此类推,那么我们怎么取得pr的值呢?和t这个变量一样,只能根据编号来获取,比如pr(1,4,2),疑问又来了,这样获取数据没有意义,我们要的是根据实际的时间和xy坐标来获取pr值呀,没问题,你只要知道tyx这三个变量在各个编号下的真实数值(比如当维度t=1时,变量t=2012-8-20),在往pr中取值的时候将具体的值转换成编号就可以了(比如根据前面说的,要获取2012-8-20这个时候的pr值,对应的t就为1啦),呵呵,说了等于没说,但是如果你真的要用真实数值取值,只能如此,现在能理解为什么说维度的长度就是取值范围了吧(随便不是和准确,但是那个意思),那我们在具体工作中要怎样使用呢?这里说说我的理解,由于我使用netcdf就只是用在气象方面,而,在netcdf下,有一个子数据格式叫做grid,之所以叫做子数据格式,是因为,grid归根结底还是netcdf,只不过他的数据组织还有一些额外的要求:必须要有代表经度和维度的变量,其实grid在这里可以理解成栅格,栅格其实就是图像,也就是说,grid这种数据格式最终以图形的形式展现是最合适的,栅格就是一个N*N列的网格,然后每个网格填充上不同的颜色就成为了一副图像,入股赋予这这些格子经度和维度的信息就可以展示在地图上了,现在用我的角度来描述一下grid数据渲染成栅格的过程:

For(int i=0;i<grid.width;i++){

         For(int j=0;j<grid.height;j++){

         Double lon=lon(j);

         Double lat=lat(i);

         Object val=f(I,j);//这里的f是变量名的意思,上面的也一样

         //然后我们根据经度lon和维度lat在栅格里面找到对应的位置,然后将val的值以颜色填充上去……

}

}

经过上面的过程一副栅格图像就出来了,然后我来说一下我上面那个伪代码操作的伪netcdf数据的元数据信息:有三个变量:lonlatval,还有两个维度:lonlat,在netcdf中还有attitude这个概念,在lonlat这两个变量(不是维度)的属性中可以指定他们是这个grid的经度和维度,这样,程序就可以根据这些信息将他们展示成一幅图片了。相信可以解答上面提到的,怎样根据真实数据获取数据的疑问了,呵呵,这里只能给出我的理解。

希望这个可以给研究netcdf的朋友一点帮助

你可能感兴趣的:(netcdf,气象)