概要
ジオメトリ内にある不自然な結果を除去して、建物ポリゴンのフットプリントを正規化します。
図
使用法
このツールは、ポリライン圧縮アルゴリズムを使用して、不自然な結果が生成される可能性のあるフィーチャ抽出ワークフローによって作成された建物フットプリント ポリゴンの歪みを矯正します。
建物フットプリントに円形の構造が含まれる場合は、最初にそれらのフィーチャを処理します。円形の建物の識別には、コンパクト性を使用できます。この値を計算するには、次の手順を実行します。
- タイプが double のフィールドを追加します。
- フィールド演算を使用して、次の式を計算します。
(4 * 3.14159265358979 * !shape.area!) / !shape.length! ** 2
- 完全な円の場合、値は 1 になります。ただし、このツールで一般に処理されるポリゴンにはある程度の不規則性があるため、値が 1 に近いほど、円形が含まれる可能性が高くなります。結果を評価して、円形の建物を示す最小値を識別します。次に、[円形] 方法を使用してこのツールを実行する前に、その値以上の値を選択します。
建物フットプリントが表すジオメトリに、45° と 90° の屈曲が含まれる (それ以外の屈曲が含まれる場合もあります) 角度の組み合わせを形成するエッジがある場合、[任意の角度] 方法の使用を検討します。まず、不規則なエッジを含むフィーチャのサブセットを選択し、目的の結果が得られる対角のペナルティ値を評価します。対角線のエッジを適切に取得できる結果が得られない場合は、許容値を変更し、正規化ゾーンを制限して、対角線のペナルティを徐々に下げることを検討します。出力に鋭角な内角の不自然なエッジが含まれる場合は、目的の出力を得られるまで対角線のペナルティを徐々に増やしながらツールを繰り返し実行してから、その値を使用してデータセット全体を処理します。
CUDA をサポートし、メモリが 2 GB を超える NVIDIA グラフィックス カードを搭載したコンピューターで [任意の角度] 方法を使用する場合、このツールは GPU を使用して処理を実行します。この動作は、プロセッサ タイプ環境設定で変更できます。複数の GPU が存在する場合は、対象の GPU を GPU ID 環境設定で指定できます。
指定したパラメーターを使用して、所定の入力の正規化されたソリューションが生成されない場合、元のフィーチャが出力にコピーされます。STATUS フィールドに指定された値は、そのフィーチャが正規化されたかどうかを次のように示します。
- 0 = 正規化されたフィーチャ
- 1 = 元のフィーチャ
構文
arcpy.3d.RegularizeBuildingFootprint(in_features, out_feature_class, method, tolerance, densification, precision, diagonal_penalty, min_radius, max_radius)
パラメーター | 説明 | データ タイプ |
in_features | 正規化される建物フットプリントを表すポリゴン。 | Feature Layer |
out_feature_class | このツールで生成されるフィーチャクラス。 | Feature Class |
method | 入力フィーチャの処理に使用される正規化手法。
| String |
tolerance | 正規化されたフットプリントが、元のフィーチャの境界から外れることができる最大距離。指定した値は、入力フィーチャの座標系の距離単位で表されます。 | 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 |
コードのサンプル
次のサンプルは、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)
次のサンプルは、スタンドアロン 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