如何在R语言中将treeID列表传入filter_poi函数过滤点云
批量移除指定treeID的激光雷达点云数据
你可以利用R的%in%运算符(配合取反!)来实现批量过滤,不用逐个编写treeID != x的条件,具体方法如下:
核心解决方案
假设你已经有了需要移除的treeID列表(比如命名为bad_treeIDs,包含所有点云数量少于100的treeID),直接执行以下代码:
las_filtered <- filter_poi(las, !treeID %in% bad_treeIDs)
如果你的环境加载了tidyverse包,也可以用更直观的%notin%运算符:
library(tidyverse) las_filtered <- filter_poi(las, treeID %notin% bad_treeIDs)
代码说明
treeID %in% bad_treeIDs会逐个检查每个点云的treeID是否存在于待移除列表中,返回布尔值(存在为TRUE,不存在为FALSE)- 前面加
!取反后,就会保留所有不在待移除列表里的点云,正好实现批量移除目标treeID的效果
补充:如何生成待移除的treeID列表
如果你还没筛选出点云数量少于100的treeID,可以通过以下步骤生成:
# 统计每个treeID对应的点云数量 tree_counts <- las@data %>% dplyr::group_by(treeID) %>% dplyr::summarise(point_count = dplyr::n()) # 筛选出点云数<100的treeID,存入bad_treeIDs bad_treeIDs <- tree_counts %>% dplyr::filter(point_count < 100) %>% dplyr::pull(treeID)
内容的提问来源于stack exchange,提问作者Purple_Ad
相关产品推荐
相关产品推荐

