当シリーズ:「データ処理に役立つ 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 ヘルプ