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

Сводка

Нормализует полигоны контуров зданий путем исключения нежелательных артефактов в их геометрии.

Иллюстрация

Упорядоченные контуры зданий

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

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

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

    1. Добавьте поле двойной точности.
    2. В калькуляторе поля вычислите следующее выражение:
      (4 * 3.14159265358979 * !shape.area!) / !shape.length! ** 2
    3. Идеальный круг будет иметь значение 1; но поскольку полигоны, обычно обрабатываемые этим инструментом, имеют некоторую неровность, значения, близкие к 1, с большей вероятностью будут иметь круглую форму. Оцените свои результаты, чтобы определить минимальное значение круглого здания, и выберите значения, которые больше или равны этому значению, перед запуском инструмента с методом Окружность .
  • Рассмотрите возможность использования метода Любой угол, если контуры здания представляют геометрию с ребрами, образующими комбинацию углов, которые включают, помимо прочего, изгибы 45° и 90°. Начните с выбора поднабора объектов, содержащих неровные ребра, и оцените, какое значение диагонального штрафного коэффициента дает желаемый результат. Если результат неадекватно обозначает диагональные ребра, рассмотрите возможность изменения значения допуска, чтобы ограничить зону упорядочивания и постепенно снизить диагональный штрафной коэффициент. Если выходные данные содержат нежелательные ребра с острыми внутренними углами, повторно запустите инструмент, увеличивая при этом диагональный штрафной коэффициент до тех пор, пока не будет достигнут желаемый результат, а затем используйте это значение для обработки всего набора данных.

  • Когда метод Любые углы используется на компьютере с графической картой NVIDIA, которая поддерживает CUDA и имеет более 2 ГБ памяти, инструмент будет использовать графический процессор для выполнения своей операции. Вы можете изменить это поведение в параметре среды Тип процессора . Если присутствует несколько графических процессоров, желаемый можно указать с помощью параметра среды Идентификатор графического процессора .

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

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

Синтаксис

RegularizeBuildingFootprint(in_features, out_feature_class, method, tolerance, densification, precision, diagonal_penalty, min_radius, max_radius)
ParameterОбъяснениеТип данных
in_features

Полигоны для упорядочивания, представляющие контуры зданий.

Feature Layer
out_feature_class

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

Feature Class
method

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

  • RIGHT_ANGLESСоздает формы, состоящие из углов 90° между смежными ребрами.
  • RIGHT_ANGLES_AND_DIAGONALSСоздает формы, состоящие из углов 45° и 90° между смежными ребрами.
  • ANY_ANGLEСоздает формы, образующие любые углы между смежными ребрами.
  • CIRCLEСоздает наиболее подходящий круг вокруг входных объектов.
String
tolerance

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

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

Пример кода

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

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