Pad*_*Pad 5 r raster netcdf r-raster ncdf4
以每月的温度数据多年的光栅文件,它具有通过连接访问的名称names(object)按以下格式"Jan.1981",两年与下面的代码工作"Feb.1981"等(例如文件位置 -添加的所有文件太大了
使用以下代码读入并写入NetCDF:
#Load Packages
library(raster)
library(ncdf4)
#Read in temperature files
r1 <- brick('TavgM_1981.grd')
r2 <- brick('TavgM_1982.grd')
#stack them together
TempStack = stack(r1, r2)
#set the coordinate system (as it was missing)
crs(TempStack) <- ('+proj=lcc +lat_1=53.5 +lat_2=53.5 +lat_0=46.834 +lon_0=5 +x_0=1488375 +y_0=-203375 +datum=WGS84 +to_meter=2500 +no_defs +ellps=WGS84 +towgs84=0,0,0')
#reproject to get in lat/lon instead of meters
TempStack<-projectRaster(TempStack, crs=CRS("+init=epsg:4326"))
#Extract monthly data names to assign to netCDf later
names <- names(TempStack)
#write the raster file to NetCDF
writeRaster(TempStack, "Temp.nc", overwrite=TRUE, format="CDF", varname="Temperature", varunit="degC",
longname="Temperature -- raster stack to netCDF, monthly average", xname="Longitude", yname="Latitude", zname='Time', zunit=names)
Run Code Online (Sandbox Code Playgroud)
当我把它写给NetCDF并绘制月度数据时,它是从第1个月到第24个月组织的,但是我希望它有'1981年1月','1981年2月'等.
我想通过在writeRaster中添加zunit参数可以工作,但事实并非如此,数字仍然是1-24而不是Jan,Feb等.
你的例子中有一些误解.首先,您应该意识到netcdf维度中的值必须是数字.它们不仅仅是图层的标签,它们是该维度的实际值,因此不能采用像"Jan.1980"字符串这样的值.解决此问题的一种方法是保存netcdf文件,然后将z维值作为数值添加到其中.不幸的是,这意味着我们也不能使用日期/时间变量类型,但必须先将它们转换为数字等价物.在这里,我使用lubridate包来做到这一点.
# first we write the netcdf file to disk
writeRaster(TempStack, "Temp.nc", overwrite=TRUE,
format="CDF", varname="Temperature", varunit="degC",
longname="Temperature -- raster stack to netCDF, monthly average",
xname="Longitude", yname="Latitude", zname='Time', zunit='seconds')
# and open a connection to it to make changes.
# note that we use write=TRUE so that we can change it
nc = nc_open('Temp.nc', write = TRUE)
# now convert the strings to numeric values based on their dates
zvals = lubridate::parse_date_time(names, orders = 'm.y', tz = "UTC")
zvals = as.integer(zvals)
# and we can write these numeric dates to the z dimension
ncdf4::ncvar_put(nc, 'Time', zvals)
Run Code Online (Sandbox Code Playgroud)
Haing将日期写入z维度,如果您想将数字z值转换回看起来像"Jan.1908"等的栅格图层名称,我们还需要反转该过程.再次,lubridate可以提供帮助.
ncb = brick('Temp.nc')
zvals = ncvar_get(nc, 'Time')
zvals = as.POSIXct(zvals, origin = lubridate::origin, tz = "UTC")
znames = paste0(lubridate::month(zvals, label=T), '.', lubridate::year(zvals))
names(ncb) = znames
Run Code Online (Sandbox Code Playgroud)
让我们检查一下是否有效:
plot(ncb)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |