さて、ブログの更新が滞っていましたが再開させようと思います。今回はArcPyでサブタイプの取得方法を紹介したいと思います。
サブタイプとは?!
そもそもサブタイプとは何なのでしょうか?
サブタイプは、フィーチャクラスのデータを分類する場合に使用します。例えば、道路を表現する場合に高速道路、国道、地方道と別々のフィーチャクラスを作成するのではなく、道路という単一のフィーチャクラスの属性値で種類を高速道路、国道、地方道のように分類します。(←ESRIさんのサイトから丸パクリしました)
つまり、一つのレイヤ(道路)の中で複数の地物(高速道路や国道など)を管理することができるということですね。例えば、DMなんかだとレイヤ数が200以上になってしまいます。これだとレイヤ数が多くなって管理しにくいので、サブタイプを使用する必要があります。そうすればレイヤ数を減らして管理しやすくなりますね(Zmapなども同様かと思います)。
環境
Windows7 64bit
ArcGIS10.2.0
Python2.7.2
サブタイプの設定
以下のように設定しました。
サンプルコード
とても簡単ですね。まずは「ListSubtypes」という関数を使用してサブタイプの情報を取得します。その後、ごにょごにょやってサブタイプ名とサブタイプコードを取得しています(←おい、ちゃんと説明しろよという方はメッセージください)。
# -*- coding: utf-8 -*- import arcpy def get_subtype_field(fc): """サブタイプをディクショナリで取得します。 arguments: fc -- フィーチャクラス returns: subDict -- {サブタイプ名:サブタイプコード} """ subDict = {} try: subtypefields = arcpy.da.ListSubtypes(fc) for name in subtypefields.keys(): group_dict = subtypefields[name] for stkey in list(group_dict.keys()): if stkey == 'SubtypeField': fields = group_dict[stkey] for stkey in list(group_dict.keys()): if stkey == 'Name': subfields = group_dict[stkey] subDict[subfields] = name print "\n".join("%s: %s" % i for i in subDict.items()) except Exception: return None if __name__ == '__main__': arcpy.env.workspace = u"C:\ArcPySample\Sutype.gdb" get_subtype_field(u"道路")
結果を見てみるとばっちりですね!
本サンプルに関してですが、例えば、サブタイプごとのアイテム数を抽出したい場合、まずはサブタイプの取得が必要になります。また、多くのフィーチャクラスが存在する中で、どのフィーチャクラスがサブタイプを使用しているかの判定にも使えるかと思います。サブタイプはとても便利なので、まだ使ったことがないという方はぜひ使ってみてください!本日は以上です!!