FAQ
ArcPy (ArcMap): ラインの接点にポイントを作成する方法

ナレッジ番号:2990 | 登録日:2023/05/29 | 更新日:2024/11/21

概要

Python スクリプトを使用して、ポリラインの接点にポイントを作成する方法をご紹介します。

このサンプルでは、ポリライン フィーチャ同士が重なるポイント取得して新規に作成したフィーチャクラスに挿入しています。

サンプル コード

# coding:cp932
# ArcPy サイト パッケージをインポートします。
import arcpy, os, time

start = time.time()
arcpy.env.overwriteOutput = True

# 変数を設定します。
inputFc = arcpy.GetParameterAsText(0)
outputFc = arcpy.GetParameterAsText(1)
overlap  = arcpy.GetParameterAsText(2)
tempFc = r"in_memory" + os.sep + os.path.basename(outputFc)

# インメモリ ワークスペースに新規フィーチャクラスを作成します。
spRef = arcpy.Describe(inputFc).spatialReference
arcpy.CreateFeatureclass_management(os.path.dirname(tempFc), os.path.basename(tempFc), "POINT", "", "", "", spRef)

# 作成したフィーチャクラスにポリゴン フィーチャクラスと同じフィールドを追加します。
fieldList = arcpy.ListFields(inputFc)
fieldNameList = []
fieldAliasNameList = []

for field in fieldList:
    # OBJECT ID と SHAPE フィールドは既に追加されているので、追加対象から除きます。
    # また、今回の場合はポイントを作成しますので SHAPE_LENGTH とSHAPE_AREA フィールドも追加対象から除きます。
    if field.type != "OID" and field.type != "Geometry" and field.name.lower() != "shape_length" and field.name.lower() != "shape_area":
        arcpy.AddField_management(tempFc, field.name, field.type)
        fieldNameList.append(field.name.encode("cp932"))
        fieldAliasNameList.append(field.aliasName.encode("cp932"))

# データアクセス モジュールの SearchCursor を取得します。
fieldNameList.insert(0, "SHAPE@")
searchCur1 = arcpy.da.SearchCursor(inputFc, fieldNameList)
insertCur = arcpy.da.InsertCursor(tempFc, fieldNameList)

# ライン フィーチャの接点からポイントを作成します。
for searchRow1 in searchCur1:
    searchCur2 = arcpy.da.SearchCursor(inputFc, fieldNameList)
    for searchRow2 in searchCur2:

        # ラインフィーチャ同士が交差している場合に接点をポイントとして作成します。
        if searchRow1[0].crosses(searchRow2[0]) == True:
            crosspoint = searchRow1[0].intersect(searchRow2[0], 1)

            # マルチポイントの場合に以下の処理を行います。
            if crosspoint.type == "multipoint":
                i = 0
                while i < crosspoint.partCount:

                    # パートの Array オブジェクトを取得します。
                    array = crosspoint.getPart(i)

                    # Array オブジェクトから Point オブジェクト(パート)を作成します。
                    point = arcpy.Point(array.X, array.Y)

                    # 重複を許可しない場合に以下の処理を行います。
                    if overlap != "true":
                        updateCur = arcpy.da.UpdateCursor(tempFc, fieldNameList)
                        for updateRow in updateCur:
                            if updateRow[0].trueCentroid.X == point.X and updateRow[0].trueCentroid.Y == point.Y:
                                updateCur.deleteRow()
                        del updateCur

                    # ポイントをインメモリ フィーチャクラスに挿入します。
                    insertCur.insertRow([point])
                    i += 1

            else:
                insertCur.insertRow([crosspoint])

# テンポラリ フィーチャクラスのフィールドを取得します。
tempFieldList = arcpy.ListFields(tempFc)
tempFieldFilterList = []
for tempField in tempFieldList:
    if tempField.type != "OID" and tempField.type != "Geometry" and tempField.name.lower() != "shape_length" and tempField.name.lower() != "shape_area":
        tempFieldFilterList.append(tempField)

# エイリアス名を上書きします。
for (tempFieldFilter, newAliasName) in zip(tempFieldFilterList, fieldAliasNameList):
    if tempFieldFilter.name != newAliasName:
        arcpy.AlterField_management(tempFc, tempFieldFilter.name, new_field_alias=newAliasName)

# 出力フィーチャクラスを作成します。
arcpy.FeatureClassToFeatureClass_conversion(tempFc, os.path.dirname(outputFc), os.path.basename(outputFc))

end = time.time() - start
arcpy.AddMessage("処理時間: " + str(end) + " 秒")

# オブジェクトを削除して、参照を開放します。
del searchCur1, searchCur2, insertCur

免責事項

こちらのサンプルはあくまでもコーディングの見本であり、実行時に発生したエラーの対処方法につきましては、サポート対象外とさせていただきます。また、操作方法やソースコードに関するご質問は別途有償の開発者サポート契約にてご対応させていただきます。なお、コードを実行して生じたいかなる損害についても弊社では責任を負いかねます。

メタデータ

機能

種類

製品