NetCDF簡介(收藏)

NetCDF是由大氣研究大學協會(UCAR) (http://my.unidata.ucar.edu)在Unidata Program中開發的。由於NetCDF是一種靈活的,自描述的,並能表達大量數組數據的格式,因此NetCDF在地球、海洋、大氣科學中得到了廣泛的應用。 一個NetCDF數據集的例子是20幅像元大小爲30KM的北美地區影像,每一幅都有自己的高程級別。每一幅柵格圖層中每個像元每小時測量一次、週期爲一年的12個大氣特徵被記錄了下來。因此,術語稱爲“多維數據”。 NetCDF的靈活性允許數據提供者和用戶創建NetCDF模式來滿足自己特殊的需求。這種靈活性的不利方面是有許多各種各樣的NetCDF模式在使用,許多科學家都使用他們自己的規範。開發NetCDF工具和支持NetCDF中的問題之一是產生大量非標準格式的遺留數據。 好消息是UCAR已經初步定義了一些NetCDF規範,比如COARDS規範,它是由海洋-大氣合作研究數據服務和CF(氣候和預報元數據)發起的。這些規範爲NetCDF提供了非常有用的結構和元數據標準。ArcGIS 9.2以及以後的版本中將完全支持這些規範。 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 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 ; } 上面的代碼定義了一個符合netcdf格式的結構simple_xy, 這個結構包括三個部分 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; 要注意的是: 1、賦值順序: 我們給出的是c格式的cdl文件,因此這裏的賦值順序和c語言中的一致,也就是通常所說的“行式賦值”, 而fortran語言中則是“列式賦值”,因此在fortran格式的cdl文件中,data段的數值順序和這裏正好 行列互換。 2、自變量的默認取值和座標變量如果只給出維的長度,那麼維的值默認從0開始,然後自動加1,到(長度-1)停止,很多情況下我們要自己給出每個點的座標值,這時就需要用到netcdf裏的座標變量"coordinate varibles":增加一個和只和維相關的一元函數(自變量)並給出它的取值範圍。比如下面的cdl文件(摘自netcdf教程中的2.2 The sfc pres temp Example) netcdf sfc_pres_temp { dimensions: latitude = 6 ; //緯度軸 longitude = 12 ; //經度軸 variables: float latitude(latitude) ; //座標變量,存儲具體緯度 latitude:units = "degrees_north" ; float longitude(longitude) ; //座標變量,存儲具體緯度 longitude:units = "degrees_east" ; float pressure(latitude, longitude) ; //某個點(經度和緯度的交點)的大氣壓值 pressure:units = "hPa" ; //大氣壓的單位爲 float temperature(latitude, longitude) ; //某個點(經度和緯度的交點)的溫度值 temperature:units = "celsius" ; //溫度的單位爲 data: latitude = 25, 30, 35, 40, 45, 50 ; longitude = -125, -120, -115, -110, -105, -100, -95, -90, -85, -80, -75, -70 ; pressure = 900, 906, 912, 918, 924, 930, 936, 942, 948, 954, 960, 966, 901, 907, 913, 919, 925, 931, 937, 943, 949, 955, 961, 967, 902, 908, 914, 920, 926, 932, 938, 944, 950, 956, 962, 968, 903, 909, 915, 921, 927, 933, 939, 945, 951, 957, 963, 969, 904, 910, 916, 922, 928, 934, 940, 946, 952, 958, 964, 970, 905, 911, 917, 923, 929, 935, 941, 947, 953, 959, 965, 971 ; temperature = 9, 10.5, 12, 13.5, 15, 16.5, 18, 19.5, 21, 22.5, 24, 25.5, 9.25, 10.75, 12.25, 13.75, 15.25, 16.75, 18.25, 19.75, 21.25, 22.75, 24.25, 25.75, 9.5, 11, 12.5, 14, 15.5, 17, 18.5, 20, 21.5, 23, 24.5, 26, 9.75, 11.25, 12.75, 14.25, 15.75, 17.25, 18.75, 20.25, 21.75, 23.25, 24.75, 26.25, 10, 11.5, 13, 14.5, 16, 17.5, 19, 20.5, 22, 23.5, 25, 26.5, 10.25, 11.75, 13.25, 14.75, 16.25, 17.75, 19.25, 20.75, 22.25, 23.75, 25.25 對於上面的數據,就是 latitude = 25,longitude = -125時,pressure = 900,temperature = 9; latitude = 25,longitude = -120時,pressure = 906,temperature = 10.5; 以此類推。 參考資料: http://blog.163.com/yuxincastle/blog/static/122125700200961442229151/ http://xiexin163.spaces.live.com/Blog/cns!5C944E34F72DB0C9!167.entry http://www.esrichina-bj.cn/old/market/uc/2005/video7.htm

 

來自http://bbs.esrichina-bj.cn/ESRI/thread-52682-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章