在R中使用lapply从LiDAR数据批量生成栅格文件
批量处理LAS文件生成ASC格式冠层高度模型
步骤1:封装单文件处理逻辑为函数
将你的单文件处理代码封装成可复用函数,自动根据输入LAS文件名生成对应ASC输出:
library(lidR) library(raster) # 定义噪声过滤函数 lasfilternoise <- function(las, sensitivity) { p95 <- grid_metrics(las, ~quantile(Z, probs = 0.95), 10) las <- merge_spatial(las, p95, "p95") las <- filter_poi(las, Z < p95*sensitivity) las$p95 <- NULL return(las) } # 定义单文件处理函数 process_las_to_asc <- function(las_file_path, output_dir = NULL) { # 读取LAS文件并筛选植被/地面点类 las <- readLAS(las_file_path, filter = "-keep_class 1 2") # 高程归一化处理 dtm <- grid_terrain(las, algorithm = knnidw(k = 8, p = 2)) las_normalized <- normalize_height(las, dtm) # 点云去噪 las_denoised <- lasfilternoise(las_normalized, sensitivity = 1.2) # 生成无空洞冠层高度模型 chm <- grid_canopy(las_denoised, 0.32, pitfree(c(0,2,5,10,15), c(3,1.5), subcircle = 0.2)) # 中值滤波平滑CHM ker <- matrix(1, 3, 3) chms <- raster::focal(chm, w = ker, fun = median) # 构建输出文件路径 if (is.null(output_dir)) { # 默认输出到原LAS文件同目录 output_file <- gsub("\\.las$", ".asc", las_file_path, ignore.case = TRUE) } else { # 指定输出目录时保留原文件名 file_name <- basename(las_file_path) output_file <- file.path(output_dir, gsub("\\.las$", ".asc", file_name, ignore.case = TRUE)) } # 写入ASC格式文件 writeRaster(chms, filename = output_file, format = "ascii", overwrite = TRUE) # 打印处理进度 cat(sprintf("处理完成:%s -> %s\n", las_file_path, output_file)) }
步骤2:批量处理文件夹中所有LAS文件
使用list.files获取目标文件夹下的所有LAS文件,再通过lapply批量调用处理函数:
# 设置LAS文件所在文件夹路径 las_dir <- "你的LAS文件存放路径" # 获取所有LAS文件的完整路径(兼容.LAS和.las后缀) las_files <- list.files(las_dir, pattern = "\\.las$", full.names = TRUE, ignore.case = TRUE) # 批量处理所有文件 lapply(las_files, process_las_to_asc) # 若需指定输出目录,改用以下代码 # output_dir <- "你的ASC文件输出路径" # lapply(las_files, process_las_to_asc, output_dir = output_dir)
关键细节说明
- 文件名匹配:
ignore.case = TRUE确保同时识别大写和小写的.las后缀 - 路径灵活配置:可选
output_dir参数支持将结果输出到独立文件夹,避免和原LAS文件混杂 - 批量执行:
lapply会返回处理结果列表,若无需保留结果,可使用purrr::walk(需先安装purrr包)提升效率
内容的提问来源于stack exchange,提问作者Tobias Rydlinge
相关产品推荐
相关产品推荐

