我需要在 R 中处理这些数据:https://zenodo.org/records/1209296特别是“灌溉用水 v2.7z”。我用 terra 和 raster 库打开了 R 内部的 netcdf。我应该有一个 480 层(月)的全球经纬度网格。但我打开它们时的格式如下。
class : RasterLayer
dimensions : 480, 64028, 30733440 (nrow, ncol, ncell)
resolution : 0.007481219, 1 (x, y)
extent : 0.9962594, 480.0037, 0.5, 480.5 (xmin, xmax, ymin, ymax)
crs : NA
source : withd_irr_h08.nc
names : withd_irr
zvar : withd_irr
如何移动到二维(纬度、经度)和 480 层的栅格?分辨率为0.5°。
您的数据完全不标准且不具有自我描述性。换句话说,没有哪个图书馆能给你一站式解决方案。
使用包
ncdfCF
我看到以下文件结构:
> library(ncdfCF)
> irr <- open_ncdf("~/withd_irr_h08.nc")
> irr
<Dataset> withd_irr_h08
Resource : withd_irr_h08.nc
Format : classic
Conventions: (not indicated)
Keep open : FALSE
Variables:
name units data_type axes
withd_irr mm/month NC_DOUBLE grid_num, month
lon degree NC_DOUBLE grid_num
lat degree NC_DOUBLE grid_num
Axes:
id axis name length values unit
1 T month 480 [1971-02-01 ... 2011-01-01] months since 1971-1
0 grid_num 64028 [1 ... 64028]
数据变量
withd_irr
不使用经纬度网格,而是具有一个轴 grid_num
,它包含 64,028 个位置,与 lon
和 lat
变量相同(如果 terra
则您希望将其作为轴)
应该认出他们,但他们没有)。
问题的解决方案是提取 3 个变量的数据,将它们放入
data.frame
中,然后将其转换为 terra::SpatRaster
。您必须分别对每个月进行转换,因为各种步骤适用于矩阵,但不适用于数组:
# Read entire data arrays
> lon <- irr[["lon"]][]
> lat <- irr[["lat"]][]
> withd <- irr[["withd_irr"]][]
# Make a data.frame with lon, lat and all 480 months of withd_irr
> df <- data.frame(lon, lat, withd, check.names = FALSE)
# Convert a month of data to a SpatRaster
> r <- rast(df[c("lon", "lat", "1971-02-01")])
> r
class : SpatRaster
dimensions : 279, 720, 1 (nrow, ncol, nlyr)
resolution : 0.5, 0.5 (x, y)
extent : -180, 180, -56, 83.5 (xmin, xmax, ymin, ymax)
coord. ref. :
source(s) : memory
name : 1971-02-01
min value : 0.00000
max value : 96.28087