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

使用lidR的segment_trees与ForestTools::mcws时触发函数算法无效错误

问题:lidR结合ForestTools的mcws()分割LiDAR点云触发"Invalid function provided as algorithm"错误

尝试使用ForestTools包的mcws()函数配合lidR的segment_trees()分割LiDAR点云时,触发错误:

Error: Invalid function provided as algorithm.

原代码:

library(lidR)
library(ForestTools)
library(raster)
library(sf)

LASfile <- system.file("extdata", "Megaplot.laz", package="lidR")
las = readLAS(LASfile)
chm <- rasterize_canopy(las, 1, p2r(0.15), pkg = "raster")
vwf_fun <- function(x){x * 0.06 + 0.5}
WindowFilter <- vwf(CHM = chm, winFun = vwf_fun)
las <- segment_trees(las, ForestTools::mcws(WindowFilter, chm, minHeight = 2, format = "raster"))

错误原因

segment_trees()的algorithm参数要求传入可执行的函数对象(该函数需接收LAS对象并返回带分割结果的LAS对象),但你直接调用了ForestTools::mcws(),这会立即执行并返回一个栅格图层,而非符合要求的函数,因此触发参数类型错误。


修复方案

方案1:使用ForestTools官方适配的mcws_segmentation()函数

ForestTools提供了mcws_segmentation(),专门适配lidR的segment_trees()接口,无需手动处理栅格与点云的关联:

library(lidR)
library(ForestTools)
library(raster)
library(sf)

LASfile <- system.file("extdata", "Megaplot.laz", package="lidR")
las = readLAS(LASfile)
chm <- rasterize_canopy(las, 1, p2r(0.15), pkg = "raster")
vwf_fun <- function(x){x * 0.06 + 0.5}
WindowFilter <- vwf(CHM = chm, winFun = vwf_fun)

# 使用适配接口
las <- segment_trees(las, mcws_segmentation(CHM = chm, winFilter = WindowFilter, minHeight = 2))

方案2:手动封装mcws逻辑为函数

如果需要自定义流程,可以将mcws()的调用逻辑封装成接收LAS对象的函数,传递给segment_trees():

library(lidR)
library(ForestTools)
library(raster)
library(sf)

LASfile <- system.file("extdata", "Megaplot.laz", package="lidR")
las = readLAS(LASfile)

# 封装分割逻辑
mcws_segment_func <- function(las_obj) {
  # 生成CHM
  chm <- rasterize_canopy(las_obj, 1, p2r(0.15), pkg = "raster")
  # 生成窗口过滤器
  vwf_fun <- function(x){x * 0.06 + 0.5}
  WindowFilter <- vwf(CHM = chm, winFun = vwf_fun)
  # 执行mcws分割
  seg_raster <- ForestTools::mcws(WindowFilter, chm, minHeight = 2, format = "raster")
  # 将分割结果关联到点云
  las_obj <- merge_spatial(las_obj, seg_raster, attribute = "treeID")
  return(las_obj)
}

# 调用segment_trees
las <- segment_trees(las, mcws_segment_func)

内容的提问来源于stack exchange,提问作者Purple_Ad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:20:01