在进行数据处理和分析的过程中或是基于其他原因,为了方便进一步的处理,有时需要将NetCDF数据格式转换为GRIB数据格式。
在格式转换的过程中,首先要确定NetCDF格式数据中是否全部变量都包含网格信息,或是网格类型为非 generic。因为CDO不支持上述两种情况下的格式转换。
CDO支持的网格类型如下:
执行命令:
cdo -f grb copy infile.nc outfile.grb
注意:不能省略操作符。
通常情况下,执行上述转换命令时可能会碰到以下提示:
Warning (cdfSetVar) : Inconsistent variable definition for XLAT_U!
Warning (cdfSetVar) : Inconsistent variable definition for XLONG_U!
Warning (cdfSetVar) : Inconsistent variable definition for XLAT_V!
Warning (cdfSetVar) : Inconsistent variable definition for XLONG_V!
Warning (define_all_grids) : Time varying grids unsupported, using grid at time step 1!
Warning (cgribexDefGrid) : Curvilinear grids are unsupported in GRIB1! Created wrong GDS!
Warning (cgribexDefGrid) : The CGRIBEX library can not store fields on the used grid!
Error (cgribexDefGrid) : Unsupported grid type: generic
红色部分提示表示 不支持 generic 网格类型。在CDO中 generic 表示的只是点,其中不包含任何网格信息。
在转换之前应该先看一下NetCDF文件的网格信息:
cdo sinfon infile.nc
部分输出信息如下:
Grid coordinates :
1 : curvilinear : points=48240 (240x201)
XLONG : 115.839 to 123.957 degrees_east
XLAT : 30.0914 to 35.6799 degrees_north
2 : generic : points=59
3 : generic : points=60
4 : generic : points=4
5 : curvilinear : points=48441 (241x201)
XLONG_U : 115.822 to 123.974 degrees_east
XLAT_U : 30.0909 to 35.6799 degrees_north
6 : curvilinear : points=48480 (240x202)
XLONG_V : 115.838 to 123.958 degrees_east
XLAT_V : 30.0776 to 35.6937 degrees_north
7 : generic : points=1
以上信息是选取的网格信息,其中有7个网格坐标,1,5,6三个是曲线网格坐标,而其余的网格类型为 generic,是不支持转换到GRIB格式的。
因此,在进行上述格式转换时要选择指定的网格类型,然后进行转换:
cdo -f grb selgrid,1,5,6 infile.nc outfile.grb
之后就能成功转换数据格式了。查看 outfile.grb 文件信息可以发现,infile.nc中的generic网格类型变量都不存在了 ,而且变量名也都发生了变化 ,变量名命名方式为 var + infile.nc文件中变量的顺序。
如果输入文件不包含网格信息,可以使用setgrid操作符设置网格描述信息,然后再执行转换操作。当然,NCO中也有命令可以完成网格信息添加。比如: ncatted。
除了NetCDF和GRIB间的格式转换之外,还支持其他格式的转换,但是由于我没用到(一般也很少用到),所以就不说了。当然,套路都是一样的。
注意:
编译CDO时,要使用--with*选项指定要支持的操作,比如支持NetCDF,GRIB数据格式,需要指定 --with-netcdf, --with-grib_api 选项。完整的--with*选项如下(加粗为常用项): --with-cmor= --with-fftw3 --with-grib_api= --with-libxml2= --with-netcdf= --with-pic --with-sysroot= --with-threads= --with-curl= --with-gnu-ld --with-hdf5= --with-magics= --with-PACKAGE --with-proj= --with-szlib= --with-udunits2=
ECMWF提供了新的工具(即ecCodes)支持grib_api的功能,但是在使用老版本的CDO时,对于初学者来说仍建议使用grib_api。