FAQ
ArcPy (ArcMap): ポリゴンをポリラインで切断する方法

ナレッジ番号:2996 | 登録日: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)
cutFc = arcpy.GetParameterAsText(1)
outputFc = arcpy.GetParameterAsText(2)
tempFc = r"in_memory" + os.sep + os.path.basename(outputFc)

# インメモリ ワークスペースに新規フィーチャクラスを作成します。
spRef = arcpy.Describe(cutFc).spatialReference
arcpy.CreateFeatureclass_management(os.path.dirname(tempFc), os.path.basename(tempFc), "POLYGON", "", "", "", 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@")
cutLineCur = arcpy.da.SearchCursor(inputFc, fieldNameList)

# データアクセス モジュールの InsertCursor を取得します。
outputCur = arcpy.da.InsertCursor(tempFc, fieldNameList)

# フィーチャ毎にループ処理を行い、ポリゴンをラインで切断します。
for line in cutLineCur:
    rowValues = []

    # ラインで切断するポリゴン フィーチャクラスのデータアクセス モジュールの SearchCursor を取得します。
    cutPolygonCur = arcpy.da.SearchCursor(cutFc, fieldNameList)
    for polygon in cutPolygonCur:
        # ポリゴンがラインと交差している場合に以下の処理を行います。
        if line[0].disjoint(polygon[0]) == False:
            geometries = polygon[0].cut(line[0])

    for i in xrange(1, len(polygon)):
        rowValues.append(polygon[i])

    # 切断されたポリゴンを新規フィーチャクラスに挿入します。
    for geometry in geometries:
        if geometry.area > 0:
            rowValues.insert(0, geometry)
            outputCur.insertRow(rowValues)
            rowValues.pop(0)

# テンポラリ フィーチャクラスのフィールドを取得します。
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 cutLineCur, cutPolygonCur, outputCur

免責事項

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

メタデータ

機能

種類

製品