LAS 建筑物多面体 (3D Analyst)

摘要

使用 LAS 数据集中的屋顶点创建建筑物模型。

插图

LAS 建筑物多面体工具图示

使用情况

  • 该工具使用 LAS 数据集中的屋顶点、地面高度数据和建筑物覆盖区面将建筑物创建为多面体要素。 通过使用与建筑物覆盖区面重叠的 LAS 点构造 TIN 来生成各建筑物模型。 覆盖区将作为裁剪面整合到此 TIN 中,其高度派生自地面高度参数值。 然后,该 TIN 会转换为在基本高度处闭合的多面体。 由于生成的多面体基于 TIN 表面,因此多面体将不包括沿建筑物垂直轮廓的详细信息。

  • 输入 LAS 点应捕获建筑物屋顶。 尽可能排除代表屋顶以外的建筑元素的点,因为它们通常会导致输出具有不良特性。 分类 LAS 建筑物工具可用于将类代码值 6 分配给建筑物屋顶点。 该工具将为代表建筑物屋顶的点分配类代码值 6,但该工具具有用于对屋顶下方和上方的点进行分类的选项。 如果对这些点进行分类,请使用 6 以外的类代码来定义它们,以便在用于创建建筑物要素时将其排除。 检查建筑物分类的结果,并通过交互式编辑或使用不同的参数设置再次运行分类 LAS 建筑物工具来进行必要的更正。 如果 LAS 数据集不包含建筑物覆盖区上的任何非建筑物点,则所有点都可用于定义屋顶表面。

  • 采样分辨率参数值用于在构建 TIN 之前对 LAS 数据集中的点进行细化。 当输入是具有高密度点的点云时,或者当处理沿建筑物垂直轮廓的点时,此参数可优化工具的性能。 参数值表示细化区域的长度和宽度,因此 2 英尺的距离将导致将点云分箱到 2 英尺的格网中。 每个箱中的最高点将用于构建屋顶 TIN。 这样,可以缓解建筑物侧面点的影响。

  • 此工具不支持包含弧段的建筑物覆盖区面。 使用增密工具将弧段替换为直线段。

  • 地面高度参数值可以是高程表面或覆盖区面属性表中的字段。 使用表面时,建筑物的基本高度将是沿占覆盖区边界的最小 z 值。 表面应具有与 LAS 数据集相同的垂直坐标系。 可以从 LAS 数据集派生出地表,以确保建筑物与原始点云中的高度相匹配。 要从 LAS 数据集创建高程表面,请执行以下操作:

    1. 确保 LAS 数据集中存在地面分类点。 如果不是,请使用分类 LAS 地面工具为地面点分配类代码值 2。
    2. 使用图层属性或创建 LAS 数据集图层工具对地面点的 LAS 数据集图层进行过滤。
    3. 使用 LAS 数据集转栅格LAS 数据集转 TIN 工具创建可用作该工具输入的栅格或 TIN 表面。
  • 如果地面高度从覆盖区面属性表的字段中获取,则假设高度单位与输入 LAS 数据集的 z 单位相同。 如果属性表中的高度采用不同的线性单位,请使用计算字段工具以 LAS 数据集的线性单位计算新的高度值。 使用添加表面信息工具,最小地面高度可归因于地面高程表面的建筑物覆盖区面。

  • 如果为屋顶高度完全不同的相邻结构生成建筑物要素,则生成的每个建筑物的要素可以由附近建筑物的点来定义。 最小化此问题的一种方法是将每个要素归因于建筑物屋顶的高度范围,并将这些字段用作最小高度字段最大高度字段参数值。

  • 当 LAS 数据集包含统计数据时,将更加有效地处理 LAS 点。 请使用 LAS 数据集统计数据工具来计算统计数据。

参数

标注说明数据类型
输入 LAS 数据集

LAS 数据集包含将用于定义建筑物屋顶的点。

LAS Dataset Layer
输入要素

定义建筑物覆盖区面的面要素。

Feature Layer
地面高度

地面高度值的来源可以是建筑物覆盖区面属性表中的数值字段、栅格或 TIN 表面。 基于字段的地面源将比基于表面的地面源的处理速度快。

Field; Raster Layer; TIN Layer
输出多面体要素类

用于存储输出建筑物模型的多面体要素类。

Feature Class
LAS 屋顶点选择
(可选)

指定将用于定义建筑物屋顶的 LAS 点。

  • 建筑物分类点将使用分配的类代码值为 6 的 LAS 点。 这是默认设置。
  • 图层过滤点将使用按输入图层过滤的 LAS 点。
  • 所有点将使用与建筑物覆盖区面重叠的所有 LAS 点。
String
简化容差
(可选)

