本节将介绍NC格式数据处理、不同时间尺度合成、裁剪、区域统计、结果输出等内容。
R-terra包优于raster包的一个方面就是数据读取,即terra包中的rast
函数可以读取单个波段的数据,也可读取多波段的数据。如对于nc格式( netCDFs )这种多维数据格式来说,可以直接读取。
在R中,也有专门的ncdf4包用于处理nc数据。
本次数据来源于国家地球系统科学数据中心中的"1901-2020年中国1km分辨率逐月平均气温数据集",选取2015-2020年的数据,共6年,格式为.nc,如下图所示:
因解压后在不同文件夹中,均在./tmp_data
文件夹下,因此采用list.files
函数遍历所有.nc
的文件,使用pattern
参数控制
#遍历所有`.nc`的文件
files <- list.files(path = "E:/Data/R_save/tmp_data/", pattern = "*.nc",
full.names = TRUE, recursive = TRUE)
files
# 采用rast读取
tmp_f<- rast(files)
报错,提示extents不匹配
共有4个nc文件,那依次读取并各个文件的extents,如下
par(mfrow=c(2,2))
for (i in 1:4) {
r <- rast(files[i])
plot(r[[7]])
print(r)
}
发现第一幅图是仅为中国范围,其他三幅范围较大。
SpatRaster
因此4个nc文件分两组,再采用crop
函数裁剪到相同范围;并重命名,便于后续处理
#分组rast
tmp_1 <- rast(files[1])
tmp_1
tmp_2 <- rast(files[-1])
tmp_2
#裁剪
tmp_22 <- crop(tmp_1, tmp_2)
tmp_22
plot(tmp_22$tmp_33)
#
# 比较两个数据的空间信息是否相同
compareGeom(tmp_1, tmp_22)
#组合
tmp_f <- c(tmp_1, tmp_22)
tmp_f
#重命名
names(tmp_f)
names(tmp_f) <- c(1:72)
names(tmp_f)
至此我们获得了6年72个月的平均气温数据,后续可以进行不同时间尺度合成、统计各月或者各年的均值、统计不同行政区的平均气温等操作。
#加载一个区划
hnhb <- vect("E:/Data/R_save/hnhb.shp")
# 融合成省
hnhb1 <- aggregate(hnhb, "id_sheng")
plot(hnhb1, col = rainbow(n) )
text(hnhb1, "sheng", cex=.8, halo = TRUE)
#裁剪
tmp_fclip <- crop(tmp_f, hnhb, mask = TRUE)
tmp_fclip
plot(tmp_fclip[[1:4]])
在terra包有app、tapp、lapp、sapp、rapp
等的Local (cell based) method方法,可用像元或者全局的尺度处理多层栅格数据。
#按年合成
tmp_yearly <- tapp(tmp_fclip, rep(1:6, each = 12), fun = mean, na.rm = TRUE)
tmp_yearly
plot(tmp_yearly)
# 得到各年像元值的均值
global(tmp_yearly, 'mean', na.rm = TRUE)
#多年最大
tmpmvc <- app(tmp_yearly, max, na.rm = TRUE)
plot(tmpmvc)
#统计各行政区均值
tj1 <- extract(tmp_yearly, hnhb1, mean, na.rm=TRUE)
tj2 <- extract(tmp_yearly, hnhb1, max, na.rm=TRUE)
tj12 <- merge(tj1, tj2, by.x = "ID", by.y = "ID")
tj12
# 多波段输出
writeRaster(tmp_yearly,
filename = paste0("E:/Data/R_save/tmp_data/output/",2015:2020, ".tif"))
# 单波段多个TIFF
writeRaster(tmp_yearly,
filename = "E:/Data/R_save/tmp_data/output/tmp_15-20year.tif", names = 2015:2020)