Gebäudegrundriss vereinfachen (3D Analyst)

Zusammenfassung

Normalisiert den Footprint von Gebäude-Polygonen, indem unerwünschte Artefakte in deren Geometrie entfernt werden.

Abbildung

Vereinfachte Gebäudegrundrisse

Verwendung

  • Dieses Werkzeug nutzt einen Polylinienkomprimierungsalgorithmus, um Verzerrungen in Gebäudegrundriss-Polygonen zu korrigieren, die durch Feature-Extraktions-Workflows erstellt wurden, die möglicherweise unerwünschte Artefakte erzeugen.

  • Wenn Ihre Gebäude-Footprints kreisförmige Strukturen enthalten, verarbeiten Sie diese Features zuerst. Kreisförmige Gebäude können anhand eines Kompaktheitsverhältnisses identifiziert werden. Um diesen Wert zu berechnen, führen Sie die folgenden Schritte aus:

    1. Fügen Sie ein Feld vom Typ "Double" hinzu.
    2. Berechnen Sie die folgende Formel mithilfe der Feldberechnung:
      (4 * 3.14159265358979 * !shape.area!) / !shape.length! ** 2
    3. Ein perfekter Kreis hat den Wert 1. Da die Polygone, die in der Regel mit diesem Werkzeug verarbeitet werden, jedoch einige Unregelmäßigkeiten aufweisen, geben Werte, die näher bei 1 liegen, eher eine Kreisform an. Prüfen Sie die Ergebnisse, um den Minimalwert eines kreisförmigen Gebäudes zu identifizieren, und wählen Sie Werte aus, die größer als dieser Wert sind oder diesem entsprechen, bevor Sie dieses Werkzeug mit der Methode Kreis ausführen.
  • Wenn die Gebäude-Footprints Geometrien mit Kanten darstellen, die eine Kombination aus Winkeln mit Biegungen u. a. um 45 Grad und 90 Grad bilden, sollten Sie die Methode Alle Winkel verwenden. Wählen Sie zunächst eine Teilmenge von Features aus, die unregelmäßige Kanten enthalten, und ermitteln Sie, welcher Wert für die diagonale Gewichtung zum gewünschten Ergebnis führt. Wenn im Ergebnis diagonale Kanten nicht angemessen erfasst sind, sollten Sie den Toleranzwert ändern, um die Vereinfachungszone einzuschränken und die diagonale Gewichtung schrittweise zu verringern. Wenn das Ergebnis unerwünschte Kanten mit spitzen Innenwinkeln enthält, führen Sie das Werkzeug wiederholt aus und erhöhen dabei die diagonale Gewichtung, bis das gewünschte Ergebnis erreicht ist. Verwenden Sie diesen Wert dann zur Verarbeitung des gesamten Datasets.

  • Wenn die Methode Alle Winkel auf einem Computer mit einer NVIDIA-Grafikkarte verwendet wird, die CUDA unterstützt und über mehr als 2 GB Arbeitsspeicher verfügt, wird zum Ausführen des Werkzeugs die GPU genutzt. Dieses Verhalten können Sie über die Umgebungseinstellung Prozessortyp ändern. Wenn mehrere GPUs vorhanden sind, kann mit der Umgebungseinstellung GPU-ID die gewünschte GPU ausgewählt werden.

  • Wenn die angegebenen Parameter keine vereinfachte Lösung für eine bestimmte Eingabe erstellen können, wird das ursprüngliche Feature in die Ausgabe kopiert. Der im Feld STATUS angegebene Wert gibt an, ob das Feature vereinfacht wurde:

    • 0 – Vereinfachtes Feature
    • 1 – Ursprüngliches Feature

Syntax

arcpy.3d.RegularizeBuildingFootprint(in_features, out_feature_class, method, tolerance, densification, precision, diagonal_penalty, min_radius, max_radius)
ParameterErklärungDatentyp
in_features

Die Polygone zur Darstellung des Gebäudegrundrisses, der normalisiert werden soll.

Feature Layer
out_feature_class

Die Feature-Class, die von diesem Werkzeug erstellt wird.

Feature Class
method

Die Normalisierungsmethode, die bei der Verarbeitung der Eingabe-Features verwendet werden soll.

  • RIGHT_ANGLESErstellt Formen, die aus 90-Grad-Winkeln zwischen benachbarten Kanten bestehen.
  • RIGHT_ANGLES_AND_DIAGONALSErstellt Formen, die aus 45- und 90-Grad-Winkeln zwischen benachbarten Kanten bestehen.
  • ANY_ANGLEErstellt Formen, die einen beliebigen Winkel zwischen benachbarten Kanten bilden.
  • CIRCLEErstellt um die Eingabe-Features den am besten passenden Kreis.
String
tolerance

Die maximale Entfernung, die der normalisierte Gebäudegrundriss von der Grenze seines ursprünglichen Features abweichen kann. Der angegebene Wert basiert auf den linearen Einheiten des Koordinatensystems des Eingabe-Features.

Double
densification

Das Beispielintervall, anhand dessen ausgewertet wird, ob das normalisierte Feature gerade oder gekrümmt ist. Die Verdichtung muss gleich dem oder kleiner als der Toleranzwert sein.

Dieser Parameter wird nur mit Methoden verwendet, die die Identifizierung rechter Winkel unterstützen.

Double
precision

Die Genauigkeit des räumlichen Gitters, das im Vereinfachungsprozess verwendet wird. Zulässig sind Werte im Bereich von 0.05 bis 0.25.

Double
diagonal_penalty

Wenn die Methode RIGHT_ANGLES_AND_DIAGONALS verwendet wird, bestimmt dieser Wert die Wahrscheinlichkeit, mit der rechte Winkel oder diagonale Kanten zwischen zwei benachbarten Segmenten erstellt werden. Wenn die Methode ANY_ANGLES verwendet wird, bestimmt dieser Wert die Wahrscheinlichkeit, mit der diagonale Kanten erstellt werden, die nicht mit den durch den Algorithmus des Werkzeugs festgelegten bevorzugten Kanten übereinstimmen. Generell gilt: Je höher der Wert, desto geringer ist die Wahrscheinlichkeit, dass eine diagonale Kante erstellt wird.

Double
min_radius

Der kleinste für einen vereinfachten Kreis zulässige Radius. Der Wert 0 impliziert, dass keine minimale Größenbeschränkung vorhanden ist. Diese Option ist nur für die Methode CIRCLE verfügbar.

Double
max_radius

Der größte für einen vereinfachten Kreis zulässige Radius. Diese Option ist nur für die Methode CIRCLE verfügbar.

Double

Codebeispiel

RegularizeBuildingFootprint – Beispiel 1 (Python-Fenster)

Anhand des folgenden Beispiels wird die Verwendung dieses Werkzeugs im Python-Fenster veranschaulicht.

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 – Beispiel 2 (eigenständiges Skript)

Im folgenden Beispiel wird die Verwendung dieses Werkzeugs in einem eigenständigen Python-Skript veranschaulicht.

'''****************************************************************************
       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())

Lizenzinformationen

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

Verwandte Themen