R语言新手如何用for循环遍历LiDAR txt文件计算参数并生成汇总表
for循环批量处理LiDAR txt数据的实现方案
前置操作确实需要先获取目标文件夹下的全部txt文件列表,避免逐个手动输入路径,完整落地的步骤如下:
第一步:批量匹配目标文件夹内的txt文件
先通过list.files()函数扫描指定文件夹,筛选所有后缀为txt的LiDAR文件,避免误读其他格式文件:
# 替换为你本地存放LiDAR txt的文件夹绝对路径 data_folder <- "C:/Users/LiDAR_data" # 读取路径下所有txt文件,返回带完整路径的文件列表 lidar_file_list <- list.files( path = data_folder, pattern = "\\.txt$", full.names = TRUE )
第二步:提前初始化结果存储结构
不要在循环里反复拼接数据框(会大幅降低运行效率),提前按照你需要的5个参数字段创建空的数据表,行数和文件总数一一对应:
batch_result <- data.frame( vegetation_area = numeric(length(lidar_file_list)), total_area = numeric(length(lidar_file_list)), baumhoehe = numeric(length(lidar_file_list)), gap_fraction_voxel = numeric(length(lidar_file_list)), lai_voxel = numeric(length(lidar_file_list)) )
第三步:嵌入原单文件计算逻辑完成循环遍历
循环时通过文件索引匹配结果表的行号,把原来写死的单文件路径替换成当前遍历到的文件路径,其余计算逻辑完全复用你已经调通的代码:
library(VoxR) # 按文件索引遍历,保证结果和文件一一对应不串位 for (idx in seq_along(lidar_file_list)) { # 获取当前循环处理的文件全路径 current_path <- lidar_file_list[idx] # 加载当前文件的点云数据 plot_xyz <- read.table(current_path) # 以下完全复用你已验证的单文件计算流程 plant_vox <- vox(plot_xyz, res = 0.1) plant_vox_filt <- subset(plant_vox, nbpts > 6) horizontal <- VoxR::project(plant_vox_filt, dim = "xy") vegetation_grid <- nrow(horizontal) vegetation_area <- vegetation_grid * 0.1^2 total_area <- 25 * 25 baumhoehe <- max(plant_vox$data...3.) - min(plant_vox$data...3.) gap_fraction_voxel <- 1 - vegetation_area / total_area lai_voxel <- -log(gap_fraction_voxel / baumhoehe) # 将计算结果写入结果表的对应行 batch_result[idx, ] <- c(vegetation_area, total_area, baumhoehe, gap_fraction_voxel, lai_voxel) } # 可选补充:新增一列存储对应文件名,方便后续核对 batch_result$source_file <- basename(lidar_file_list)
实操注意事项
- 可在循环开头加
message("正在处理:", basename(current_path))的运行提示,遇到报错时能快速定位出问题的单个文件,不用中断整个批量流程 - 循环跑完可直接用
write.csv(batch_result, "LiDAR批量计算结果.csv", row.names = FALSE)导出结果表,表结构和你给出的示例完全一致 - 体素过滤环节如果遇到过滤后无有效点云的文件,可在循环内加判断,当
nrow(horizontal) == 0时给该行赋值为NA,避免后续log计算出现无意义的报错值
内容的提问来源于stack exchange,提问作者Radde1683
相关产品推荐
相关产品推荐

