规则化建筑物覆盖区 (3D Analyst)

摘要

通过消除几何中不需要出现的伪影来对建筑物覆盖区面的形状进行规范化。

插图

规则化建筑物覆盖区工具图示

使用情况

  • 此工具使用折线压缩算法校正通过要素提取工作流(该工作流可能会产生多余的伪影)创建的建筑物覆盖区面中的变形。

  • 如果您的建筑物覆盖区包含圆形结构,请先处理这些要素。 紧凑度可用来识别圆形建筑物。 要计算此值,请执行以下操作:

    1. 添加双精度型字段。
    2. 使用字段计算器计算以下公式:
      (4 * 3.14159265358979 * !shape.area!) / !shape.length! ** 2
    3. 一个正圆的值为 1。 但由于使用此工具处理的面会有些不规则,因此,值接近 1 的形状可能是圆形。 评估结果以识别圆形建筑物的最小值。 然后,选择大于或等于此值的值,并通过将方法参数设置为 CIRCLE 来执行此工具。
  • 如果建筑物覆盖区表示具有边的几何,并且这些边可形成包括但不限于 45° 和 90° 折弯的角度组合,请将方法参数设置为任意角。 首先选择包含不规则边的要素子集,然后评估可产生所需结果的对角线惩罚值。 如果结果未充分捕获对角边,请修改容差值以约束规则化区域并逐渐减小对角线惩罚。 如果输出包含具有锐角的不需要的边,请迭代运行该工具,同时逐渐增大对角线惩罚,直到获得所需输出为止。 然后使用此值来处理整个数据集。

  • 如果在计算机上使用任意角选项并且该计算机配备支持 CUDA 且具有超过 2 GB 内存的 NVIDIA 显卡,则该工具将使用 GPU 来执行其操作。 可以在处理器类型环境中修改此行为。 如果存在多个 GPU,则可通过 GPU ID 环境来设置所需 GPU。

  • 如果工具无法对给定输入生成规则化解决方案,则会将原始要素复制到输出。 STATUS 字段中指定的值将指示是否按以下方式对要素进行规则化:

    • 0 - 规则化要素
    • 1 - 原始要素
  • 当对大小变化很大的几何使用圆形方法时,使用容差类型参数的面积比选项可以产生比距离选项更好的结果,因为输出要素的构造将受到原始几何大小的约束,而固定大小可能适用于原始要素的有限子集。

参数

标注说明数据类型
输入要素

表示建筑物覆盖区的待规则化面。

Feature Layer
输出要素类

将生成的要素类。

Feature Class
方法

指定在输入要素处理过程中要使用的规则化方法。

  • 直角将在相邻边之间构造由 90° 角组成的形状。
  • 直角和对角将在相邻边之间构造由 45° 和 90° 角组成的形状。
  • 任意角将在相邻边之间构造由任意角组成的形状。
  • 圆形将在输入要素周围构造最佳拟合圆。
String
容差

对于大多数方法,此值表示规则化覆盖区可从其原始要素的边界偏移的最大距离。 指定的值将基于输入要素坐标系的线性单位。 使用圆形方法时,基于在容差类型参数中的选择,此选项也可以解释为相对于规则化结果区域,原始要素与其规则化结果之间的差异。

Double
增密

用于评估规则化要素为直的或弯的采样间隔。 增密必须小于等于容差值。

此参数仅用于支持直角标识的方法。

Double
精度

将在规则化过程中使用的空间格网精度。 值的有效范围为 0.05 到 0.25。

Double
对角惩罚系数

如果使用直角和对角方法,则该值将识别在两条相邻线段之间构造直角或对角边的可能性。 如果使用任意角方法,则该值将识别构造相应对角边的可能性,这些对角边不符合由工具算法确定的首选边。 如果惩罚值设置为 0,则将不使用首选边,由此生成简化的不规则面。 通常,该值越高,则构造对角边的可能性越小。

Double
最小半径

适用于规则化圆的最小半径。 值 0 表示无最小尺寸限制。 此选项仅适用于圆形方法。

Double
最大半径

适用于规则化圆的最大半径。 此选项仅适用于圆形方法。

Double
对齐要素
(可选)

将用于对齐规则化面方向的线要素。 每个面将仅与一个线要素对齐。

Feature Layer
对齐容差
(可选)

将用于查找最近对齐要素的最大距离阈值。 例如,值 20 米表示将使用 20 米范围内的最近线来对齐规则化面。

Linear Unit
容差类型
(可选)

指定当方法参数设置为圆形时,容差的应用方式。

  • 距离分析表示距正在处理的要素边界的最大距离的容差。 这是默认设置。
  • 面积比表示非规则化圆形的原始要素的面积与规则化圆形的面积之比的容差上限。
String

arcpy.ddd.RegularizeBuildingFootprint(in_features, out_feature_class, method, tolerance, densification, precision, diagonal_penalty, min_radius, max_radius, {alignment_feature}, {alignment_tolerance}, {tolerance_type})
名称说明数据类型
in_features

表示建筑物覆盖区的待规则化面。

Feature Layer
out_feature_class

将生成的要素类。

Feature Class
method

