在 R 中将多维 NetCDF 转换为 Tif
Convert multidimensional NetCDF to Tif in R
我的 .nc 文件大小约为 651 MB,其中包含几个数据集(每日)(rr_mrg_19810101_20181231_ENACT.nc) 数据。我需要将 (rr_mrg_19810101_20181231_ENACT.nc) 数据集转换为多个 GeoTIFF(每个时间片一个 .tif,每月一次)。同样,我想阅读时间序列。但是我发现
Error in .local(x, time, ...) :
time must has the same length as the number of layers in RasterBrick][1]
这是我做的
library(raster)
library(zoo)
library(rts)
TRF = brick("rr_mrg_19810101_20181231_ENACT.nc")
crs(TRF) <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84
+towgs84=0,0,0"
Awash_Extent<-c(37,44, 7,12)
Awash_E_resize<- crop(TRF,Awash_Extent)
Awash_Month<-seq(as.Date('1981-01-01'),as.Date('2018-12-31'),by =
"month")
rt <- rts(Awash_E_resize, Awash_Month)
write.rts(Awash_E_resize, filename='Awash_TRF_1981_2018_mon.tif',
overwrite=TRUE)
你能帮我解决这个问题吗?
这么简单的东西也能做到这一点
library(raster)
b <- brick("rr_mrg_19810101_20181231_ENACT.nc")
writeRaster(b, "timeslice.tif", bylayer=TRUE)
根据您的扩展问题:
用terra
读取值(不需要其他包)
library(terra)
TRF = rast("rr_mrg_19810101_20181231_ENACT.nc")
Awash_Extent<-c(37,44, 7,12)
Awash_E_resize<- crop(TRF,Awash_Extent)
我在这里创建了类似的东西:
A <- rast(ext(37,44, 7,12), nlyr=365)
values(A) <- runif(size(A))
terra::time(A) <- seq(as.Date('1981-01-01'), as.Date('1981-12-31'), 1)
现在按月汇总:
m <- months(time(A))
f <- factor(m, levels=unique(m))
B <- tapp(A, m, fun=sum)
B
#class : SpatRaster
#dimensions : 10, 10, 12 (nrow, ncol, nlyr)
#resolution : 0.7, 0.5 (x, y)
#extent : 37, 44, 7, 12 (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84
#source : memory
#names : January, February, March, April, May, June, ...
#min values : 12.49764, 10.47718, 11.80974, 11.29624, 11.01105, 10.83298, ...
#max values : 18.90536, 16.95743, 20.57114, 18.12099, 18.46543, 18.98500, ...
您可以向 tapp
添加一个 filename=
参数,但是如果您想将图层保存为单独的文件,您可以使用 writeRaster
代替。但是对于 terra,您需要自己提供文件名。
fnames <- paste0("rain_", 1:nlyr(B), ".tif")
writeRaster(B, fnames, overwrite=T)
(有一条关于 file_ext 的警告,您可以忽略)
我的 .nc 文件大小约为 651 MB,其中包含几个数据集(每日)(rr_mrg_19810101_20181231_ENACT.nc) 数据。我需要将 (rr_mrg_19810101_20181231_ENACT.nc) 数据集转换为多个 GeoTIFF(每个时间片一个 .tif,每月一次)。同样,我想阅读时间序列。但是我发现
Error in .local(x, time, ...) :
time must has the same length as the number of layers in RasterBrick][1]
这是我做的
library(raster)
library(zoo)
library(rts)
TRF = brick("rr_mrg_19810101_20181231_ENACT.nc")
crs(TRF) <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84
+towgs84=0,0,0"
Awash_Extent<-c(37,44, 7,12)
Awash_E_resize<- crop(TRF,Awash_Extent)
Awash_Month<-seq(as.Date('1981-01-01'),as.Date('2018-12-31'),by =
"month")
rt <- rts(Awash_E_resize, Awash_Month)
write.rts(Awash_E_resize, filename='Awash_TRF_1981_2018_mon.tif',
overwrite=TRUE)
你能帮我解决这个问题吗?
这么简单的东西也能做到这一点
library(raster)
b <- brick("rr_mrg_19810101_20181231_ENACT.nc")
writeRaster(b, "timeslice.tif", bylayer=TRUE)
根据您的扩展问题:
用terra
读取值(不需要其他包)
library(terra)
TRF = rast("rr_mrg_19810101_20181231_ENACT.nc")
Awash_Extent<-c(37,44, 7,12)
Awash_E_resize<- crop(TRF,Awash_Extent)
我在这里创建了类似的东西:
A <- rast(ext(37,44, 7,12), nlyr=365)
values(A) <- runif(size(A))
terra::time(A) <- seq(as.Date('1981-01-01'), as.Date('1981-12-31'), 1)
现在按月汇总:
m <- months(time(A))
f <- factor(m, levels=unique(m))
B <- tapp(A, m, fun=sum)
B
#class : SpatRaster
#dimensions : 10, 10, 12 (nrow, ncol, nlyr)
#resolution : 0.7, 0.5 (x, y)
#extent : 37, 44, 7, 12 (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84
#source : memory
#names : January, February, March, April, May, June, ...
#min values : 12.49764, 10.47718, 11.80974, 11.29624, 11.01105, 10.83298, ...
#max values : 18.90536, 16.95743, 20.57114, 18.12099, 18.46543, 18.98500, ...
您可以向 tapp
添加一个 filename=
参数,但是如果您想将图层保存为单独的文件,您可以使用 writeRaster
代替。但是对于 terra,您需要自己提供文件名。
fnames <- paste0("rain_", 1:nlyr(B), ".tif")
writeRaster(B, fnames, overwrite=T)
(有一条关于 file_ext 的警告,您可以忽略)