FAQ
ArcPy (ArcMap): ポリゴンの重心点からポイントを作成する方法

ナレッジ番号:2989 | 登録日:2023/05/29 | 更新日:2024/06/20

概要

Python スクリプトを使用して、ポリゴンの重心点からポイントを作成する方法をご紹介します。

このサンプルでは、新規にフィーチャクラスを作成し、ポリゴン フィーチャクラスと同じフィールドを追加して重心点を挿入しています。

サンプル コード

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

# 変数を設定します。
arcpy.env.overwriteOutput = True
inputFc = r"D:\FAQ\japan_ver80\japan_ver80.shp"
outputFc = r"D:\FAQ\japan_ver80\japan_Point.shp"
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.name.encode("cp932"))

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

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

# フィーチャ毎にループ処理を行い、ポリゴン フィーチャクラスの重心座標値を取得します。
for sRow in sCursor:
    rowValues = []
    centroidPoint = arcpy.Point(sRow[0].trueCentroid.X, sRow[0].trueCentroid.Y)
    rowValues.append(centroidPoint)
    for i in xrange(1, len(sRow)):
        rowValues.append(sRow[i])
    iCursor.insertRow(rowValues)

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

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

免責事項

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

メタデータ

種類

製品