Упорядочить смежные контуры зданий (3D Analyst)

Сводка

Согласует контуры зданий с общими границами.

Использование

  • Этот инструмент использует алгоритм сжатия полилиний для исправления искажений в полигонах контуров зданий, созданных во время рабочего процесса извлечения объектов, который может производить нежелательные артефакты.

  • При согласовании контуров зданий, полученных из растровых данных, допуск упорядочения должен быть больше разрешения исходного растра.

  • У объектов со смежными границами для создания упорядоченной границы, не накладывающейся на другой объект, должно быть одинаковое значение атрибута. Если общего атрибута нет, выполните следующие действия:

    1. Воспользуйтесь инструментомБуфер с буферным расстоянием, соответствующем нужному допуску упорядочения.
    2. Обработайте полигоны буферов инструментом Объединение для создания из перекрывающихся полигонов одного объекта.
    3. Воспользуйтесь инструментом Пространственное соединение для добавления уникального ID объединенных полигонов ко входным для инструмента упорядочения объектам.
    4. Запустите инструмент Упорядочить контуры зданий с указанием поля уникального ID в параметре Поле группировки (параметр group в Python).
  • Используйте метод Любые углы для входных объектов с острыми и обратными углами, либо когда угол между двумя сегментами не попадает интервал 45° между 90° и 180°.

  • Если с указанными параметрами для входных данных не получаются упорядоченные полигоны, в выходные данные копируются исходные объекты. Значение, указанное в поле STATUS будет показывать, был ли объект упорядочен следующим образом::

    • 0 – Упорядоченный объект
    • 1 – Исходный объект

Синтаксис

arcpy.3d.RegularizeAdjacentBuildingFootprint(in_features, group, out_feature_class, method, tolerance, precision, angular_limit)
ParameterОбъяснениеТип данных
in_features

Обрабатываемые входные объекты.

Feature Layer
group

Поле, использующееся для определения того, какие объекты имеют совпадающие, не накладывающиеся друг на друга границы.

Field
out_feature_class

Класс объектов, который будет получен в результате работы инструмента.

Feature Class
method

Метод, который будет использоваться для упорядочения входных объектов.

  • RIGHT_ANGLESОпределяет наилучшие сегменты линии, соответствующие вершинам входного объекта вдоль углов 90° и 180°.
  • RIGHT_ANGLES_AND_DIAGONALSОпределяет наилучшие сегменты линии, соответствующие вершинам входного объекта вдоль внутренних углов 90°, 135° и 180°.
  • ANY_ANGLESОпределяет наиболее подходящую линию, попадающую вдоль любого угла при уменьшении общего числа вершин входных объектов.
String
tolerance

Максимальное расстояние, на которые упорядоченный контур может отступать от границы его исходного объекта.

Linear Unit
precision

Точность пространственной сетки, используемой в процессе упорядочивания. Действительные значения находятся в диапазоне от 0.05 до 0.25.

Double
angular_limit

Максимальное смещение внутренних углов наилучшей линии, использующееся при использовании метода Прямые углы и диагонали (RIGHT_ANGLES_AND_DIAGONALS). Для получения наилучших результатов это значение не должно превышать 5°. Этот параметр отключен для других методов упорядочения.

Double

Пример кода

RegularizeAdjacentBuildingFootprint, пример 1 (окно Python)

В следующем примере показано использование этого инструмента в окне Python.

arcpy.env.workspace = 'c:/data'
arcpy.ddd.RegularizeAdjacentBuildingFootprint('rough_footprints.shp', 'Block_ID',
                                              'regularized_footprints.shp', 
                                              'RIGHT_ANGLES_AND_DIAGONALS', 
                                              '2 Meters', 0.10)
RegularizeAdjacentBuildingFootprint, пример 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

Связанные разделы