建物フットプリントの正規化 (Regularize Building Footprint) (3D Analyst)

サマリー

ジオメトリ内にある不自然な結果を除去して、建物ポリゴンのフットプリントを正規化します。

建物フットプリントの正規化ツールの図

使用法

  • このツールは、ポリライン圧縮アルゴリズムを使用して、不自然な結果が生成される可能性のあるフィーチャ抽出ワークフローによって作成された建物フットプリント ポリゴンの歪みを矯正します。

  • 建物フットプリントに円形の構造が含まれる場合は、最初にそれらのフィーチャを処理します。 円形の建物の識別には、コンパクト性を使用できます。 この値を計算するには、次の手順を実行します。

    1. タイプが double のフィールドを追加します。
    2. フィールド演算を使用して、次の式を計算します。
      (4 * 3.14159265358979 * !shape.area!) / !shape.length! ** 2
    3. 完全な円の場合、値は 1 になります。 ただし、このツールで処理されるポリゴンにはある程度の不規則性があるため、値が 1 に近い場合、円形が含まれる可能性が高くなります。 結果を確認して、円形の建物を示す最小値を識別します。 次に、[方法] パラメーターを [円形] に設定してこのツールを実行する前に、その値以上の値を選択します。
  • 建物フットプリントが表すジオメトリに、45° と 90° の屈曲が含まれる (それ以外の屈曲が含まれる場合もあります) 角度の組み合わせを形成するエッジがある場合、[方法] パラメーターを [任意の角度] に設定します。 まず、不規則なエッジを含むフィーチャのサブセットを選択し、目的の結果が得られる対角のペナルティ値を評価します。 対角線のエッジを適切に取得できる結果が得られない場合は、許容値を変更し、正規化ゾーンを制限して、対角線のペナルティを徐々に下げます。 出力に鋭角な内角の不自然なエッジが含まれる場合は、目的の出力を得られるまで対角線のペナルティを徐々に増やしながらツールを繰り返し実行します。 次に、その値を使用してデータセット全体を処理します。

  • CUDA をサポートし、メモリが 2 GB を超える NVIDIA グラフィックス カードを搭載したコンピューターで [任意の角度] オプションを使用する場合、このツールは GPU を使用して処理を実行します。 この動作は、[プロセッサー タイプ] 環境で変更できます。 複数の GPU が存在する場合は、特定の GPU を [GPU ID] 環境で設定できます。

  • ツールを使用して、所定の入力の正規化されたソリューションが生成されない場合、元のフィーチャが出力にコピーされます。 STATUS フィールドに指定された値は、そのフィーチャが正規化されたかどうかを次のように示します。

    • 0 = 正規化されたフィーチャ
    • 1 = 元のフィーチャ
  • サイズが大きく異なるジオメトリで方法として [円形] を使用する場合は、[許容値タイプ] パラメーターに [面積比] オプションを指定すると、[距離] オプションよりも良好な結果が得られることがあります。これは、元のフィーチャの限られたサブセットで機能する場合がある固定サイズとは異なり、出力フィーチャの構築が元のジオメトリのサイズによって制限されるためです。

パラメーター

ラベル説明データ タイプ
入力フィーチャ

正規化される建物フットプリントを表すポリゴン。

Feature Layer
出力フィーチャクラス

生成されるフィーチャクラス。

Feature Class
方法

入力フィーチャの処理に使用される正規化手法を指定します。

  • 直角隣接するエッジ間で 90° の角度を構成する形状が構築されます。
  • 直角と対角線隣接するエッジ間で 45° と 90° の角度を構成する形状が構築されます。
  • 任意の角度隣接するエッジ間で任意の角度を形成する形状が構築されます。
  • 円形入力フィーチャの周囲に最もよく適合する円が構築されます。
String
許容値

大半の方法で、この値は正規化されたフットプリントが、元のフィーチャの境界から外れることができる最大距離を表します。 指定した値は、入力フィーチャの座標系の距離単位で表されます。 方法として [円形] を使用している場合、元のフィーチャとその正規化された結果に対する、[許容値タイプ] パラメーターで行った選択に基づいて正規化された結果のエリアの割合としてこのオプションを解釈することもできます。

Double
密度

正規化されたフィーチャが直線か曲線かを評価するのに使用されるサンプリング間隔。 密度は許容値以下である必要があります。

このパラメーターは、直角の識別情報をサポートする手法とのみ使用されます。

Double
精度

正規化プロセスで使用される空間グリッドの精度。 有効な値の範囲は 0.05 〜 0.25 です。

Double
対角線のペナルティ

