FAQ
ArcPy: 同一属性値のグループ内で、最大値を持つフィーチャを検索する

ナレッジ番号:5441 | 登録日:2023/07/26 | 更新日:2024/11/21

概要

同じ属性値をもつフィーチャ群で、特定の数値属性が最大値をとるフィーチャを検索する (選択状態にする) 処理をするためのサンプル コードをご紹介いたします。
ここでは、全国市区町村境界ポリゴンから、都道府県ごとに人口 (P_NUM)が最大であるフィーチャを選択する処理を紹介します。

処理を実行しますと、新規にレイヤーが作成され、そのレイヤーにて、選択結果を確認できます。

サンプル コード (ArcGIS Pro 用)

import arcpy, os, collections

# 処理対象のフィーチャクラス
fc = r"C:\Temp\Test.gdb\Japan"

# フィーチャレイヤーの作成
tempLyr=arcpy.MakeFeatureLayer_management(fc,"tempLayer")
zipped = []
# サーチカーソルを作成。それぞれグルーピング用フィールドと最大値を求める対象のフィールドを指定
with arcpy.da.SearchCursor(fc, ["KEN", "P_NUM"]) as cursor:
    for row in cursor:
        zipped.append(zip((row[0], row[1])))

d = collections.defaultdict(list)

for k, v in zipped:
    d[k[0]].append(v)

#グループごとにフィーチャを検索
for k, v in d.items():
    print ("Group %s は最大値 %s です。" % (k,max(v)[0]))
    arcpy.SelectLayerByAttribute_management(tempLyr,"ADD_TO_SELECTION","KEN = '%s' AND P_NUM = %s" % (k,max(v)[0]))

サンプル コード (ArcMap 用)

# coding:cp932
import arcpy, os, collections

# 処理対象のフィーチャクラス
fc = r"C:\Temp\Test.gdb\Japan"

# フィーチャレイヤーの作成
tempLyr=arcpy.MakeFeatureLayer_management(fc,"tempLayer")
zipped = []
# サーチカーソルを作成。それぞれグルーピング用フィールドと最大値を求める対象のフィールドを指定
with arcpy.da.SearchCursor(fc, ["KEN", "P_NUM"]) as cursor:
    for row in cursor:
        zipped.append(zip((row[0], row[1])))

d = collections.defaultdict(list)

for k, v in zipped:
    d[k[0]].append(v)

for k, v in d.items():
    print u"Group %s は最大値 %s です。" % (k,max(v)[0])
    arcpy.SelectLayerByAttribute_management(tempLyr,"ADD_TO_SELECTION","KEN = '%s' AND P_NUM = %s" % (k,max(v)[0]))

注意事項

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

メタデータ

種類

製品