lidR中catalog_apply无法读取chunk及is.empty方法报错求助
问题解决步骤
验证LAScatalog有效性
- 打印
LAScatalog对象确认瓦片加载状态:
检查输出中文件数量是否为4000,以及文件路径是否存在、无拼写错误。print(ctg) - 重建空间索引,避免边界匹配错误:
ctg <- catalog_build_index(ctg)
- 打印
修正catalog_apply()调用逻辑
自定义函数必须手动读取chunk数据,这是导致LAS对象为空的核心原因之一,示例模板:process_roads <- function(chunk) { # 手动读取当前chunk的LAS数据 las <- readLAS(chunk) # 检查数据是否有效,避免空对象报错 if (lidR::is.empty(las)) return(NULL) # 调用ALSroads的处理函数 result <- ALSroads::mesure_roads(las) return(result) }调用时确保使用串行模式调试:
catalog_apply(ctg, process_roads, .mode = "sequential")解决is.empty方法缺失问题
- 更新lidR到最新版本,修复方法注册bug:
update.packages("lidR") - 若仍存在冲突,明确指定lidR的
is.empty方法:if (lidR:::is.empty.LAS(las)) return(NULL) - 检查包冲突,用
conflicts()查看是否有其他包覆盖了is.empty函数,必要时临时卸载冲突包。
- 更新lidR到最新版本,修复方法注册bug:
调试单个瓦片与chunk
- 先验证单个瓦片能正常运行
mesure_roads:test_las <- readLAS("path/to/single_tile.las") ALSroads::mesure_roads(test_las) - 在自定义函数中加入调试输出,跟踪chunk和LAS状态:
process_roads <- function(chunk) { print(paste("Chunk bounds:", chunk@bbox)) las <- readLAS(chunk) print(paste("LAS points count:", npoints(las))) if (lidR::is.empty(las)) return(NULL) return(ALSroads::mesure_roads(las)) }
- 先验证单个瓦片能正常运行
优化大场景处理参数
针对4000个1km²瓦片,调整chunk参数匹配数据:ctg@options$chunk_size <- 1000 # 与瓦片尺寸一致,避免跨片读取 ctg@options$chunk_buffer <- 0 # 无需缓冲区时关闭,减少数据量 ctg@options$progress <- TRUE # 显示处理进度并行处理前需正确配置
future后端:library(future) plan(multisession, workers = 4) # 根据CPU核心数调整
内容的提问来源于stack exchange,提问作者Francis Lessard
相关产品推荐
相关产品推荐

