You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:15:33