データ処理に役立つ Python コード例 その2:Field オブジェクトを使ってデータのフィールド情報にアクセスする方法

当シリーズ:「データ処理に役立つ Python コード例」の第二弾として、今回は Python を使ってデータのフィールド情報にアクセスする方法をご紹介します。

みなさんは GIS データに対して、複数のフィールドに一連の処理を実行したり、特定のフィールドを探したりする場合、どうしますか ?

属性テーブルを開き、各フィールドを選択して処理を実行する、またはデータのプロパティ画面でフィールド名の一覧を表示して目的のフィールドを探すなど、様々な方法がありますが、今回紹介する Field オブジェクトの使い方をマスターすれば、フィールドに関係する様々な処理を、簡単かつスピーディに実行できるようになります。

Field オブジェクトは、データの持つ属性フィールドの情報にアクセスすることができます。フィールド名やデータ型はもちろんのこと、その他の様々な情報にアクセスすることができます。

Field オブジェクトにアクセスする方法は、「データ処理に役立つ Python コード例その 1」ご紹介しました Describe オブジェクトの fields プロパティを使用する方法の他に、ListFields 関数を使ってアクセスする方法があります。以下のスクリプトでは、ListFields 関数を使って sample1 というフィーチャクラスの Field オブジェクトにアクセスし、各フィールドのフィールド名、エイリアス名、データ型を取得し、表示する例です。

# coding:utf-8
import arcpy
# 変数 fc にフィーチャクラスのパスを代入
fc = r"D:\workspace\data.gdb\sample1"
# ListFields 関数で Field オブジェクトのリストを作成
fields = arcpy.ListFields(fc)
# for ループで各 Field オブジェクトにアクセスし、フィールド名とエイリアス名を出力
for fld in fields:
  print fld.name, fld.alliasName, fld.type

================== 実行結果 ==================

OBJECTID OBJECTID OID
Shape Shape Geometry
population 人口総数 Integer
households 世帯総数 Integer
Shape_Length Shape_Length Double
Shape_Area Shape_Area Double

==========================================

上記コードでは 6 行目の ListFields 関数 で sample1 フィーチャクラスの各フィールドを配列で取得しています。9 行目の fld.name はフィールド名、fld.alliasName はエイリアス名、fld.type はデータの型にアクセスしています。

Field オブジェクトを用いた実践的な例として、sample2 というフィーチャクラスが持つフィールドの中で、エイリアス名が重複しているフィールドの有無をチェックするスクリプトを見てみましょう。

#coding:utf-8
import arcpy
# 変数 fc にフィーチャクラスのパスを代入
fc = r" D:\workspace\data.gdb\sample2"
# ListFields 関数で Field オブジェクトのリストを作成
fields = arcpy.ListFields(fc)
# 重複しているエイリアス名の集合を作成
s = set()
dup = set([fld.aliasName for fld in fields if fld.aliasName in s or s.add(fld.aliasName)])
# 重複しているエイリアス名を持つフィールドの名称と、そのエイリアス名を出力
for fld in fields:
  if fld.aliasName in dup:
    print fld.name ,fld.aliasName

================== 実行結果 ==================

population_49 人口総数_59歳

population_59 人口総数_59歳

population_60 人口総数_59歳

==========================================

上記コードでは 6 行目の ListFields 関数で sample2 フィーチャクラスの各フィールドを配列で取得しています。

8、9 行目では、sample2 フィーチャクラスの各フィールドのエイリアス名を調べ、重複しているエイリアス名があれば変数 dup に追加する処理を行っています。

11 行目以降で、エイリアス名が重複しているフィールドの名前を出力しています。

今回ご紹介した例のように、フィールドを多く持つデータのチェックで Field オブジェクトは効果を発揮します。また、データのチェックだけでなく、各フィールドに同じ処理をする場合など、フィールドに対する様々な処理に活用できます。これを機に Field オブジェクトをデータ処理の効率化に活用してみてはいかがでしょうか。

■関連リンク

ArcGIS ブログ

データ処理に役立つ Python コード例その 1 :Describe オブジェクトを使ってデータのプロパティにアクセスする方法

ArcGIS ヘルプ

ArcPy とは

Field