図形の数=テーブルレコードの数かどうかをプログラムで確認する方法


9

破損しているシェープファイルが約1000個あります(添付のエラーメッセージを参照)。シェープファイルはeCognition Developer 8から生成されました。シェープファイルが破損していると識別されると、シェープファイルを修復するように見えるスクリプトツールがあります。

ここに画像の説明を入力してください

編集:

すべてのシェープファイルをループして、シェイプの数がテーブルレコードと一致するかどうかを確認する簡単なスクリプトを作成したいと思います。以下を使用してテーブルレコードをカウントできます。

# Name: fcCount.py
# Purpose: calculate the number of features in a featureclass

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"
Sample = "MyShp.shp"
result_dbf = int(arcpy.GetCount_management(Sample).getOutput(0)) 
print result_dbf

最終的には、次のようなロジックチェックを作成します。

if result_dbf = result_shp:
    pass
else:
    print "There is a problem with" + str(Sample)

.dbfファイルにアクセスせずに形状を直接カウントするにはどうすればよいですか?または、言い換えると、図形の数がテーブルレコードの数と一致するかどうかをプログラムで確認する最良の方法は何ですか?


1
ファイルを表示できると思いますが、属性テーブルの各アイテムはオブジェクトで表されていますか?それがsbnファイルが処理するものです。数字が表示されるかどうかに関係なく、一致しません。shapefilerepairerは私が使用するものです。
Brad Nesom 2013

1
スクリプトの逆コンパイルは便利かもしれませんが、それは古いコードです。それが今日のシェープファイルでも機能することに正直に驚いています。
ポール・

1
@Brad投稿を更新して修正しました。.sbnエラーは私がこれまで経験してきた別の問題であり、この問題とは無関係です。
アーロン

@Bradシェイプチェッカーで破損したファイルを実行すると、「dbfファイルに十分なレコードがない-空白を追加しています」と報告されます。
アーロン

回答:


5

pyshpの使用についてはどうですか?私はそれをpipでインストールしました、そして私が以下に試みたものはREADMEからかなりまっすぐです:

>>> import shapefile
>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> shapes = sf.shapes()
>>> len(shapes)
33732
>>> records = sf.records()
>>> len(records)
33732
>>>

残念なことに(あるいは幸運なことに?)私は、接続されているかどうかをテストするためのジャッキアップされたシェープファイルを持っていません。形状の!=いいえ。レコードの。

ちょっと待って、以下のコメントにあるカークのアイデアのおかげで、シェイプファイルがジャッキアップされました。私はdbfをバックアップし、シェープファイル全体のコピーを作成し、一部の機能を削除してから、バックアップされたdbfの名前を元に戻し、見たところ、形状の数<レコードの数です。

>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> records = sf.records()
>>> len(records)
33732
>>> shapes = sf.shapes()
>>> len(shapes)
33721
>>>

2
シェープファイル(実際にはファイル)のコピーを作成してみてください。次に、コピーでいくつかの機能を削除します。次に、元のdbfをコピーされたdbf(行がいくつか削除されている)で置き換えます。
カークカイケンダル2013

@KirkKuykendall-あなたのアイデアはうまくいきました、編集を見てください。ありがとう。
チャドクーパー

7
問題ない。さらにデータを破壊する必要がある場合は、お知らせください。
カークカイケンダル2013

@Chadのヘルプに感謝します。シェープファイルモジュールがうまく機能しました。シェープファイルを正常にチェックするために使用する最終スクリプトを投稿しました。約50/1000の破損したファイルがありました。
アーロン

5

あなたの質問の音から、あなたが本当にやりたいことは、シェープファイルに問題があるかどうかを判断することです(この場合、レコードの不一致)。問題のあるものを特定するだけの場合は、DBFとShapefileのレコードをカウントして、エラーがないかどうかを確認する必要はありません。理由は次のとおりです。

レコード数が異なるシェープファイルに対してGetCount関数を実行しようとすると、次のエラーで失敗します。

