1. 程式人生 > 實用技巧 >grads讀取netcdf檔案,報錯SDF file has no discernable X coordinate解決辦法

grads讀取netcdf檔案,報錯SDF file has no discernable X coordinate解決辦法

1、netcdf檔案格式說明

netCDF資料格式在氣象中有廣泛的應用,這種格式有一定的複雜性。作為資料的使用者可以不用對資料格式瞭解得很詳細,不過大致的瞭解還是有必要的。netCDF是自描述的二進位制資料格式,也就是說資料本身包含了相關的資料資訊。經典的netCDF格式是由維(dimensions)、全域性屬性(global attribute)和變數(variations)組成的,netCDF4.0以後開始向HDF格式靠攏。下面是一個簡單的netCDF資料的自描述資訊。格點氣象資料通常是4維,包括空間3維和時間維(x, y, z, t),如果把變數也算作一維也可以認為是5維。netCDF可以有一個無限長度的維(unlimited dimension),通常是時間維。


File Name: E:\Temp\nc\output.nc
Dimensions: 3
longitude = 240;
latitude = 121;
time = 12;
Global Attributes: 2
: Conventions = "CF-1.0";
: history = "2011-07-22 15:15:21 GMT by mars2netcdf-0.92";
Variations: 4
NC_FLOAT longitude(longitude);
longitude: units = "degrees_east";
longitude: long_name = "longitude";
NC_FLOAT latitude(latitude);
latitude: units = "degrees_north";
latitude: long_name = "latitude";
NC_INT time(time);
time: units = "hours since 1900-01-01 00:00:0.0";
time: long_name = "time";
time: avg_period = "0000-01-00 00:00:00";
NC_SHORT q(time,latitude,longitude);
q: scale_factor = 3.07609393740706E-07;
q: add_offset = 0.0101016578590996;
q: _FillValue = -32767;
q: missing_value = -32767;
q: units = "kg kg**-1";
q: long_name = "Specific humidity";
Unlimited dimension: 2

netCDF格式非常靈活,用程式自動判斷維和變數等資訊的前提條件是資料必須遵循某種約定(convensions)。氣象上最常用的約定是CFCOARDS可以看作CF約定的子集),對於維、變數、屬性有詳細的規定,這樣以來軟體才能通過約定對資料進行正確的判讀。

GrADS中netCDF資料可以通過三種方式開啟:

(1)sdfopen,只限於符合COARDS約定(http://ferret.wrc.noaa.gov/noaa_coop/coop_cdf_profile.html)的nc資料。GrADS不支援CF約定(COARDS約定過於簡單,無法描述複雜的資料),因此sdfopen能開啟的資料十分有限。

(2)xdfopen,對於非COARDS約定的nc資料可以嘗試xdfopen來開啟,需要一個簡單的ctl檔案,具體可以看官方說明http://cola.gmu.edu/grads/gadoc/gradcomdxdfopen.html

(3)open,如同開啟GrADS二進位制檔案,需要一個完整的ctl檔案,詳見http://cola.gmu.edu/grads/gadoc/descriptorfile.html

第2和3種開啟nc檔案的方法都需要control檔案,是為了軟體能夠正確讀取維和變數等資訊。

MeteoInfo開啟nc檔案的方式類似sdfopen,無需control檔案,不過MeteoInfo支援CF約定(包含了COARDS約定)、WRF Out約定(WRF模式輸出)和IOAPI約定(用於CMAQ模式)。因此可以在不需要control檔案的情況下開啟更多的nc資料檔案。

案例分析

使用 ncdump 命令檢視 nc 檔案:

C:\Documents and Settings\Administrator>ncdump -h D:\evapr_oaflux_2011-original.nc

netcdf D:\evapr_oaflux_2011-original {
dimensions:
time = UNLIMITED ; // (7 currently)
lat = 180 ;
lon = 360 ;
variables:
float lon(lon) ;
lon:long_name = "longitude" ;
lon:units = "degrees" ;
lon:range = "0.5 to 359.5" ;
float lat(lat) ;
lat:long_name = "latitude" ;
lat:units = "degrees" ;
lat:range = "89.5S to 89.5N" ;
int time(time) ;
time:units = "month" ;
time:comment = "Year 2011" ;
short evapr(time, lat, lon) ;
evapr:comments = "monthly mean evaporation rate" ;
evapr:units = "cm/yr" ;
evapr:scale_factor = 0.1 ;
evapr:missing_value = 32766. ;
short err(time, lat, lon) ;
err:comments = "monthly mean estimated error of evaporation rate
" ;
err:units = "cm/yr" ;
err:scale_factor = 0.1 ;
關於用 GrADS 命令”sdfopen” 開啟 .nc 檔案出現的“SDF file has no discernable X coordinate” 問題詳解 蘭溪之水
3 / 6
err:missing_value = 32766. ;
// global attributes:
:creation_date = "Oct 2011" ;
:description = "WHOI Objectively Analyzed air-sea Fluxes (OAFlux
) Project" ;
:project_PIs = "Lisan Yu, Bob Weller" ;
:website = "http://oaflux.whoi.edu" ;
}