[直角と対角線] 方法を使用する場合、この値は 2 つの隣接する線分間で直角または対角線のエッジを構築する可能性を示します。 [任意の角度] 方法を使用する場合、この値は、ツールのアルゴリズムで決定される優先エッジに適合しない対角線のエッジを構築する可能性を示します。 ペナルティ値を 0 に設定した場合、優先エッジは使用されず、単純化された不規則なポリゴンが生成されます。 一般的に、この値が高いほど、対角線のエッジが構築される可能性は低くなります。

Double
最小半径

正規化された円に許容される最小半径。 値が 0 の場合、最小サイズの制限がないことを意味します。 このオプションは、[円形] 方法でのみ利用可能です。

Double
最大半径

正規化された円に許容される最大半径。 このオプションは、[円形] 方法でのみ利用可能です。

Double
配置フィーチャ
(オプション)

正規化されたポリゴンの方向を配置するために使用されるライン フィーチャ。 各ポリゴンは 1 つのライン フィーチャのみに配置されます。

Feature Layer
許容値範囲
(オプション)

最近接配置フィーチャの検索に使用される最大距離閾値。 たとえば、20 メートルの値は、正規化されたポリゴンを配置するために、20 メートル以内にある最も近いラインが使用されることを意味します。

Linear Unit
許容値タイプ
(オプション)

[方法 パラメーターが [円形] に設定されている場合に許容値をどのように適用するかを指定します。

  • 距離処理されるフィーチャの境界からの最長距離を表す許容値です。 これがデフォルトです。
  • 面積比正規化された円とは異なる元のフィーチャのエリアと正規化された円のエリアの割合の上限を表す許容値です。
String

arcpy.ddd.RegularizeBuildingFootprint(in_features, out_feature_class, method, tolerance, densification, precision, diagonal_penalty, min_radius, max_radius, {alignment_feature}, {alignment_tolerance}, {tolerance_type})
名前説明データ タイプ
in_features

正規化される建物フットプリントを表すポリゴン。

Feature Layer
out_feature_class

生成されるフィーチャクラス。

Feature Class
method

入力フィーチャの処理に使用される正規化手法を指定します。

  • RIGHT_ANGLES隣接するエッジ間で 90° の角度を構成する形状が構築されます。
  • RIGHT_ANGLES_AND_DIAGONALS隣接するエッジ間で 45° と 90° の角度を構成する形状が構築されます。
  • ANY_ANGLE隣接するエッジ間で任意の角度を形成する形状が構築されます。
  • CIRCLE入力フィーチャの周囲に最もよく適合する円が構築されます。
String
tolerance

大半の方法で、この値は正規化されたフットプリントが、元のフィーチャの境界から外れることができる最大距離を表します。 指定した値は、入力フィーチャの座標系の距離単位で表されます。 方法として CIRCLE を使用している場合、元のフィーチャとその正規化された結果に対する、tolerance_type パラメーターで行った選択に基づいて正規化された結果のエリアの割合としてこのオプションを解釈することもできます。

Double
densification

正規化されたフィーチャが直線か曲線かを評価するのに使用されるサンプリング間隔。 密度は許容値以下である必要があります。

このパラメーターは、直角の識別情報をサポートする手法とのみ使用されます。

Double
precision

正規化プロセスで使用される空間グリッドの精度。 有効な値の範囲は 0.05 〜 0.25 です。

Double
diagonal_penalty

RIGHT_ANGLES_AND_DIAGONALS 方法を使用する場合、この値は 2 つの隣接する線分間で直角または対角線のエッジを構築する可能性を示します。 ANY_ANGLES 方法を使用する場合、この値は、ツールのアルゴリズムで決定される優先エッジに適合しない対角線のエッジを構築する可能性を示します。 一般的に、この値が高いほど、対角線のエッジが構築される可能性は低くなります。

Double
min_radius

正規化された円に許容される最小半径。 値が 0 の場合、最小サイズの制限がないことを意味します。 このオプションは、CIRCLE の手法でのみ利用可能です。

Double
max_radius

正規化された円に許容される最大半径。 このオプションは、CIRCLE の手法でのみ利用可能です。

Double
alignment_feature
(オプション)

正規化されたポリゴンの方向を配置するために使用されるライン フィーチャ。 各ポリゴンは 1 つのライン フィーチャのみに配置されます。

Feature Layer
alignment_tolerance
(オプション)

最近接配置フィーチャの検索に使用される最大距離閾値。 たとえば、20 メートルの値は、正規化されたポリゴンを配置するために、20 メートル以内にある最も近いラインが使用されることを意味します。

Linear Unit
tolerance_type
(オプション)

method パラメーターが CIRCLE に設定されている場合に許容値をどのように適用するかを指定します。

  • DISTANCE処理されるフィーチャの境界からの最長距離を表す許容値です。 これがデフォルトです。
  • AREA_RATIO正規化された円とは異なる元のフィーチャのエリアと正規化された円のエリアの割合の上限を表す許容値です。
String

コードのサンプル

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

関連トピック