方法

Python を使用して ArcGIS Pro の [平行コピー] ツールと同様に平行なフィーチャを作成する

Last Published: October 16, 2020

サマリー

ArcGIS Pro には [平行の作成] ツールがありますが、ArcPy からは使用できません。この代わりに、Python スクリプトを使用して、以下の画像のような効果を作成することができます。 パイプライン、道路、高速道路に関連するワークフローには、スクリプトが便利かつ効率的かもしれません。

[平行の作成] ツールと同様の効果を作成するために使用したスクリプトの出力を示す画像。

この記事では、平行なフィーチャを描画する Python スクリプトを使用する手順を示します。

手順

注意: このスクリプトはラインの交差には機能しません。
  1. ライン フィーチャのクローンを作成します。 詳細については、「ArcGIS Pro: クリップボードを使用したフィーチャのコピーと貼り付け」または「ArcGIS Pro: フィーチャのコピー (Copy Features) (データ管理)」をご参照ください。
  2. クローンのライン フィーチャに [Width] フィールドを追加します。
    1. クローンのライン フィーチャの [フィールド] ビューで [フィールドの追加 (Add Field)] を使用します。 詳細については、「ArcGIS Pro: [フィールド] ビュー」をご参照ください。
    2. フィールドの名前を「Width」に設定し、データ タイプに任意の数値データ タイプ (long, short) を設定します。
    3. [Width] フィールドに値を入力して、ライン フィーチャと平行なラインの幅を決定します。
  3. Python コンソールまたは ArcGIS Pro の Python ウィンドウを開きます。
  4. 必要なモジュールをインポートします。
import os, arcpy, math
  1. ワークスペースを指定します。
infc=r'<Feature/Shapefile_Path>' workspace = os.path.dirname(infc) edit = arcpy.da.Editor(workspace)
  1. フィーチャの編集を開始します。
edit.startEditing(False,True) edit.startOperation()
  1. 新しい関数を定義し、平行ラインを作成します。
def CopyParallel(plyP,sLength): part=plyP.getPart(0) lArray=arcpy.Array() rArray=arcpy.Array() for ptX in part: dL=plyP.measureOnLine(ptX) ptX0=plyP.positionAlongLine (dL-0.01).firstPoint ptX1=plyP.positionAlongLine (dL+0.01).firstPoint dX=float(ptX1.X)-float(ptX0.X) dY=float(ptX1.Y)-float(ptX0.Y) lenV=math.hypot(dX,dY) sX=-dY*sLength/lenV sY=dX*sLength/lenV leftP=arcpy.Point(ptX.X+sX,ptX.Y+sY) lArray.add(leftP) rightP=arcpy.Point(ptX.X-sX, ptX.Y-sY) rArray.add(rightP) array = arcpy.Array([lArray, rArray]) section=arcpy.Polyline(array) return section
  1. 新しいカーソルを開始し、クローンのライン フィーチャを更新して、平行ラインになるようにします。
with arcpy.da.UpdateCursor(infc,("Shape@","Width")) as cursor: for shp,w in cursor: twoLines=CopyParallel(shp,w) cursor.updateRow((twoLines,w))
  1. カーソルを削除して編集を停止し、フィーチャ上のロック ファイルを解除します。
del cursor edit.stopOperation() edit.stopEditing(True)

以下に完全なスクリプトを示します。

import os, arcpy, math infc=r'C:\Users\User\Desktop\Work\Sample\Test_Shapefile.shp' workspace = os.path.dirname(infc) edit = arcpy.da.Editor(workspace) edit.startEditing(False,True) edit.startOperation() def CopyParallel(plyP,sLength): part=plyP.getPart(0) lArray=arcpy.Array() rArray=arcpy.Array() for ptX in part: dL=plyP.measureOnLine(ptX) ptX0=plyP.positionAlongLine (dL-0.01).firstPoint ptX1=plyP.positionAlongLine (dL+0.01).firstPoint dX=float(ptX1.X)-float(ptX0.X) dY=float(ptX1.Y)-float(ptX0.Y) lenV=math.hypot(dX,dY) sX=-dY*sLength/lenV sY=dX*sLength/lenV leftP=arcpy.Point(ptX.X+sX,ptX.Y+sY) lArray.add(leftP) rightP=arcpy.Point(ptX.X-sX, ptX.Y-sY) rArray.add(rightP) array = arcpy.Array([lArray, rArray]) section=arcpy.Polyline(array) return section with arcpy.da.UpdateCursor(infc,("Shape@","Width")) as cursor: for shp,w in cursor: twoLines=CopyParallel(shp,w) cursor.updateRow((twoLines,w)) del cursor edit.stopOperation() edit.stopEditing(True)

記事 ID:000024330

ArcGIS の専門家からヘルプを受ける

テクニカル サポートへのお問い合わせ

Esri Support アプリのダウンロード

ダウンロード オプションに移動

関連情報

このトピックについてさらに調べる