标注 | 说明 | 数据类型 |
输入要素 | 表示建筑物覆盖区的待规则化面。 | Feature Layer |
输出要素类 | 将生成的要素类。 | Feature Class |
方法 | 指定在输入要素处理过程中要使用的规则化方法。
| String |
容差 | 对于大多数方法,此值表示规则化覆盖区可从其原始要素的边界偏移的最大距离。 指定的值将基于输入要素坐标系的线性单位。 使用圆形方法时,基于在容差类型参数中的选择,此选项也可以解释为相对于规则化结果区域,原始要素与其规则化结果之间的差异。 | Double |
增密 | 用于评估规则化要素为直的或弯的采样间隔。 增密必须小于等于容差值。 此参数仅用于支持直角标识的方法。 | Double |
精度 | 将在规则化过程中使用的空间格网精度。 值的有效范围为 0.05 到 0.25。 | Double |
对角惩罚系数 | 如果使用直角和对角方法,则该值将识别在两条相邻线段之间构造直角或对角边的可能性。 如果使用任意角方法,则该值将识别构造相应对角边的可能性,这些对角边不符合由工具算法确定的首选边。 如果惩罚值设置为 0,则将不使用首选边,由此生成简化的不规则面。 通常,该值越高,则构造对角边的可能性越小。 | Double |
最小半径 | 适用于规则化圆的最小半径。 值 0 表示无最小尺寸限制。 此选项仅适用于圆形方法。 | Double |
最大半径 | 适用于规则化圆的最大半径。 此选项仅适用于圆形方法。 | Double |
对齐要素 (可选) | 将用于对齐规则化面方向的线要素。 每个面将仅与一个线要素对齐。 | Feature Layer |
对齐容差 (可选) | 将用于查找最近对齐要素的最大距离阈值。 例如,值 20 米表示将使用 20 米范围内的最近线来对齐规则化面。 | Linear Unit |
容差类型 (可选) | 指定当方法参数设置为圆形时,容差的应用方式。
| String |
摘要
通过消除几何中不需要出现的伪影来对建筑物覆盖区面的形状进行规范化。
插图
使用情况
此工具使用折线压缩算法校正通过要素提取工作流(该工作流可能会产生多余的伪影)创建的建筑物覆盖区面中的变形。
如果您的建筑物覆盖区包含圆形结构,请先处理这些要素。 紧凑度可用来识别圆形建筑物。 要计算此值,请执行以下操作:
- 添加双精度型字段。
- 使用字段计算器计算以下公式:
(4 * 3.14159265358979 * !shape.area!) / !shape.length! ** 2
- 一个正圆的值为 1。 但由于使用此工具处理的面会有些不规则,因此,值接近 1 的形状可能是圆形。 评估结果以识别圆形建筑物的最小值。 然后,选择大于或等于此值的值,并通过将方法参数设置为 CIRCLE 来执行此工具。
如果建筑物覆盖区表示具有边的几何,并且这些边可形成包括但不限于 45° 和 90° 折弯的角度组合,请将方法参数设置为任意角。 首先选择包含不规则边的要素子集,然后评估可产生所需结果的对角线惩罚值。 如果结果未充分捕获对角边,请修改容差值以约束规则化区域并逐渐减小对角线惩罚。 如果输出包含具有锐角的不需要的边,请迭代运行该工具,同时逐渐增大对角线惩罚,直到获得所需输出为止。 然后使用此值来处理整个数据集。
如果在计算机上使用任意角选项并且该计算机配备支持 CUDA 且具有超过 2 GB 内存的 NVIDIA 显卡,则该工具将使用 GPU 来执行其操作。 可以在处理器类型环境中修改此行为。 如果存在多个 GPU,则可通过 GPU ID 环境来设置所需 GPU。
如果工具无法对给定输入生成规则化解决方案,则会将原始要素复制到输出。 STATUS 字段中指定的值将指示是否按以下方式对要素进行规则化:
- 0 - 规则化要素
- 1 - 原始要素
当对大小变化很大的几何使用圆形方法时,使用容差类型参数的面积比选项可以产生比距离选项更好的结果,因为输出要素的构造将受到原始几何大小的约束,而固定大小可能适用于原始要素的有限子集。
参数
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 | 指定在输入要素处理过程中要使用的规则化方法。
| 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 时,容差的应用方式。
| String |
代码示例
下面的示例演示了如何在 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)
下面的示例演示了如何在独立 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