NetCDF 文件的坐标被翻转了

问题描述 投票:0回答:1

我创建了一个名为“温度”的新变量,它代表检测海洋热锋的温度梯度。我在绘制该变量时遇到的一个问题是陆地部分(包括非洲和巴西的一部分(大西洋))出现了逆转。非洲出现在左边,巴西出现在右边,仿佛纬度和经度的符号颠倒了——东热带大西洋的海滨。

enter image description here

最初,地图看起来是颠倒的,但我转置了文件来纠正它,但它仍然是翻转的。我不确定如何调整它以使纬度和经度与其符号正确。非常感谢你的帮助;我很卡住了!

#Set the path fot the NetCDF
ncfile <- "C:/Users/mdolores.riesgo/Desktop/PhD_MB/PhD_Documents/Chapters/01_Chapter/01_RawData/CopernicusDataProducts/Var_Calculated/Fronts/2018/CMEMS_TropicalAtlantic_thetao_Aug2018_front.nc"

#Import the netCDF
nc <- nc_open(ncfile)
print(nc) #details about the product
dimensions <- names(nc$dim)
print(dimensions)
variables <- names(nc$var)
print(variables)

lon <- ncvar_get(nc, "longitude")
lat <- ncvar_get(nc, "latitude")
gradfront <- ncvar_get(nc, "Temperature")
gradfront <- t(gradfront)
grad <- raster(gradfront)
extent(grad) <- c(min(lon), max(lon), min(lat), max(lat))
entent(grad)
#The result
#class      : Extent 
#xmin       : -43.16667 
#xmax       : 19.33333 
#ymin       : -26.5 
#ymax       : 29.41667 
plot(grad) 
r coordinates latitude-longitude netcdf
1个回答
0
投票

欢迎访问 StackOverflow。

就像一些评论指出的那样,您确实应该在问题中提供更多信息,以便其他人可以“玩弄”您的数据和代码以找到答案。指向您的数据文件的链接会非常有帮助。尽管如此,这个问题还是很明显的,因为这对于任何在 R 中使用过 netCDF 数据的人来说都很常见。

我在 CMEMS 上找不到你的文件,所以我在这里使用另一个文件,但原理是相同的。

根本问题

在 R 中,矩阵和数组中的数据按列优先顺序存储(Fortran 风格)。简而言之,这意味着数据从左上角位置向下,然后按列向右移动。大多数绘图软件,包括

raster
底层的 GDAL 库,都使用行主序(C 风格):行优先,向下移动。绘制数据时,对于 2D
matrix
,纠正此问题的简单方法是使用
t()
转置数据。这显然不适合你。其原因如下所示。

使用正确的工具

raster
软件包已被来自同一开发人员的
terra
软件包取代。使用
terra
,因为它比
raster
更容易、更快。

同样,我使用包

ncdfCF
来访问netCDF数据。这是一个新的软件包(我是开发人员),仍在开发中,但它已经比
ncdf4
更容易使用。

看数据

> library(ncdfCF)

> src <- "~/20140815120000-ESACCI-L4_GHRSST-SST-GMPE-GLOB_CDR2.0-v02.0-fv01.0.nc"
> ds <- open_ncdf(src)

# The variables in the file
> names(ds)
[1] "field_name"         "analysed_sst"       "standard_deviation" "analysis_number"
[5] "median_type"        "anomaly_fields"     "gradient_fields" 

# Look at the SST variable
> sst <- ds[["analysed_sst"]]
> sst
Variable: [7] analysed_sst | median SST from GMPE

Dimensions:
 id axis name long_name                   length values                
 0  X    lon                              1440   [-179.875 ... 179.875]
 1  Y    lat                               720   [-89.875 ... 89.875]  
 2  T    time reference time of sst field    1   [2014-08-15 12:00:00] 
### (Attributes omitted for brevity)

问题现在变得清晰了:

lat
维度从最低值到最高值。这是符合 CF 元数据约定的 netCDF 文件中的常见模式(几乎所有海洋和气候产品都是如此)。按照上面讨论的存储模式,这个文件中的数据是从左下到顶部,然后每列到右边!

在您的文件中,这可能有所不同。鉴于该图是镜像的,人们会假设

lon
值以相反的顺序存储。请检查。下面的解决方案原则上仍然是相同的,但您可能需要更改尺寸才能修改。

解决方案

所以数据是按特定顺序排列的,而

terra
期望的是另一个顺序。这需要几个步骤来纠正。

# Get the data and drop the degenerate time dimension to get a matrix
> sst <- sst[]
> sst <- drop(sst)

# Transpose and then "flip" the data
> sst <- t(sst)
> sst <- sst[nrow(sst):1, ]

# Now you can plot the matrix
> plot(rast(sst))

direct plot of SST

Q-n-D 解决方案

请注意,如果直接使用

terra
打开 netCDF 文件,则会自动修正纬度坐标和存储顺序(毕竟这是一个已知且常见的问题):

library(terra)

x <- rast(src)
plot(x[[1]])    # Plot the first spatial variable, SST here

但是,由于您正在攻读博士学位,我假设您需要在 R 中处理数据。

terra
并不是一个好的解决方案,因为它不提供对 netCDF 文件中所有详细信息的访问,特别是元数据。与
terra
支持等通用工具相比,海洋 netCDF 文件往往要复杂得多,并且需要解释元数据。如果您需要自己编写任何处理函数,请使用专注于 netCDF 的包。

Mucha suerte con tus investigaciones.

© www.soinside.com 2019 - 2024. All rights reserved.