密化
ポリゴンの境界やポリラインのセグメントの密化は、一般的な作業です。
以前の記事では、「ファクター」に基づいてジオメトリを密化する方法について書きました。つまり、セグメント上のポイント数を2倍、3倍にする方法です。
平面上の密化は編集ツールでいくつかのオプションを使って実行できます。これは利用できません何らかの理由でBasicライセンスレベルでは。
Densify (Editing)—ArcGIS Pro | ドキュメント
この記事は、線や周囲に沿った平面距離ステップに基づく密化に焦点を当てています。これが最も一般的な使い方です。
以下に私のツールセットをいくつか含めます。
このコードは、ジオプロセシングにおけるnumpyの強力さを示しています。
def _pnts_on_line_(a, spacing=1, is_percent=False): # 距離による密化
"""固定間隔でポイントを追加し、線を表す配列に追加します。
パラメータ
----------
a : 配列
ポリゴンまたはポリラインオブジェクトの境界を表すx,yペアのシーケンス。
spacing : 数値
線に追加するポイント間の間隔。
is_percent : ブール値
密化を全長のパーセントとして表現するかどうか。
"""
a = _get_base_(a)
N = len(a) - 1 # セグメント数
dxdy = a[1:, :] - a[:-1, :] # 座標差分
leng = np.sqrt(np.einsum('ij,ij->i', dxdy, dxdy)) # セグメント長さ
if is_percent: # パーセンテージとして扱う場合
spacing = abs(spacing)
spacing = min(spacing / 100, 1.)
steps = (sum(leng) * spacing) / leng # ステップ距離計算
else:
steps = leng / spacing # ステップ距離計算
deltas = dxdy / (steps.reshape(-1, 1)) # 座標ステップ計算
pnts = np.empty((N,), dtype='O') # オブジェクト型配列作成
for i in range(N): # セグメントごとに処理し、新しいポイントを作成
num = np.arange(steps[i]) # 新しいポイント番号配列作成
pnts[i] = np.array((num, num)).T * deltas[i] + a[i]
a0 = a[-1].reshape(1, -1) # 最終ポイントを追加して連結する準備
return np.concatenate((*pnts, a0), axis=0)
私のお気に入りの2行は...
dxdy = a[1:, :] - a[:-1, :] # 座標差分計算行
leng = np.sqrt(np.einsum('ij,ij->i', dxdy, dxdy)) # セグメント長さ計算行
アインシュタインは賢い人でした。
彼の記法は多くの言語で実装されており、慣れるまでは頭が混乱します(別ブログネタです)。
要するに、
dxdyは配列内の座標(ポリゴン/ポリライン座標)の連続差分を表しています。
ジオメトリを読み込んで各x,y座標を順番に引く必要はありません。一行で完了します。 ここで、
a[1:, :] は2番目以降の座標ペアを意味し、 a[:-1, :] は最初から最後の一つ前まで(ゼロベースインデックス)を意味します。 混乱していますか?あなたは
Pandas や shapely を使いすぎていますね。 以下は単純なポリゴンが配列(arcpy.Arrayでも)として表現された例です。
a # ---- x,y座標の配列... 最初と最後は同じ座標です
array([[ 0.00, 0.00],
[ 2.00, 8.00],
[ 8.00, 10.00],
[ 10.00, 10.00],
[ 10.00, 8.00],
[ 9.00, 1.00],
[ 0.00, 0.00]])
dxdy # ---- 各ペア間の連続的なx,y差分配列です。
array([[ 2.00, 8.00],
[ 6.00, 2.00],
[ 2.00, 0.00],
[ 0.00, -2.00],
[ -1.00, -7.00],
[ -9.00, -1.00]])
leng # ---- ポイント間ペア距離配列です。
array([ 8.25, 6.32, 2.00, 2.00, 7.07, 9.06])
Densification.... sometimes being dense is a good ... - GeoNet, The Esri Community