描述
通过从激光雷达数据中捕获的屋顶点创建建筑物模型。
插图
使用方法
此工具假设正在进行处理的 LAS 点可提供建筑物屋顶的所需覆盖范围。要获得最佳效果,请避免包含表示建筑物(而非屋顶)部分的点,因为其通常会向生成的建筑物模型添加噪点。
可以通过从建筑物覆盖区内找到的所选 LAS 点构造 TIN 来生成建筑物模型。覆盖区将作为裁剪面整合到此 TIN 中,其高度由其范围内的最低 LAS 点定义。地面高度可以提供建筑物的基础,并且从覆盖区面的属性表或高程表面中的字段中获取。
如果地面高度从覆盖区面属性表的字段中获取,则假设其高度单位与输入 LAS 数据集的 z 单位相同。如果以不同的线性单位表示属性表中的高度,请考虑使用计算字段工具,以在使用此工具之前应用适当的转换系数。可以通过以下方式将地面高度归于建筑物覆盖区面:
- 使用图层属性或创建 LAS 数据集图层工具对地面点的 LAS 数据集进行过滤。
- 运行添加表面信息工具,其中输入要素设置为建筑物覆盖区面,输入表面设置为经过地面过滤的 LAS 数据集,并且输出属性设置为 Z_MIN 值,以确保建筑物达到最低 z 值。
如果地面高度由地面定义,则沿面边界的最小 z 值将定义建筑物的基本高度。表面应使用与 LAS 数据集相同的垂直坐标系。通过对地面分类点的 LAS 数据集进行过滤,然后使用 LAS 数据集转栅格或 LAS 数据集转 TIN 工具以生成表面,可以根据地面分类的 LAS 点来创建地面的 TIN 或栅格表面。
执行此工具之前,应对地面点进行分类。如果地面点尚未分类,请考虑使用 分类 LAS 地面工具对其进行分类。
请考虑使用分类 LAS 建筑物工具来识别表示建筑物屋顶的点,尤其是有植被悬垂在屋顶的情况。使用建筑物分类的点执行此工具之前,请检查自动分类的结果,并考虑通过交互式分类编辑进行任何必要的修改。
当存在 LAS 数据集的统计数据时,将更加有效地处理 LAS 点。如有必要,请考虑使用 LAS 数据集统计数据工具来计算统计数据。
语法
arcpy.3d.LasBuildingMultipatch(in_las_dataset, in_features, ground, out_feature_class, {point_selection}, simplification)
参数 | 说明 | 数据类型 |
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 点。
| String |
simplification | 可用于减少影响建筑物屋顶建模的 LAS 点数量的 z 容差值。此值用于定义输出屋顶模型与屋顶表面(通过全分辨率下的 LAS 点创建)之间的偏差的最大阈值。 | Linear Unit |
代码示例
下面的示例演示了如何在 Python 窗口中使用此工具。
arcpy.env.workspace = 'C:/data'
arcpy.LasBuildingMultipatch_3d('Highland.lasd', 'footprint.shp', 'dem.tif',
'highland_3d_bldgs.shp', simplification='4 Feet')
下面的示例演示了如何在独立 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