使用lidR通过Shapefile多边形分类LAS点云并添加树行号字段
用lidR包基于Shapefile多边形为LAS点云添加树行号字段
核心方案
通过lidR的merge_spatial函数将Shapefile多边形的树行号属性关联到对应范围内的LAS点云,核心是保证两者坐标系一致,再完成属性映射。
具体操作步骤
1. 加载依赖与数据
先加载所需R包,读取LAS点云和Shapefile,优先检查坐标系匹配性:
library(lidR) library(sf) # 读取目标LAS文件 las <- readLAS("your_input.las") # 读取包含树行号的Shapefile(替换为你的文件路径) tree_rows_shp <- st_read("tree_rows_polygons.shp") # 验证坐标系是否一致,返回TRUE才继续 st_crs(las) == st_crs(tree_rows_shp)
若返回FALSE,先对Shapefile做坐标转换:
tree_rows_shp <- st_transform(tree_rows_shp, st_crs(las))
2. 关联树行号到点云
使用merge_spatial将Shapefile中存储树行号的字段(比如你属性表中的RowNo),映射为LAS点云的新字段(比如命名为TreeRowID):
# 假设Shapefile中树行号字段为RowNo,新增到LAS中的字段名设为TreeRowID las <- merge_spatial(las, tree_rows_shp, field = "TreeRowID", by = "RowNo")
执行后,LAS对象的属性表会新增TreeRowID字段,每个点将被赋予其所在多边形的树行号。
3. 验证与导出结果
检查新增字段的有效性,并导出修改后的LAS文件:
# 查看属性表前几行,确认TreeRowID字段存在 head(las@data) # 统计不同树行号的点数量,验证匹配逻辑 table(las$TreeRowID, useNA = "ifany") # 导出最终LAS文件 writeLAS(las, "output_with_treerow.las")
常见问题排查
- 部分点
TreeRowID为NA:检查这些点是否落在所有多边形范围外,或Shapefile存在拓扑错误,可通过st_is_valid(tree_rows_shp)验证,错误修复用tree_rows_shp <- st_make_valid(tree_rows_shp)。 - 运行效率低:先对LAS建立空间索引优化速度:
las <- lasopt_buildindex(las)。
内容的提问来源于stack exchange,提问作者John stats
相关产品推荐
相关产品推荐

