如何在LAScatalog中修改建筑类点的高程值为0?
城市树冠高度模型(CHM)生成:LAScatalog批量修改建筑点高程为0的实现
问题背景
处理覆盖城市区域的分类LAZ文件集合生成CHM时,若仅保留地面(分类2)和树木(分类5)点,三角化过程会因点缺失产生伪影。可行的解决思路是保留建筑类点(分类6),但将其高程值修改为0,既能避免伪影,又不会干扰树冠高度的计算。单个LAS文件的处理逻辑已明确,但使用LAScatalog批量处理时需要调整实现方式。
单个LAS文件的处理代码
# 读取LAS文件 las <- readLAS("path/to/file.laz") # 过滤保留建筑、树木、地面点 las <- filter_poi(las, las$Classification %in% c(6,5,2)) # 基于地面点归一化高程 las <- normalize_height(las, tin(), use_class=c(2L)) # 修改建筑点高程为0 las_buildings <- filter_poi(las, las$Classification %in% c(6)) las_buildings$Z <- 0 las_trees_ground <- filter_poi(las, las$Classification %in% c(5,2)) las <- rbind(las_buildings, las_trees_ground) # 生成CHM chm <- rasterize_canopy(las, 0.5, pitfree(subcircle=0.5))
LAScatalog批量处理实现方案
LAScatalog的批量处理需要通过catalog_apply自定义处理逻辑,将单个文件的操作封装为函数后批量应用到整个目录:
完整代码示例
# 加载LAScatalog ctg <- readLAScatalog("path/to/") # 设置处理参数:缓冲50米,指定临时输出路径 opt_chunk_buffer(ctg) <- 50 opt_output_files(ctg) <- paste0(tempdir(), "/{*}_processed") # 定义自定义处理函数 process_las <- function(las) { # 过滤保留建筑、树木、地面点 las <- filter_poi(las, las$Classification %in% c(6,5,2)) # 基于地面点归一化高程 las <- normalize_height(las, tin(), use_class=c(2L)) # 直接修改建筑点的高程值为0 las@data[las@data$Classification == 6, "Z"] <- 0 return(las) } # 批量处理所有LAS文件 ctg_processed <- catalog_apply(ctg, process_las) # 生成批量CHM opt_output_files(ctg_processed) <- paste0(tempdir(), "/{*}_chm") chm <- rasterize_canopy(ctg_processed, 0.5, pitfree(subcircle=0.5), pkg="terra") # 导出最终CHM terra::writeRaster(chm, "chm.tif")
关键说明
- 用
catalog_apply替代分步操作,将过滤、归一化、修改高程的逻辑封装到自定义函数中,确保每个处理块都执行完整流程 - 直接修改LAS对象的data表中建筑点的Z值,比拆分再合并的操作更高效
- 保留chunk缓冲设置,避免边缘区域处理产生伪影
内容的提问来源于stack exchange,提问作者kjtheron
相关产品推荐
相关产品推荐

