読者です 読者をやめる 読者になる 読者になる

GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

ArcPyで壊れたフィーチャクラスを抽出する方法

さて、本日は「ArcPyで壊れたフィーチャクラスを抽出する方法」です。フィーチャクラスが壊れるって何?!と思う方もいらっしゃるかと思いますが、フィーチャクラスは壊れるんです。本当に貧弱です。

確認方法

属性テーブルのヘッダカラムをダブルクリックしてください。

例えば、こういったフィーチャクラスがある場合
f:id:sanvarie:20160401155648p:plain

フィーチャの件数は861件です。フィーチャクラスが壊れている状態でヘッダカラムをダブルクリックすると
f:id:sanvarie:20160401155850p:plain

フィーチャの件数が737件に減ってしまいました。

もうこうなってしまったら最後、新しくフィーチャクラスを作成するしかありません。また、確認方法ですが、上記の方法でも問題ないのですが、フィーチャクラスが数多くある場合、あまりにも面倒です。なので、Pythonでの抽出方法を考えてみました。

確認方法

arcpy.da.FeatureClassToNumPyArray を使用します。これはFeatureClassをNumPyArrayに変換してくれる便利な関数です。

①この関数の第二引数にOBJECTIDのみを渡す
→正常なフィーチャ数を取得(861件)

②この関数の第二引数にOBJECTID以外も渡す
→異常なフィーチャ数を取得(737件)

この仕組みを利用すれば、壊れたフィーチャクラスを抽出できますね。

環境

Windows7 64bit
ArcGIS10.2.0
Python2.7.3

サンプルソース

import arcpy

arcpy.env.workspace = "" #GDBが存在する一個上のフォルダを指定
broken_list = []

for w in arcpy.ListWorkspaces(workspace_type="FileGDB"):

    arcpy.env.workspace = w

    for f in arcpy.ListFeatureClasses():

        array1 = arcpy.da.FeatureClassToNumPyArray(f,["OID@"],null_value=-9999)
        array2 = arcpy.da.FeatureClassToNumPyArray(f,["OID@","SHAPE@XY"],null_value=-9999)

        if len(array1) != len(array2):
            #GDB、フィーチャクラス、正常な件数、異常な件数を格納
            broken_list.append([w,f,len(array1),len(array2)])

print broken_list

結果はこのようになります。壊れたフィーチャクラスの結果のみ抽出することができました。
f:id:sanvarie:20160401161336p:plain

そもそもこんなしょっちゅうフィーチャクラスが壊れるってどういうことですかESRIさん!と言いたいところですが、言ってもどうしようもありません。とりあえず、運悪く壊れてしまった場合はこのように対象フィーチャクラスを抽出すればいいですね。

簡単ですが、本日は以上です。