Wie kann programmgesteuert überprüft werden, ob die Anzahl der Formen = die Anzahl der Tabellendatensätze ist?


9

Ich habe eine Handvoll von ungefähr 1000 Shapefiles, die beschädigt sind (siehe beigefügte Fehlermeldung). Die Shapefiles wurden von eCognition Developer 8 generiert. Es gibt ein Skript-Tool , das das Shapefile zu reparieren scheint, sobald es als beschädigt identifiziert wurde.

Geben Sie hier die Bildbeschreibung ein

Bearbeiten:

Ich möchte ein schnelles Skript erstellen, um alle meine Shapefiles zu durchlaufen und zu überprüfen, ob die Anzahl der Shapes mit den Tabellendatensätzen übereinstimmt. Ich kann Tabellendatensätze wie folgt zählen:

# 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

Ich möchte letztendlich eine Art Logikprüfung erstellen, wie zum Beispiel:

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

Wie kann ich Formen direkt zählen, ohne auf die DBF-Datei zuzugreifen? Oder mit anderen Worten, wie lässt sich programmgesteuert am besten prüfen, ob die Anzahl der Formen mit der Anzahl der Tabellendatensätze übereinstimmt?


1
Ich stelle mir vor, dass die Datei angezeigt werden kann, aber werden alle Elemente in der Attributtabelle durch ein Objekt dargestellt? Dafür sorgt die sbn-Datei. unabhängig davon, ob die Nummer angezeigt wird, stimmt nicht überein. Shapefilerepairer ist das, was ich benutze.
Brad Nesom

1
Das Dekompilieren des Skripts mag nützlich sein, aber wow, das ist ein alter Code! Ich bin ehrlich überrascht, dass es bei den heutigen Shapefiles immer noch funktioniert.
Paul

1
@Brad Ich habe den Beitrag aktualisiert, um Korrekturen vorzunehmen. Der .sbn-Fehler ist ein anderes Problem, das ich hatte, und hat nichts mit diesem Problem zu tun.
Aaron

@Brad Wenn ich eine beschädigte Datei über den Shape Checker ausführe, wird Folgendes gemeldet: "Nicht genügend Datensätze in der DBF-Datei - Leerzeichen hinzufügen".
Aaron

Antworten:


5

Was ist mit Pyshp ? Ich habe es mit pip installiert und was ich unten ausprobiert habe, ist ziemlich direkt aus der README :

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

Leider (oder vielleicht zum Glück?) Habe ich keine aufgebockten Shapefiles zum Testen, um zu sehen, ob nein. von Formen kann! = nein. von Aufzeichnungen.

Warten Sie nur eine Minute, dank Kirks Idee in den Kommentaren unten habe ich jetzt ein aufgebocktes Shapefile. Ich habe die Datenbank gesichert, eine Kopie des gesamten Shapefiles erstellt, einige Features gelöscht, dann die gesicherte Datenbank wieder in das Original umbenannt und siehe da, die Anzahl der Formen <Anzahl der Datensätze:

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

2
Versuchen Sie vielleicht, eine Kopie der Formdatei zu erstellen (eigentlich Dateien). Löschen Sie dann in der Kopie einige Funktionen. Ersetzen Sie dann die ursprüngliche Datenbank durch die kopierte Datenbank (bei der einige Zeilen gelöscht wurden).
Kirk Kuykendall

@KirkKuykendall - Ihre Idee hat funktioniert, siehe Änderungen. Vielen Dank.
Chad Cooper

7
Kein Problem. Wenn ich jemals weitere Daten beschädigen muss, lassen Sie es mich einfach wissen.
Kirk Kuykendall

Vielen Dank für die Hilfe @Chad, das Shapefile-Modul hat den Trick gemacht. Ich habe das endgültige Skript veröffentlicht, mit dem meine Shapefiles erfolgreich überprüft wurden. Es gab ungefähr 50/1000 beschädigte Dateien.
Aaron

5

Nach dem Klang Ihrer Frage scheint alles, was Sie wirklich tun möchten, festzustellen, ob ein Shapefile Probleme damit hat oder nicht (in diesem Fall nicht übereinstimmende Datensätze). Wenn Sie nur diejenigen mit Problemen identifizieren müssen, müssen Sie die Datensätze in DBF und Shapefile nicht zählen, um festzustellen, ob sie fehlerhaft sind. Hier ist der Grund:

