如何手动加载大型栅格以执行lidR::locate_trees()?
问题:使用lidR处理大尺寸CHM栅格时的单木检测错误
我尝试用R语言的lidR包对LIDAR生成的冠层高度模型(CHM)栅格做单木检测,该栅格大小约2.5GB。运行locate_trees()函数时抛出错误:
Error: Large on-disk rasters are not supported by locate_tree. Load the raster manually.
请问“手动加载栅格”是什么意思?该如何操作?
复现流程(注意:生成超3GB伪栅格可能导致R会话崩溃或耗时极长,运行前需谨慎)
library(lidR) library(terra) # 创建包含30亿个单元格的伪栅格 chm <- rast(xmin=-121.5, xmax=-120, ymin=44.5, ymax=45.5, crs="EPSG:2992", nrows=150000, ncols=200000) # 为栅格单元格赋予随机值 values(chm) <- rnorm(3000000000, 20, 5) # 将栅格写入磁盘 writeRaster(chm, paste(tempdir(), "CHM_Example.tif", sep="/"), filetype="GTiff") # 用terra框架读取栅格到R(此时仅为磁盘引用,未加载到内存) canopy <- rast(paste(tempdir(), "CHM_Example.tif", sep="/")) # 尝试执行单木检测,此处抛出错误 taos <- locate_trees(canopy, lmf(ws=5))
解答
错误原因与“手动加载栅格”的含义
当你用terra::rast()读取大栅格时,默认不会把整个文件加载到内存,而是创建一个磁盘栅格的引用对象,后续按需分块读取数据。但lidR::locate_trees()的算法需要直接访问完整的栅格数据,无法处理这种分块的磁盘引用,因此要求你“手动加载栅格”——也就是把整个栅格数据从磁盘加载到R的内存中,让函数可以直接访问全部数据。
具体操作方法
有两种简单的方式可以实现手动加载:
方法1:使用terra::readAll()强制加载
读取栅格后,调用readAll()将数据全部载入内存:
# 读取磁盘栅格(仅引用) canopy <- rast(paste(tempdir(), "CHM_Example.tif", sep="/")) # 手动加载全部数据到内存 canopy <- readAll(canopy) # 执行单木检测 taos <- locate_trees(canopy, lmf(ws=5))
方法2:读取时直接指定mem=TRUE(terra 1.6.0及以上版本支持)
在rast()读取时添加mem=TRUE参数,直接把栅格加载到内存:
# 直接读取并加载栅格到内存 canopy <- rast(paste(tempdir(), "CHM_Example.tif", sep="/"), mem=TRUE) # 执行单木检测 taos <- locate_trees(canopy, lmf(ws=5))
注意:加载2.5GB的栅格需要确保你的R会话有足够的可用内存(建议预留至少3-4倍于栅格大小的内存空间,避免内存不足导致崩溃)。
内容的提问来源于stack exchange,提问作者Sean McKenzie
相关产品推荐
相关产品推荐

