You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何手动加载大型栅格以执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:37:34