Wenn Sie versuchen, die GetCount-Funktion für ein Shapefile mit unterschiedlichen Datensatzzahlen auszuführen, schlägt der folgende Fehler fehl:

ERROR 000229 : Kann nicht öffnen. Ausführung fehlgeschlagen (GetCount).

Da die GetCount-Funktion in diesem Szenario fehlschlägt und Sie nur die fehlerhaften Shapefiles identifizieren möchten, können Sie dies mit einer try / exception-Klausel in Ihrem Code abfangen, anstatt mit der if / else-Klausel, die Sie zuvor verwendet haben.

Ich habe mir erlaubt, den Code und die Schleife "List FeatureClasses" hinzuzufügen, damit Sie alle FCs in Ihrem Arbeitsbereich testen können, ohne sie manuell testen zu müssen.

# 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)

Danke Ryan, dies ist eine gute Alternative zu Chad's Lösung und macht auch den Trick.
Aaron

2

Das Shapefile-Format ist dokumentiert. Ich würde vermuten, dass die Anzahl der Datensätze in der shp-Datei nicht der Anzahl der Datensätze in der DBF-Datei entspricht.

Das shp-Dateiformat ist hier dokumentiert . Sie können also ein Programm schreiben, um die Anzahl der Formen zu zählen. Das DBF-Format ist an vielen Stellen dokumentiert und Sie sollten in der Lage sein, Beispiele zum Zählen von Zeilen zu finden, z . B. hier .


Zeilen in einer dBase-Datei können auf zwei Arten gezählt werden: (1) Ein Datensatz im Header legt fest, wie viele Zeilen er enthält, und (2) subtrahiert die Headerlänge von der gesamten Dateilänge (in Byte) und dividiert durch die Datensatzlänge ( gleich eins plus die Summe der Längen der Felder). Es ist normalerweise eine gute Idee, beides zu tun, wenn die Datei physisch abgeschnitten ist. Unabhängig davon, selbst wenn die Anzahl übereinstimmt, sind die .shp- und .dbf-Dateien ohne die .shx-Datei, die in die .shp-Datei indiziert, fast unbrauchbar. Eine schnelle Überprüfung der Anzahl der SHX-Datensätze ist daher möglicherweise besser als das Lesen der gesamten SHP-Datei.
whuber

2

Das angehängte Skript durchläuft ein Verzeichnis und prüft, ob die Anzahl der Formen mit der Anzahl der Datensätze für jedes Shapefile übereinstimmt.

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

Die Verwendung der Prüfgeometrie sollte Sie durch den ersten Schritt führen.
Mit Onus
Repair Geometry können Sie die Reihenfolge und Priorität des Problems auswählen, für das Sie das Problem beheben möchten.
Hier sind einige andere Links zu älteren Versionen . Wenn Sie Shapefile Checker ausführen, beenden Sie die Neuerstellung von dbf?
Dies ist der Schritt, mit dem die entsprechenden Datensätze erstellt werden. Eines von zwei Dingen ist aufgetreten, um den Fehler zu verursachen.

  1. Der shp hat ein Objekt (räumlich), das von einer anderen Software / einem anderen Prozess gelöscht / gelöscht wurde.
  2. Die Datenbank hat einen Datensatz, der auf die Nullgeometrie verweist.
    Dies kann durch verschiedene Dinge verursacht werden.
    Das shx ist eigentlich der Index zwischen den beiden.
    Das Zählen von Formen ohne Zählen von DBF-Datensätzen ist nur die halbe Lösung.

Leider behebt die Reparaturgeometrie den Fehler nicht.
Aaron

1

Im Wikipedia-Artikel zu Shapefiles sollte die .shx-Datei einen Index für die .shp-Datei enthalten, nicht für die .dbf-Datei. Daher muss möglicherweise überprüft werden, ob .shx und .shp zusammenpassen.

Es ist möglich, ein Shapefile ohne .dbf zu öffnen (dh Sie haben keine Attributtabelle), aber ein fehlerhafter Index generiert eine Fehlermeldung.


Von wem ist es "nicht erlaubt"? Es ist möglich, alle Funktionsinformationen nur aus der SHP-Datei wiederherzustellen .
whuber

1
Von der Software, die einen gut funktionierenden Index erwartet. Nicht die richtigen Begriffe, ich habe die Antwort ein wenig geändert ...
AndreJ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.