terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成

terra|第三节:批量处理NC数据处理与输出、不同时间尺度影像合成

本节将介绍NC格式数据处理、不同时间尺度合成、裁剪、区域统计、结果输出等内容。

NC格式数据处理

R-terra包优于raster包的一个方面就是数据读取,即terra包中的rast函数可以读取单个波段的数据,也可读取多波段的数据。如对于nc格式( netCDFs )这种多维数据格式来说,可以直接读取。
在R中,也有专门的ncdf4包用于处理nc数据。

读取.nc数据

数据介绍

本次数据来源于国家地球系统科学数据中心中的"1901-2020年中国1km分辨率逐月平均气温数据集",选取2015-2020年的数据,共6年,格式为.nc,如下图所示:
terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第1张图片

读取.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不匹配
terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第2张图片
共有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)

terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第3张图片

至此我们获得了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)
#裁剪

terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第4张图片

裁剪栅格得研究区气温栅格数据

tmp_fclip <- crop(tmp_f, hnhb, mask = TRUE)
tmp_fclip
plot(tmp_fclip[[1:4]])

terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第5张图片
terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第6张图片

不同时间尺度合成

在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)

terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第7张图片
terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第8张图片

多年最大合成气温

#多年最大
tmpmvc <- app(tmp_yearly, max,  na.rm = TRUE)
plot(tmpmvc)

terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第9张图片

区域统计,得到各行政区各年的气温均值

#统计各行政区均值
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

terra-第三节:NC格式数据处理与输出、不同时间尺度影像合成_第10张图片

结果输出

nc格式输出为多个tif、或者多波段tif

#  多波段输出
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)     

你可能感兴趣的:(R-terra包,空间数据处理,r语言,开发语言)