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

サマリー

共通の境界を持つ建物フットプリントを正規化します。

使用法

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

  • ラスター データから生成された建物フットプリントを正規化する場合、正規化の許容値はソース ラスターの解像度よりも大きくなくてはなりません。

  • 他のフィーチャと重複しない正規化された境界を作成するには、隣接する境界を持つフィーチャに共通の属性値が必要です。共通の属性がない場合は、以下の手順を検討してください。

    1. 目的の正規化許容値に一致するバッファー距離を、[バッファー (Buffer)] ツールで使用します。
    2. バッファーされたポリゴン フィーチャを [ユニオン (Union)] ツールで処理し、重複するポリゴンに対して 1 つのフィーチャを作成します。
    3. [空間結合 (Spatial Join)] ツールを使用し、正規化の対象となる元の入力フィーチャに結合したポリゴンの一意の ID を追加します。
    4. [隣接建物フットプリントの正規化 (Regularize Adjacent Building Footprint)] ツールを [グループ フィールド] (Python では group パラメーター) で指定された一意の ID を含むフィールドとともに実行します。
  • 入力フィーチャが鋭角または優角の内角で構成される場合、または 2 つの線分間にある角度が 90°、135°、180°ではない場合は [任意の角度] 方法の使用を検討してください。

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

    • 0 = 正規化されたフィーチャ
    • 1 = 元のフィーチャ

パラメーター

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

処理される入力フィーチャ。

Feature Layer
グループ フィールド

完全に一致する、重複しない境界を共有するフィーチャを特定するために使われるフィールド。

Field
出力フィーチャクラス

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

Feature Class
方法

入力フィーチャを正規化するために使用される方法。

  • RIGHT_ANGLES90°から 180°までの角度に沿って、入力フィーチャの頂点に適合する最適な線分を特定します。
  • RIGHT_ANGLES_AND_DIAGONALS90°、135°、180°の内角に沿って、入力フィーチャの頂点に適合する最適な線分を特定します。
  • ANY_ANGLES入力フィーチャの全体的な頂点の数を減らすときに、任意の角度に沿ったベスト フィット ラインを特定します。
String
許容値

正規化されたフットプリントが、元のフィーチャの境界から外れることができる最大距離。

Linear Unit
精度

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

Double
最大隅角偏位

[直角と対角線] (RIGHT_ANGLES_AND_DIAGONALS) を使用するときに、ベスト フィット ラインの内角で許容される最大の偏位。通常、最善の結果を得るには、この値を 5°以下にしておく必要があります。このパラメーターは、他の正規化方法では無効になっています。

Double

arcpy.ddd.RegularizeAdjacentBuildingFootprint(in_features, group, out_feature_class, method, tolerance, precision, angular_limit)
名前説明データ タイプ
in_features

処理される入力フィーチャ。

Feature Layer
group

完全に一致する、重複しない境界を共有するフィーチャを特定するために使われるフィールド。

Field
out_feature_class

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

Feature Class
method

入力フィーチャを正規化するために使用される方法。

  • RIGHT_ANGLES90°から 180°までの角度に沿って、入力フィーチャの頂点に適合する最適な線分を特定します。
  • RIGHT_ANGLES_AND_DIAGONALS90°、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: 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)
footprint = arcpy.GetParameterAsText(1)

try:
    lasd_layer = 'building points'
    arcpy.management.MakeLasDatasetLayer(lasd, lasd_layer, class_code=6)
    temp_raster = 'in_memory/bldg_raster'
    arcpy.management.LasPointStatsAsRaster(lasd_layer, temp_raster,
                                           'PREDOMINANT_CLASS', 'CELLSIZE', 2.5)
    temp_footprint = 'in_memory/footprint'
    arcpy.conversion.RasterToPolygon(temp_raster, temp_footprint)
    arcpy.ddd.RegularizeBuildingFootprint(temp_footprint, footprint, 
                                          method='RIGHT_ANGLES')
    arcpy.ddd.LasPointStatsByArea(lasd_layer, footprint, ['MIN_Z', 'MAX_Z'])
    arcpy.management.AddField(footprint, 'Height', 'Double')
    arcpy.management.CalculateField(footprint, 'Height', 
                                    "round('!Z_Max! - !Z_Min!', 2)", 
                                    'PYTHON_9.3')


except arcpy.ExecuteError:
    print(arcpy.GetMessages())

関連トピック