Regularizar huella de edificio (3D Analyst)

Resumen

Normaliza la huella de los polígonos de edificios eliminando elementos no deseados en su geometría.

Ilustración

Huellas de edificios regularizadas

Uso

  • Esta herramienta utiliza un algoritmo de compresión de polilíneas para corregir las distorsiones en los polígonos de huellas de edificios creados a través de los flujos de trabajo de extracción de entidades que pueden producir artefactos no deseados.

  • Si las huellas de edificios contienen estructuras circulares, procese primero dichas entidades. Se puede utilizar una ratio de compactación para identificar edificios circulares. Para calcular este valor, realice lo siguiente:

    1. Agregue un campo de tipo doble.
    2. Utilice la calculadora de campos para calcular la siguiente fórmula:
      (4 * 3.14159265358979 * !shape.area!) / !shape.length! ** 2
    3. Un círculo perfecto tendrá un valor de 1, pero dado que los polígonos que se suelen procesar con esta herramienta tienen alguna irregularidad, los valores cercanos a 1 tienen más probabilidad de tener una forma circular. Evalúe los resultados para identificar el valor mínimo de un edificio circular y seleccione valores iguales o superiores a este valor antes de ejecutar esta herramienta con el método de Círculo.
  • Plantéese utilizar el método Cualquier ángulo si las huellas de edificios representan geometrías con ejes que forman una combinación de ángulos entre las que se incluyen curvaturas de 45° y 90°. Comience por seleccionar un subconjunto de entidades que contengan ejes irregulares y evalúe qué valor de penalización en diagonal genera el resultado deseado. Si el resultado no captura correctamente ejes diagonales, plantéese modificar el valor de tolerancia para restringir la zona de regularización y disminuir gradualmente la penalización en diagonal. Si la salida contiene ejes no deseados con ángulos interiores agudos, ejecute de forma iterativa la herramienta mientras aumenta gradualmente la penalización en diagonal hasta obtener la salida deseada; a continuación, utilice este valor para procesar todo el dataset.

  • Cuando se utiliza el método Cualquier ángulo en un equipo con una tarjeta gráfica NVIDIA compatible con CUDA y más de 2 GB de memoria, la herramienta utilizará la GPU para llevar a cabo su operación. Puede modificar este comportamiento en la configuración del entorno Tipo de procesador. Si existen varias GPU, la GPU deseada se puede especificar mediante la configuración del entorno Id. de GPU.

  • Cuando los parámetros especificados no pueden ofrecer una solución regularizada para una entrada dada, la entidad original se copia en la salida. El valor especificado en el campo STATUS indicará si la entidad se regularizó de la siguiente manera:

    • 0: Entidad regularizada
    • 1: Entidad original

Sintaxis

arcpy.3d.RegularizeBuildingFootprint(in_features, out_feature_class, method, tolerance, densification, precision, diagonal_penalty, min_radius, max_radius)
ParámetroExplicaciónTipo de datos
in_features

Polígonos que representan las huellas de edificio que deben regularizarse.

Feature Layer
out_feature_class

La clase de entidad que generará esta herramienta.

Feature Class
method

Método de regularización que debe utilizarse para procesar las entidades de entrada.

  • RIGHT_ANGLESConstruye formas compuestas de ángulos de 90° entre ejes adyacentes.
  • RIGHT_ANGLES_AND_DIAGONALSConstruye formas compuestas de ángulos de 45° y 90° entre ejes adyacentes.
  • ANY_ANGLEConstruye formas que forman cualquier ángulo entre ejes adyacentes.
  • CIRCLEConstruye el círculo de mejor ajuste alrededor de las entidades de entrada.
String
tolerance

Distancia máxima que la huella regularizada puede desviarse del límite de su entidad original. El valor especificado se basará en las unidades lineales del sistema de coordenadas de la entidad de entrada.

Double
densification

Intervalo de muestreo que se utilizará para evaluar si la entidad regularizada estará recta o curvada. La densificación debe ser menor o igual que el valor de tolerancia.

Este parámetro solo se utiliza con métodos que admitan la identificación de ángulos rectos.

Double
precision

La precisión de la cuadrícula espacial utilizada en el proceso de regularización. Los valores válidos varían de 0.05 a 0.25.

Double
diagonal_penalty

Cuando se utiliza el método RIGHT_ANGLES_AND_DIAGONALS, este valor dicta la probabilidad de construir ángulos rectos o ejes diagonales entre dos segmentos adyacentes. Cuando se utiliza el método ANY_ANGLES, este valor dicta la probabilidad de construir ejes diagonales que no se ajustan a los ejes preferentes determinados por el algoritmo de la herramienta. Por lo general, cuanto mayor es el valor, menor es la probabilidad de que se construya un eje diagonal.

Double
min_radius

El radio más pequeño permitido para un círculo regularizado. Un valor de 0 implica que no hay ningún límite de tamaño mínimo. Esta opción solo está disponible con el método de CIRCLE.

Double
max_radius

El radio más grande permitido para un círculo regularizado. Esta opción solo está disponible con el método de CIRCLE.

Double

Muestra de código

Ejemplo 1 de RegularizeBuildingFootprint (ventana de Python)

En el siguiente ejemplo se muestra cómo usar esta herramienta en la ventana de 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)
Ejemplo 2 de RegularizeBuildingFootprint (script independiente)

En el siguiente ejemplo se muestra cómo usar esta herramienta en un script independiente de 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())

Información de licenciamiento

  • Basic: Requiere 3D Analyst
  • Standard: Requiere 3D Analyst
  • Advanced: Requiere 3D Analyst

Temas relacionados