Creating multi-dimensional NetCDF in R

故事扮演 提交于 2019-12-04 03:56:26

There are some errors in your non-reproducible code, and by my reckoning the file is 219Mb (1500 * 18250 * 8 bytes).

library(ncdf)

Provide the vectors for the first two dims and the dataset to match at least one slice

Longvector = seq(-180, 180, length = 50)
Latvector = seq(-90, 90, length = 30)
dataset <- list(1:18250)

dimX <- dim.def.ncdf("Long", "degrees", Longvector)
dimY <- dim.def.ncdf("LAT", "degrees", Latvector)
dimT <- dim.def.ncdf("Time", "days", 1:18250, unlim = FALSE)

mv <- -9999 
var1d <- var.def.ncdf( "var1d", "units", dimX, mv,prec="double")
var2d <- var.def.ncdf( "var2d", "units", list(dimX,dimY), mv,prec="double")
var3d <- var.def.ncdf( "var3d", "units", list(dimX,dimY,dimT), mv,prec="double")

nc <- create.ncdf( "writevals.nc", list(var1d,var2d,var3d))

Count is the index of the dimension, not the axis position value, so we correct start to 1, and use the count (length) of the 3rd dimension (not -1).

put.var.ncdf(nc, var3d, dataset[[1]], start = c(1, 1, 1),  count = c(1, 1, length(dataset[[1]])))

close.ncdf(nc)

Interrogate the file size.

file.info("writevals.nc")$size/1e6
[1] 219.0866

Here's an updated version of mdsumner's answer which works with the NetCDF4 package for R (ncdf4).

# Open library
library(ncdf4)

# Get x and y vectors (dimensions)
Longvector = seq(-180, 180, length = 50)
Latvector = seq(-90, 90, length = 30)
# Define data
dataset = list(1:18250)

# Define the dimensions
dimX = ncdim_def("Long", "degrees", Longvector)
dimY = ncdim_def("Lat", "degrees", Latvector)
dimT = ncdim_def("Time", "days", 1:18250)

# Define missing value
mv = -9999

# Define the data
var1d = ncvar_def( "var1d", "units", dimX, mv, prec="double")
var2d = ncvar_def( "var2d", "units", list(dimX,dimY), mv, prec="double")
var3d = ncvar_def( "var3d", "units", list(dimX,dimY,dimT), mv, prec="double")

# Create the NetCDF file
# If you want a NetCDF4 file, explicitly add force_v4=T
nc = nc_create("writevals.nc", list(var1d, var2d, var3d))

# Write data to the NetCDF file
ncvar_put(nc, var3d, dataset[[1]], start=c(1, 1, 1),
    count=c(1, 1, length(dataset[[1]])))

# Close your new file to finish writing
nc_close(nc)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!