如何将旋转后的NetCDF文件转换回正常的经纬度网格?

6

我有一个带有旋转坐标的NetCDF文件,需要将其转换为普通的经纬度坐标(经度为-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"

请问有人能告诉我如何将旋转后的坐标转换回正常的经纬度吗?谢谢。


-180到180不是“正常”的经度,它们只是表示世界的一种方式。0到360是另一种方式。 - user3710546
两种方式都很常用。转换成其中任意一种都可以。 - user1617676
这个 gis response 能解决你的问题吗? - Timothy Brown
4个回答

7

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


这是否涉及到旋转极点? - naught101

5
我会为此目的使用cdo。另一个选择是创建旋转和地理坐标之间的映射,并使用原始数据而不进行插值。如果需要,我可以找到方程式。 https://code.zmaw.de/boards/2/topics/102

嗨,我有类似的问题。你提到了一些方程式,我很感兴趣。我需要将旋转的经纬度(还使用0-360的经度范围)转换为使用Datum OSGB36(英格兰)的常规经纬度。你所说的方程是什么? - FaCoffee

5

我按照@kakk11建议的CDO链接进行了尝试,但对我来说似乎没用。经过多次研究,我找到了一种方法。

首先,将旋转网格转换为曲线网格。

cdo setgridtype,curvilinear Sin.nc out.nc

下一步是将其转换为所需的网格,例如全球1X1度。
cdo remapbil,global_1 out.nc out2.nc

或者像下面这样的网格

gridtype = 经纬度

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的变量,其中包含旋转极点的纬度和经度信息。

4

还有一种可能是在R中完成(正如用户在问题中提到的)。当然,NCO和CDO更有效率(速度更快)。请参考此答案

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

希望这能帮到您。
[已编辑]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接