指定在输入要素处理过程中要使用的规则化方法。

  • RIGHT_ANGLES将在相邻边之间构造由 90° 角组成的形状。
  • RIGHT_ANGLES_AND_DIAGONALS将在相邻边之间构造由 45° 和 90° 角组成的形状。
  • ANY_ANGLE将在相邻边之间构造由任意角组成的形状。
  • CIRCLE将在输入要素周围构造最佳拟合圆。
String
tolerance

对于大多数方法,此值表示规则化覆盖区可从其原始要素的边界偏移的最大距离。 指定的值将基于输入要素坐标系的线性单位。 使用 CIRCLE 方法时,基于在 tolerance_type 参数中的选择,此选项也可以解释为相对于规则化结果区域,原始要素与其规则化结果之间的差异。

Double
densification

用于评估规则化要素为直的或弯的采样间隔。 增密必须小于等于容差值。

此参数仅用于支持直角标识的方法。

Double
precision

将在规则化过程中使用的空间格网精度。 值的有效范围为 0.05 到 0.25。

Double
diagonal_penalty

如果使用 RIGHT_ANGLES_AND_DIAGONALS 方法,则该值将识别在两条相邻线段之间构造直角或对角边的可能性。 如果使用 ANY_ANGLES 方法,则该值将识别构造相应对角边的可能性,这些对角边不符合由工具算法确定的首选边。 通常,该值越高,则构造对角边的可能性越小。

Double
min_radius

适用于规则化圆的最小半径。 值 0 表示无最小尺寸限制。 此选项仅适用于 CIRCLE 方法。

Double
max_radius

适用于规则化圆的最大半径。 此选项仅适用于 CIRCLE 方法。

Double
alignment_feature
(可选)

将用于对齐规则化面方向的线要素。 每个面将仅与一个线要素对齐。

Feature Layer
alignment_tolerance
(可选)

将用于查找最近对齐要素的最大距离阈值。 例如,值 20 米表示将使用 20 米范围内的最近线来对齐规则化面。

Linear Unit
tolerance_type
(可选)

指定当 method 参数设置为 CIRCLE 时,容差的应用方式。

  • DISTANCE表示距正在处理的要素边界的最大距离的容差。 这是默认设置。
  • AREA_RATIO表示非规则化圆形的原始要素的面积与规则化圆形的面积之比的容差上限。
String

代码示例

RegularizeBuildingFootprint 示例 1(Python 窗口)

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

arcpy.env.workspace = 'c:/data'
arcpy.ddd.RegularizeBuildingFootprint('rough_footprints.shp', 
                                      'regularized_footprints.shp',
                                      method='Circle', tolerance=1.5, min_radius=10, 
                                      max_radius=20)
RegularizeBuildingFootprint 示例 2(独立脚本)

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

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

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

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

try:
    desc = arcpy.Describe(lasd)
    if desc.spatialReference.linearUnitName in ['Foot_US', 'Foot']:
        unit = 'Feet'
    else:
        unit = 'Meters'
    ptSpacing = desc.pointSpacing * 2.25
    sampling = '{0} {1}'.format(ptSpacing, unit)
    # Classify overlap points
    arcpy.ddd.ClassifyLASOverlap(lasd, sampling)
    # Classify ground points
    arcpy.ddd.ClassifyLasGround(lasd)
    # Filter for ground points
    arcpy.management.MakeLasDatasetLayer(lasd, 'ground', class_code=[2])
    # Generate DEM
    arcpy.conversion.LasDatasetToRaster('ground', dem, 'ELEVATION', 
                                        'BINNING NEAREST NATURAL_NEIGHBOR', 
                                        sampling_type='CELLSIZE', 
                                        sampling_value=desc.pointSpacing)
    # Classify noise points
    arcpy.ddd.ClassifyLasNoise(lasd, method='ISOLATION', edit_las='CLASSIFY', 
                               withheld='WITHHELD', ground=dem, 
                               low_z='-2 feet', high_z='300 feet', 
                               max_neighbors=ptSpacing, step_width=ptSpacing, 
                               step_height='10 feet')
    # Classify buildings
    arcpy.ddd.ClassifyLasBuilding(lasd, '7.5 feet', '80 Square Feet')
    #Classify vegetation
    arcpy.ddd.ClassifyLasByHeight(lasd, 'GROUND', [8, 20, 55], 
                                  compute_stats='COMPUTE_STATS')
    # Filter LAS dataset for building points
    lasd_layer = 'building points'
    arcpy.management.MakeLasDatasetLayer(lasd, lasd_layer, class_code=[6])
    # Export raster from lidar using only building points
    temp_raster = 'in_memory/bldg_raster'
    arcpy.management.LasPointStatsAsRaster(lasd_layer, temp_raster,
                                           'PREDOMINANT_CLASS', 'CELLSIZE', 2.5)
    # Convert building raster to polygon
    temp_footprint = 'in_memory/footprint'
    arcpy.conversion.RasterToPolygon(temp_raster, temp_footprint)
    # Regularize building footprints
    arcpy.ddd.RegularizeBuildingFootprint(temp_footprint, footprint, 
                                          method='RIGHT_ANGLES')

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

许可信息

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

相关主题