我們從上面的變數單位可以看出這個 evapr_oaflux_2011-original.nc 檔案並不符合 COARDS約定
所以我們用”sdfopen”命令開啟時,會出現

解決方法1、寫一個簡單的ctl檔案,用xdfopen開啟nc檔案

DSET ^evapr_oaflux_2011-original.nc
TITLE monthly mean evapr_oaflux_2011
UNDEF 32766
XDEF lon 360 LINEAR 0.5 1.0
YDEF lat 180 LINEAR -89.5 1.0
TDEF time 7 LINEAR 00Z01JAN2011 1mo
VARS 2
evapr=>evapr 0 99 monthly mean evaporation rate
err=>err 0 99 monthly mean estimated error of evaporation rate
ENDVARS

儲存為:evapr_oaflux_2011.ctl,然後用xdfopen d:/evapr_oaflux_2011.ctl即可開啟nc檔案

解決方法2:寫一個詳細的ctl檔案,用open開啟nc檔案

注意:這裡的ctl 檔案則需很詳細,比如要加 ZDEF 之類的,

這裡就不詳細做了,有興趣的可以自己試試!

解決方法3:直接修改 nc 檔案裡面的描述,使其符合 COARDS約定

使用ncl:

begin
f = addfile("./evapr_oaflux_2011.nc","w")
f->lon@units = "degrees_east"
f->lat@units = "degrees_north"
f->time@units = "months since 2011-01-01 00:00:0.0"
end

執行之後,nc檔案描述如下:

netcdf evapr_oaflux_2011 {
dimensions:
time = UNLIMITED ; // (7 currently)
lat = 180 ;
lon = 360 ;
variables:
float lon(lon) ;
lon:long_name = "longitude" ;
lon:units = "degrees_east" ;
lon:range = "0.5 to 359.5" ;
float lat(lat) ;
lat:long_name = "latitude" ;
lat:units = "degrees_north" ;
lat:range = "89.5S to 89.5N" ;
int time(time) ;
time:units = "months since 2011-01-01 00:00:0.0" ;
time:comment = "Year 2011" ;
time:delta_t = "0000-01-00 00:00:00" ;
time:actual_range = "0., 6." ;
short evapr(time, lat, lon) ;
evapr:comments = "monthly mean evaporation rate" ;
evapr:units = "cm/yr" ;
evapr:scale_factor = 0.1 ;
evapr:missing_value = 32766. ;
evapr:_FillValue = -32767s ;
short err(time, lat, lon) ;
err:comments = "monthly mean estimated error of evaporation rate" ;
err:units = "cm/yr" ;
err:scale_factor = 0.1 ;
err:missing_value = 32766. ;
// global attributes:
:creation_date = "Oct 2011" ;
:description = "WHOI Objectively Analyzed air-sea Fluxes (OAFlux) Project" ;
:project_PIs = "Lisan Yu, Bob Weller" ;
:website = "http://oaflux.whoi.edu" ;

之後就能用sdfopen開啟nc檔案了

文章內容參考氣象家園的文章,如下:

http://bbs.06climate.com/forum.php?mod=viewthread&tid=1267

http://bbs.06climate.com/forum.php?mod=viewthread&tid=6008