本文参照CDO的PDF教程。
用-
来区分不同的运算符,举例:cdo -op1 -op2 input.nc
同一运算符的参数,用,
来区分,举例:cdo op1,opt1,opt2,op3
字符串如果有空格,或者能够被shell解释的字符,就需要用引号包围
整数序列可以用start/end/interval
的格式来写,例如5/8
== 5,6,7,8
通过串联运算符,可以减少文件读写的耗时,同时注意运算的优先级是从后到前的
插值之前需要了解grid信息,看PDF教程的Introduction
-Horizontal grids
-Grid description
部分。
生成grid的描述文件,可以使用运算符griddes
。
插值可用的命令看PDF教程的Reference manual
-Interpolation
部分。
如果想要比较两个nc文件,那么我们可以通过将一个文件remap使得两个文件能够比较,可以使用如下的语法(通常是将分辨率降低)
# 这里使用了bilinear方法,可以根据实际情况选择
cdo remapbil,target.nc input.nc output.nc
常见的插值方法有:
这个Youtube视频对各种插值方法讲得非常详细。值得一看。最后还讲了用cdo插值的简单用法。regridding and interpolation - an essential life skill ! - YouTube
在选择插值方法的时候,判断标准是:
有些nc文件可能没有正确设置缺失值。matlab和cdo将_FillValue
视为缺失值,而nc文件可能没有设置这个属性,而是设置了missing_value
。这个时候我们需要重新设置缺失值。
xxxxxxxxxx
# 缺失值是C
cdo setctomiss,Constant input.nc output.nc
有些时候,我们需要修改缺失值,从C1变成C2
x# input.nc文件中的_FillValue=C1
# output.nc文件中的_FillValue=C2
cdo setmissval,Constant input.nc output.nc
该命令使得nc文件中的C1值变成C2值。valid data不会受到影响。
cdo进行空间范围选取的时候,边界的经纬度是像元边界的经纬度,而不是边缘栅格的中心坐标经纬度
xxxxxxxxxx
cdo sellatlonbox
xxxxxxxxxx
cdo gridarea input.nc output.nc
可以计算nc文件中的栅格的面积大小。
使用setgridarea
可以设定cell_area属性。
缺点是,计算应该是按照球体计算的,没有考虑地球实际是一个椭球体。
参考:CDO手册,202页。
xxxxxxxxxx
# 错误信息
cdo: malloc(): memory corruption
解决方法就是,将多个运算符分开来写。