エラー000229:開けません。実行に失敗しました(GetCount)。

このシナリオではGetCount関数が失敗し、エラーのあるシェープファイルを特定するだけなので、以前に使用しようとしていたif / elseの代わりに、コードのtry / except句でこれをキャッチできます。

"List FeatureClasses"コードとループを自由に追加して、ワークスペース内のすべてのFCを手動でテストしなくてもテストできるようにしました。

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"

fcList = arcpy.ListFeatureClasses()

for fc in fcList:
    try:
        result_dbf = int(arcpy.GetCount_management(fc).getOutput(0))
        print fc + ": " + str(result_dbf) + " records"
    except:
        print "There is a problem with: " + str(fc)

ライアンに感謝します。これはチャドのソリューションの優れた代替手段であり、トリックも行います。
アーロン

2

シェープファイル形式が文書化されています。shpファイルのレコード数がdbfファイルのレコード数に対応していないと思います。

shpファイル形式はここに記載されています。したがって、形状の数を数えるプログラムを書くことができます。dbf形式は多くの場所に文書化されており、行をカウントするためのサンプルをここで見つけることができるはずです


dBaseファイルの行は、次の2つの方法でカウントできます。(1)ヘッダーのレコードは、そこに含まれる行数を規定し、(2)合計ファイル長(バイト単位)からヘッダー長を差し引き、レコード長で除算します( 1とフィールドの長さの合計の合計に等しい)。通常、ファイルが物理的に切り捨てられている場合は、両方を実行することをお勧めします。いずれにしても、カウントが一致しても、.shpファイルにインデックスを付ける.shxファイルがないと、.shpファイルと.dbfファイルはほとんど役に立ちません。そのため、.shxファイルの数をすばやく確認する方が、.shpファイル全体を読み取るよりも良い場合があります。
whuber

2

添付のスクリプトはディレクトリをループし、シェイプの数が各シェープファイルのレコードの数と一致するかどうかを確認します。

import arcpy, os, shapefile
from arcpy import env

env.workspace = r"C:\path\to\shapefiles"
Dir = env.workspace

fclist = arcpy.ListFeatureClasses()

for fc in fclist:

    myfc = os.path.join(Dir, fc)
    sf = shapefile.Reader(str(myfc))
    shapes = sf.shapes()
    shape_total = len(shapes)
    records = sf.records()
    record_total = len(records)

    if shape_total != record_total:
        print "There is a problem with " + str(fc)
    else:
        print str(fc) + " passed"

1

ジオメトリチェックを使用すると、最初のステップが完了するはずです。
Onus
Repair Geometryでは、修復する問題の順序と優先度を選択できます。
ここにいくつかの他の古いバージョンのリンクがあります。シェープファイルチェッカーを実行すると、dbfの再構築が終了しますか?
これが、照合するレコードを作成するステップです。エラーの原因は2つあります。

  1. shpには、別のソフトウェア/プロセスによって削除/ドロップされたオブジェクト(空間)があります。
  2. dbfには、nullジオメトリを参照しているレコードがあります。
    これにはいくつかの原因があります。
    shxは実際には2つの間のインデックスです。
    dbfレコードをカウントせずに形状をカウントすることは、ソリューションの半分にすぎません。

残念ながら、ジオメトリを修復してもエラーは解消されません。
アーロン

1

シェイプファイルに関するウィキペディアの記事を見ると、.shxファイルには、.dbfファイルではなく、.shpファイルのインデックスが含まれているはずです。したがって、.shxと.shpが適合しているかどうかを確認する必要がある場合があります。

.dbfなしでシェープファイルを開くことは可能です(つまり、属性テーブルがないことを意味します)が、壊れたインデックスはエラーメッセージを生成します。


誰によって「許可されない」のですか?.shpファイルからすべての機能情報を回復することが可能です。
whuber

1
適切に機能するインデックスを期待するソフ​​トウェアによって。適切な用語ではなく、私は答えを少し変更しました...
AndreJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.