查看原文
其他

对比R语言Raster包和Terra包栅格计算

走天涯徐小洋 走天涯徐小洋地理数据科学 2022-05-17

Terra包可以认为是Raster的改进版,据说使用C语言重写了函数,提高了效率,同时支持并行计算,对于大数据量的栅格计算很有优势,我接下来就给大家展示一下我的试验。

这次实验数据是MODIS250m的NDVI数据,数据量比较大,有2272×4299个像元,20个波段。为了保证计算公平性,我都是从数据读取开始计时,统一计算变异系数cv,然后绘图,得到运行时间。

要计算的栅格

Raster计算CV

#Raster计算CV
t1=proc.time()
#程序体
flnames <- list.files(path = './qb_NDVI/', pattern = '.tif$')
fl <- paste0("./qb_NDVI/", flnames)
qb_NDVI <- brick(lapply(fl, raster))
qb_CV <- calc(qb_NDVI, cv)
plot(qb_CV)
t2=proc.time()
t=t2-t1
print(paste0('执行时间:',t[3][[1]],'秒'))

[1] "执行时间:264.080000000002秒"

Terra计算CV

未开启并行计算

我先使用非并行计算的方式计算变异系数,采用的数据和前面相同,在计算前先清空了前面计算读取数据缓存

t1=proc.time()
#程序体
flnames <- list.files(path = './qb_NDVI/', pattern = '.tif$')
fl <- paste0("./qb_NDVI/", flnames)
terra_qb <- rast(fl) #Terra包读取文件夹下所有TIFF,组成一个多波段数据
terra_cv <- app(terra_qb, cv)
plot(terra_cv)
#计时结束
t2=proc.time()
t=t2-t1
print(paste0('执行时间:',t[3][[1]],'秒'))

"执行时间:252.920000000013秒"

由此可见,经过优化的Terra包计算确实要比Raster快一些,缩短了十几秒的计算时间,那么我们再看看并行计算的情况呢?

Terra开启并行计算

这次开启了四核并行运算

t1=proc.time()
#程序体
flnames <- list.files(path = './qb_NDVI/', pattern = '.tif$')
fl <- paste0("./qb_NDVI/", flnames)
terra_qb <- rast(fl)  #Terra包读取文件夹下所有TIFF,组成一个多波段数据
terra_cv <- app(terra_qb, cv, cores=4)   #开了四核的并行计算
plot(terra_cv)
#计时结束
t2=proc.time()
t=t2-t1
print(paste0('执行时间:',t[3][[1]],'秒'))

"执行时间:92.1699999999983秒"

大大提速!接下来再试试8核齐开的情况呢?

"执行时间:64.3699999999953秒"

虽然8核比4核核心数增加了一倍,但是用时并没有减少为原来的一半,不过依然有着明显的提速效果。

结论:强烈安利Terra包,代替Raster执行栅格计算!

Raster和Terra函数对比

为了方便学习Rater和Terra包,下面引用一下Terra帮助中的Raster和Terra函数对比说明,Terra帮助文档中写的比较简略,但是结合这个对比来看,很多函数的特性就会更加明白。

函数对照表

参考文献

  1. https://github.com/rspatial/terra
  2. https://rspatial.org/terra/modis/5-processing.html#ndvi
  3. R语言NDVI变异系数计算与结果分析
  4. 更多NDVI文章请查阅#NDVI专辑


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存