如何将旋转的 NetCDF 转换回正常的 lat/lon 网格?
How to convert a rotated NetCDF back to a normal lat/lon grid?
我有一个带有旋转坐标的 NetCDF 文件。我需要将其转换为正常的 lat/lon 坐标(经度为 -180 到 180,纬度为 -90 到 90)。
library(ncdf4)
nc_open('dat.nf')
对于维度,它显示:
[1] " 5 variables (excluding dimension variables):"
[1] " double time_bnds[bnds,time] "
[1] " double lon[rlon,rlat] "
[1] " long_name: longitude"
[1] " units: degrees_east"
[1] " double lat[rlon,rlat] "
[1] " long_name: latitude"
[1] " units: degrees_north"
[1] " char rotated_pole[] "
[1] " grid_mapping_name: rotated_latitude_longitude"
[1] " grid_north_pole_longitude: 83"
[1] " grid_north_pole_latitude: 42.5"
[1] " float tasmax[rlon,rlat,time] "
[1] " long_name: Daily Maximum Near-Surface Air Temperature"
[1] " standard_name: air_temperature"
[1] " units: K"
[1] " cell_methods: time:maximum within days time:mean over days"
[1] " coordinates: lon lat"
[1] " grid_mapping: rotated_pole"
[1] " _FillValue: 1.00000002004088e+20"
[1] " 4 dimensions:"
[1] " rlon Size:310"
[1] " long_name: longitude in rotated pole grid"
[1] " units: degrees"
[1] " axis: X"
[1] " standard_name: grid_longitude"
[1] " rlat Size:260"
[1] " long_name: latitude in rotated pole grid"
[1] " units: degrees"
[1] " axis: Y"
[1] " standard_name: grid_latitude"
[1] " bnds Size:2"
谁能告诉我如何将旋转坐标转换回正常坐标 lat/lon?谢谢
我会为此使用 cdo https://code.zmaw.de/boards/2/topics/102
另一种选择是在旋转坐标和地理坐标之间创建一个映射,并使用原始数据而不进行插值。如有必要,我可以找到方程式。
NCO 的 ncks 可能可以使用 MSA
在两个命令中执行此操作
ncks -O -H --msa -d Lon,0.,180. -d Lon,-180.,-1.0 in.nc out.nc
ncap2 -O -s 'where(Lon < 0) Lon=Lon+360' out.nc out.nc
也有可能在 R 中执行此操作(因为用户在问题中指的是它)。当然,NCO 和 CDO 效率更高(速度更快)。
请也看看这个 answer。
library(ncdf4)
library(raster)
nsat<- stack (air_temperature.nc)
##check the extent
extent(nsat)
## this will be in the form 0-360 degrees
#change the coordinates
nsat1<-rotate(nsat)
#check result:
extent(nsat1)
##this should be in the format you are looking for: -180/180
希望对您有所帮助。
[已编辑]
我按照@kakk11 的建议完成了 CDO link,但不知何故这对我不起作用。经过大量研究,我找到了一个方法
首先,将旋转网格转换为曲线网格
cdo setgridtype,curvilinear Sin.nc out.nc
接下来转换为您想要的网格,例如全球1X1学位
cdo remapbil,global_1 out.nc out2.nc
或者像下面这样的网格
gridtype = lonlat
xsize = 320 # 替换为你的值
ysize = 180 # 替换为你的值
xfirst = 1 # 替换为你的值
xinc = 0.0625 # 替换为你的值
yfirst = 43 # 替换为你的值
yinc = 0.0625 # 替换为你的值
将此信息保存为 target_grid.txt 然后 运行
cdo remapbil,target_grid.txt out.nc out2.nc
在我的例子中,还有一个问题是我的变量没有网格信息。所以 CDO 假设它是规则的经纬度网格。因此,在执行上述所有步骤之前,我必须使用 nco
将网格信息属性添加到所有变量(在我的例子中,所有变量都以 _ave 结尾)
ncatted -a coordinates,'_ave$',c,c,'lon lat' in.nc
ncatted -a grid_mapping,'_ave$',c,c,'rotated_pole' in.nc
请注意,您的 nc 文件中应该有一个名为 rotated_pole 的变量,其中包含旋转极点的经纬度信息。
我有一个带有旋转坐标的 NetCDF 文件。我需要将其转换为正常的 lat/lon 坐标(经度为 -180 到 180,纬度为 -90 到 90)。
library(ncdf4)
nc_open('dat.nf')
对于维度,它显示:
[1] " 5 variables (excluding dimension variables):"
[1] " double time_bnds[bnds,time] "
[1] " double lon[rlon,rlat] "
[1] " long_name: longitude"
[1] " units: degrees_east"
[1] " double lat[rlon,rlat] "
[1] " long_name: latitude"
[1] " units: degrees_north"
[1] " char rotated_pole[] "
[1] " grid_mapping_name: rotated_latitude_longitude"
[1] " grid_north_pole_longitude: 83"
[1] " grid_north_pole_latitude: 42.5"
[1] " float tasmax[rlon,rlat,time] "
[1] " long_name: Daily Maximum Near-Surface Air Temperature"
[1] " standard_name: air_temperature"
[1] " units: K"
[1] " cell_methods: time:maximum within days time:mean over days"
[1] " coordinates: lon lat"
[1] " grid_mapping: rotated_pole"
[1] " _FillValue: 1.00000002004088e+20"
[1] " 4 dimensions:"
[1] " rlon Size:310"
[1] " long_name: longitude in rotated pole grid"
[1] " units: degrees"
[1] " axis: X"
[1] " standard_name: grid_longitude"
[1] " rlat Size:260"
[1] " long_name: latitude in rotated pole grid"
[1] " units: degrees"
[1] " axis: Y"
[1] " standard_name: grid_latitude"
[1] " bnds Size:2"
谁能告诉我如何将旋转坐标转换回正常坐标 lat/lon?谢谢
我会为此使用 cdo https://code.zmaw.de/boards/2/topics/102
另一种选择是在旋转坐标和地理坐标之间创建一个映射,并使用原始数据而不进行插值。如有必要,我可以找到方程式。
NCO 的 ncks 可能可以使用 MSA
在两个命令中执行此操作ncks -O -H --msa -d Lon,0.,180. -d Lon,-180.,-1.0 in.nc out.nc
ncap2 -O -s 'where(Lon < 0) Lon=Lon+360' out.nc out.nc
也有可能在 R 中执行此操作(因为用户在问题中指的是它)。当然,NCO 和 CDO 效率更高(速度更快)。 请也看看这个 answer。
library(ncdf4)
library(raster)
nsat<- stack (air_temperature.nc)
##check the extent
extent(nsat)
## this will be in the form 0-360 degrees
#change the coordinates
nsat1<-rotate(nsat)
#check result:
extent(nsat1)
##this should be in the format you are looking for: -180/180
希望对您有所帮助。
[已编辑]
我按照@kakk11 的建议完成了 CDO link,但不知何故这对我不起作用。经过大量研究,我找到了一个方法
首先,将旋转网格转换为曲线网格
cdo setgridtype,curvilinear Sin.nc out.nc
接下来转换为您想要的网格,例如全球1X1学位
cdo remapbil,global_1 out.nc out2.nc
或者像下面这样的网格
gridtype = lonlat
xsize = 320 # 替换为你的值
ysize = 180 # 替换为你的值
xfirst = 1 # 替换为你的值
xinc = 0.0625 # 替换为你的值
yfirst = 43 # 替换为你的值
yinc = 0.0625 # 替换为你的值
将此信息保存为 target_grid.txt 然后 运行
cdo remapbil,target_grid.txt out.nc out2.nc
在我的例子中,还有一个问题是我的变量没有网格信息。所以 CDO 假设它是规则的经纬度网格。因此,在执行上述所有步骤之前,我必须使用 nco
将网格信息属性添加到所有变量(在我的例子中,所有变量都以 _ave 结尾)ncatted -a coordinates,'_ave$',c,c,'lon lat' in.nc
ncatted -a grid_mapping,'_ave$',c,c,'rotated_pole' in.nc
请注意,您的 nc 文件中应该有一个名为 rotated_pole 的变量,其中包含旋转极点的经纬度信息。