将用于简化屋顶几何图形的 z 容差值。 该值定义了输出屋顶模型与使用 LAS 点创建的 TIN 表面的最大偏差。

Linear Unit
采样分辨率
(可选)

用于在构建屋顶表面之前细化点云的分组大小。

Linear Unit
最小高度字段
(可选)

包含将用于定义屋顶的点的最小高度的数值字段。 可指定任意数值字段。 低于该字段中的值的点将被忽略。

Field
最大高度字段
(可选)

包含将用于定义屋顶的点的最大高度的数值字段。 可指定任意数值字段。 高于该字段中的值的点将被忽略。

Field

arcpy.ddd.LasBuildingMultipatch(in_las_dataset, in_features, ground, out_feature_class, {point_selection}, {simplification}, {sampling_resolution}, {min_height_field}, {max_height_field})
名称说明数据类型
in_las_dataset

LAS 数据集包含将用于定义建筑物屋顶的点。

LAS Dataset Layer
in_features

定义建筑物覆盖区面的面要素。

Feature Layer
ground

地面高度值的来源可以是建筑物覆盖区面属性表中的数值字段、栅格或 TIN 表面。 基于字段的地面源将比基于表面的地面源的处理速度快。

Field; Raster Layer; TIN Layer
out_feature_class

用于存储输出建筑物模型的多面体要素类。

Feature Class
point_selection
(可选)

指定将用于定义建筑物屋顶的 LAS 点。

  • BUILDING_CLASSIFIED_POINTS将使用分配的类代码值为 6 的 LAS 点。 这是默认设置。
  • LAYER_FILTERED_POINTS将使用按输入图层过滤的 LAS 点。
  • ALL_POINTS将使用与建筑物覆盖区面重叠的所有 LAS 点。
String
simplification
(可选)

将用于简化屋顶几何图形的 z 容差值。 该值定义了输出屋顶模型与使用 LAS 点创建的 TIN 表面的最大偏差。

Linear Unit
sampling_resolution
(可选)

用于在构建屋顶表面之前细化点云的分组大小。

Linear Unit
min_height_field
(可选)

包含将用于定义屋顶的点的最小高度的数值字段。 可指定任意数值字段。 低于该字段中的值的点将被忽略。

Field
max_height_field
(可选)

包含将用于定义屋顶的点的最大高度的数值字段。 可指定任意数值字段。 高于该字段中的值的点将被忽略。

Field

代码示例

LasBuildingMultipatch 示例 1(Python 窗口)

下面的示例演示了如何在 Python 窗口中使用此工具。

arcpy.env.workspace = 'C:/data'

arcpy.LasBuildingMultipatch_3d('Highland.lasd', 'footprint.shp', 'dem.tif', 
                               'highland_3d_bldgs.shp', simplification='4 Feet')
LasBuildingMultipatch 示例 2(独立脚本)

下面的示例演示了如何在独立 Python 脚本中使用此工具。

'''****************************************************************************
       Name: Extract Building Footprints & Generate 3D Models
Description: Extract footprint from lidar points classified as buildings, 
             regularize its geometry, and calculate the building height.

****************************************************************************'''
import arcpy

lasd = arcpy.GetParameterAsText(0)
footprint = arcpy.GetParameterAsText(1)
model = arcpy.GetParameterAsText(2)

try:
    lasd_layer = 'building points'
    arcpy.management.MakeLasDatasetLayer(lasd, lasd_layer, class_code=6)
    temp_raster = 'in_memory/bldg_raster'
    arcpy.management.LasPointStatsAsRaster(lasd_layer, temp_raster,
                                           'PREDOMINANT_CLASS', 'CELLSIZE', 2.5)
    temp_footprint = 'in_memory/footprint'
    arcpy.conversion.RasterToPolygon(temp_raster, temp_footprint)
    arcpy.ddd.RegularizeBuildingFootprint(temp_footprint, footprint, 
                                          method='RIGHT_ANGLES')
    arcpy.ddd.LasPointStatsByArea(lasd_layer, footprint, ['MIN_Z', 'MAX_Z'])
    arcpy.management.AddField(footprint, 'Height', 'Double')
    arcpy.management.CalculateField(footprint, 'Height', 
                                    "round('!Z_Max! - !Z_Min!', 2)", 
                                    'PYTHON_9.3')
    simplification = arcpy.Describe(lasd).pointSpacing * 4
    arcpy.ddd.LasBuildingMultipatch(lasd_layer, footprint, 'Z_MIN', model, 
                                    'BUILDING_CLASSIFIED_POINTS', simplification)


except arcpy.ExecuteError:
    print(arcpy.GetMessages())

许可信息

  • Basic: 需要 3D Analyst
  • Standard: 需要 3D Analyst
  • Advanced: 需要 3D Analyst

相关主题