NetCDF簡介與格式入門

最近研究大數據,用到了NetCDF文件的解析,於是搜索了網絡上的相關資源,記錄一下。

一、概述

        NetCDF全稱爲network Common Data Format,中文譯法爲“網絡通用數據格式”,它是由美國大學大氣研究協會的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官方網站:https://www.unidata.ucar.edu/software/netcdf/

        github地址:https://github.com/Unidata/netcdf-c

  NetCDF指導文檔:https://www.unidata.ucar.edu/software/netcdf/docs/index.html

三、文件格式

        NetCDF文件後綴爲.nc,文件中的數據結構包含維(dimensions)、變量(variables)和屬性(attributes)三種描述類型,每種類型都會被分配一個名字和一個ID。  

NetCDF name{
Dimensions:… //定義維數
Variables:… //定義變量
Attributes:… //屬性
Data:…//數據
}

1. 變量(Variables)

        變量對應着真實的物理數據。比如我們家裏的電錶,每個時刻顯示的讀數表示用戶的到該時刻的耗電量。這個讀數值就可以用netcdf裏的變量來表示。它是一個以時間爲自變量(或者說自變量個數爲一維)的單值函數。再比如在氣象學中要作出一個氣壓圖,就是“東經xx度,北緯yy度的點的大氣壓值爲多少帕”,這是一個二維單值函數,兩維分別是經度和緯度。函數值爲大氣壓。

        從上面的例子可以看出,netcdf中的變量就是一個N維數組,數組的維數就是實際問題中的自變量個數,數組的值就是觀測得到的物理值。變量(數組值)在netcdf中的存儲類型有六種,ascii字符(char) ,字節(byte), 短整型(short), 整型(int), 浮點(float), 雙精度(double). 顯然這些類型和C語言中的類型一致。

2. 維(Dimensions)

        一個維對應着函數中的某個自變量,或者說函數圖象中的一個座標軸,在線性代數中就是一個N維向量的一個分量(這也是維這個名稱的由來)。在netcdf中,一個維具有一個名字和範圍(或者說長度,也就是數學上所說的定義域,可以是離散的點集合或者連續的區間)。在netcdf中,維的長度基本都是有限的,最多只能有一個具有無限長度的維。
 

3. 屬性(Attributes)

        屬性對變量值和維的具體物理含義的註釋或者說解釋。因爲變量和維在netcdf中都只是無量綱的數字,要想讓人們明白這些數字的具體含義,就得靠屬性這個對象了。

        在netcdf中,屬性由一個屬性名和一個屬性值(一般爲字符串)組成。比如,在某個cdl文件(cdl文件的具體格式在下一節中講述)中有這樣的代碼段:  

temperature:units = "celsius" ;  

  前面的temperature是一個已經定義好的變量(Variable),即溫度,冒號後面的units就是屬性名,表示物理單位,=後面的就是units這個屬性的值,爲“celsius” ,即攝氏度,整個一行代碼的意思就是溫度這個物理量的單位爲celsius,很好理解。

4. 數據(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)=da  注意維出現的順序是有序的,它決定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;

發佈了20 篇原創文章 · 獲贊 49 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章