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

Python で ArcGIS の機能にアクセスすると効率的なデータ処理を実現できます。ArcGIS の API である ArcPy についてはこれまでにもいくつかのブログ記事でご紹介しましたが、本シリーズでは特にデータ処理に特化して ArcPy の機能についてご紹介いたします。まずは第 1 弾として、Describe オブジェクトについてご説明いたします。

Describe オブジェクトは、データ タイプやフィールド、インデックスなどデータのさまざまな情報にアクセスすることができます。以下のようなデータのプロパティにアクセスするイメージです。

image1

Describe オブジェクトは Describe 関数によって取得することができます。以下のスクリプトは、poly_1 というフィーチャクラスの Describe オブジェクトを作成し、いくつかのプロパティを表示します。

 
# coding:utf-8

import arcpy

# 変数 fc にフィーチャクラスのパスを代入
fc = r"D:\workspace\data.gdb\poly_1"
# Describe 関数で Describe オブジェクトを作成し、変数 desc に代入
desc = arcpy.Describe(fc)

print desc.name
print desc.aliasName
print desc.dataType

================== 実行結果 ==================
poly_1
ポリゴン_1
FeatureClass
==========================================

上記コードでは、10 行目の desc.name でフィーチャクラス名にアクセスし、desc.aliasName はエイリアス名、desc.dataType はデータ タイプにアクセスしています。

また、上記コードの Describe オブジェクト作成後(8 行目以降)に以下のように記述することで、フィーチャクラスのフィールド情報にもアクセスすることができます。

 
# フィーチャクラスのフィールドにアクセス
fields = desc.fields

# フィールドを反復し、フィールド名とエイリアス名を出力
for f in fields:
  print f.name, f.aliasName

================== 実行結果 ==================
OBJECTID OBJECTID
Shape Shape
population 人口総数
households 世帯総数
Shape_Length Shape_Length
Shape_Area Shape_Area
==========================================

上記コードでは、2 行目の fields = desc.fields でフィーチャクラスが持つ各フィールドの情報を配列で取得し、反復処理によってそれぞれのフィールド情報を出力しています。フィールド情報について、詳しくは次回以降の Field オブジェクトの回でご説明いたします。

それでは Describe オブジェクトを用いた実践的な例として、ファイル ジオデータベースに含まれる全てのフィーチャクラスの空間参照系をチェックし、測地系変換をしてみましょう。ここでは、世界測地系(JGD2000)と日本測地系(Tokyo Datum)で定義された 100 個のフィーチャクラス(poly_1~poly_100)が格納されているファイル ジオデータベース「data.gdb」があると仮定し、下記コードによって、フィーチャクラスのうち日本測地系(Tokyo Datum)のものは世界測地系(JGD2000)に測地系を変換し、ファイル ジオデータベース「data_jgd2000.gdb」に格納、コンソールにフィーチャクラス名を出力する処理を行っています。

#coding:utf-8

import os
import arcpy

basedir = "D:\workspace"

# ソースおよび修正後のフィーチャクラスを格納する FGDB のパスを作成
sourcegdb = os.path.join(basedir, "data.gdb")
correctedgdb = os.path.join(basedir, "data_jgd2000.gdb")

# 環境設定
arcpy.env.overwriteOutput = True
arcpy.env.workspace = sourcegdb

# FGDB 内のフィーチャクラスのリストを取得
fclist = arcpy.ListFeatureClasses()

# フィーチャクラスを反復
for fc in fclist:
  outputfc = os.path.join(correctedgdb, fc)

  # フィーチャクラスの Describe オブジェクトを変数 desc に代入
  desc = arcpy.Describe(fc)
  # フィーチャクラスの空間参照系を取得
  sr = desc.spatialReference

  # 空間参照系が日本測地系(Tokyo Datum)の場合は世界測地系(JGD2000)に変換
  # 空間参照系は SRID で指定
  if sr.name == "GCS_Tokyo":
    arcpy.Project_management(fc, outputfc, 4612, "Tokyo_To_JGD_2000_NTv2", 4301)
    print fc
  else:
    # 日本測地系(Tokyo Datum)でなければそのままコピー
    arcpy.Copy_management(fc, outputfc)

================== 実行結果 ==================
poly_17
poly_35
poly_62
==========================================

上記コードでは、24 行目で Describe オブジェクトを作成した後に 26 行目の sr = desc.spatialReference でフィーチャクラスの空間参照系情報を取得しています。30 行目以降の処理では空間参照系の名前をチェックし、名前が「GCS_Tokyo」であれば投影変換を行い、フィーチャクラス名を出力するといった処理を行っています。なお、投影変換の際には SRID を用いて空間参照系を指定しています。実行結果から 3 つのフィーチャクラスが日本測地系(Tokyo Datum)から世界測地系(JGD2000)に変換されたことがわかります。

このように Describe オブジェクトを用いることでデータのプロパティにアクセスすることができ、一度に複数のデータのプロパティを修正する際に便利です。プロパティへのアクセスは、フィーチャクラスだけではなくジオデータベースやテーブルなどさまざまなデータで可能ですので、ご利用の場面に合わせてお試しください。

関連リンク