如何从lidr的LAS对象中提取各treeID对应点云并统计点数
在lidr中遍历treeID提取单木点云并统计点数
1. 获取所有唯一的treeID
先从LAS对象中提取所有不重复的treeID,作为后续遍历的依据:
unique_tree_ids <- unique(las$treeID)
2. 批量提取单木点云到列表
推荐用lidr内置的split()函数直接按treeID分割LAS对象,这比手动循环调用filter_poi()效率更高,尤其适合大规模点云场景:
# 按treeID分割,得到每个单木对应的LAS对象列表 tree_las_list <- split(las, las$treeID)
如果需要手动循环实现,也可以这么写:
tree_las_list <- list() for (id in unique_tree_ids) { # 用treeID作为列表元素名称,方便后续查找 tree_las_list[[as.character(id)]] <- filter_poi(las, treeID == id) }
3. 提取LAS对象的点云数据
你打印LAS对象时看到的是元信息,原始点云数据存储在LAS对象的@data插槽中(S4类结构),也可以用data()方法直接获取:
# 提取列表中第一个单木的点云数据(data.table格式) first_tree_points <- tree_las_list[[1]]@data # 或者用data()方法 first_tree_points <- data(tree_las_list[[1]])
4. 统计每棵树的点云数量
用lidr提供的npoints()函数可以快速获取LAS对象的点数,结合sapply()就能批量统计所有单木的点数:
# 生成命名向量,名称为treeID,值为对应点数 tree_point_counts <- sapply(tree_las_list, npoints) # 查看指定treeID的点数,比如treeID=1 print(tree_point_counts["1"])
也可以直接通过点云数据框的行数统计:
tree_point_counts <- sapply(tree_las_list, function(x) nrow(x@data))
内容的提问来源于stack exchange,提问作者Purple_Ad
相关产品推荐
相关产品推荐

