Comment vérifier par programme si le nombre de formes = nombre d'enregistrements de table?

9

J'ai une poignée d'environ 1000 fichiers de formes corrompus (voir le message d'erreur ci-joint). Les fichiers de formes ont été générés à partir d'eCognition Developer 8. Il existe un outil de script qui semble réparer le fichier de formes une fois qu'il est identifié comme corrompu.

entrez la description de l'image ici

Éditer:

Je veux créer un script rapide pour parcourir tous mes fichiers de formes et vérifier si le nombre de formes correspond aux enregistrements de la table. Je peux compter les enregistrements de table en utilisant les éléments suivants:

# 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

Je voudrais finalement créer une sorte de vérification logique telle que:

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

Comment puis-je compter les formes directement sans accéder au fichier .dbf? Ou, en d'autres termes, quelle est la meilleure façon de vérifier par programme si le nombre de formes correspond au nombre d'enregistrements de table?

Aaron
la source
1
J'imagine que le fichier peut être consulté, mais chacun des éléments de la table attributaire est-il représenté par un objet? c'est ce dont s'occupe le fichier sbn. qu'il affiche ou non le numéro ne correspond pas. shapefilerepairer est ce que j'utilise.
Brad Nesom
1
La décompilation du script peut être utile, mais wow c'est un vieux code! Je suis honnêtement surpris que cela fonctionne toujours sur les fichiers de formes d'aujourd'hui.
Paul
1
@Brad J'ai mis à jour le message pour apporter des corrections. L'erreur .sbn est un problème différent que j'ai rencontré et n'est pas lié à ce problème.
Aaron
@Brad Lorsque j'exécute un fichier corrompu via le vérificateur de forme, il signale: "Pas assez d'enregistrements dans le fichier dbf - ajout de blancs".
Aaron

Réponses:

5

Qu'en est-il de l'utilisation de pyshp ? Je l'ai installé avec pip et ce que j'ai essayé ci-dessous est à peu près tout droit sorti du README :

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

Malheureusement (ou peut-être heureusement?) Je n'ai pas de fichiers de formes à tester pour voir si non. des formes peuvent! = non. des enregistrements.

Attendez une minute, j'ai maintenant un fichier de forme grimpé grâce à l'idée de Kirk dans les commentaires ci-dessous. J'ai sauvegardé le dbf, fait une copie de tout le fichier de formes, supprimé certaines fonctionnalités, puis renommé le dbf sauvegardé à l'original, et voilà, le nombre de formes <nombre d'enregistrements:

>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> records = sf.records()
>>> len(records)
33732
>>> shapes = sf.shapes()
>>> len(shapes)
33721
>>>
Chad Cooper
la source
2
Essayez peut-être de faire une copie du fichier de forme (fichiers, en fait). Ensuite, dans la copie, supprimez certaines fonctionnalités. Remplacez ensuite le dbf d'origine par le dbf copié (dont certaines lignes ont été supprimées).
Kirk Kuykendall
@KirkKuykendall - votre idée a fonctionné, voir les modifications. Merci.
Chad Cooper
7
Aucun problème. Si jamais vous avez besoin de moi pour corrompre d'autres données, faites le moi savoir.
Kirk Kuykendall
Merci pour l'aide @Chad, le module shapefile a fait l'affaire. J'ai posté le script final utilisé pour vérifier avec succès mes fichiers de formes. Il y avait environ 50/1000 fichiers corrompus.
Aaron
5

D'après le son de votre question, il semble que tout ce que vous voulez vraiment faire est de déterminer si un fichier de formes a des problèmes (dans ce cas, des enregistrements incompatibles). Si vous avez juste besoin d'identifier ceux qui ont des problèmes, vous n'avez pas réellement besoin de compter les enregistrements dans le DBF et le Shapefile pour déterminer s'il s'agit d'une erreur. Voici pourquoi:

Si vous essayez d'exécuter la fonction GetCount sur un fichier de formes ayant différents nombres d'enregistrements, il échouera avec l'erreur:

ERREUR 000229 : impossible d'ouvrir. Échec de l'exécution (GetCount).

Étant donné que la fonction GetCount échoue dans ce scénario et que tout ce que vous voulez faire est d'identifier les fichiers de formes par erreur, vous pouvez intercepter cela avec une clause try / except dans votre code, au lieu du if / else que vous tentiez précédemment d'utiliser.

J'ai pris la liberté d'ajouter le code et la boucle "List FeatureClasses" afin que vous puissiez tester tous les FC de votre espace de travail sans avoir à les tester manuellement chacun.

# 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)
RyanKDalton
la source
Merci Ryan, c'est une bonne alternative à la solution de Chad et fait aussi l'affaire.
Aaron
2

Le format du fichier de formes est documenté. Je suppose que le nombre d'enregistrements dans le fichier shp ne correspond pas au nombre d'enregistrements dans le fichier dbf.

Le format de fichier shp est documenté ici . Vous pouvez donc écrire un programme pour compter le nombre de formes. Le format dbf est documenté à de nombreux endroits et vous devriez pouvoir trouver des exemples pour compter les lignes, par exemple ici .

Kirk Kuykendall
la source
Les lignes d'un fichier dBase peuvent être comptées de deux manières: (1) un enregistrement dans l'en-tête précise le nombre de lignes qu'il contient et (2) soustrait la longueur de l'en-tête de la longueur totale du fichier (en octets) et divisez par la longueur de l'enregistrement ( égal à un plus la somme des longueurs des champs). C'est généralement une bonne idée de faire les deux au cas où le fichier serait physiquement tronqué. Quoi qu'il en soit, même lorsque les nombres correspondent, les fichiers .shp et .dbf sont presque inutiles sans le fichier .shx, qui indexe dans le fichier .shp. Une vérification rapide du nombre d'enregistrements .shx peut donc être préférable à la lecture de l'intégralité du fichier .shp.
whuber
2

Le script attaché parcourt un répertoire et vérifie si le nombre de formes correspond au nombre d'enregistrements pour chaque fichier de formes.

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"
Aaron
la source
1

L'utilisation de la géométrie de vérification devrait vous permettre de franchir la première étape.
Onus
Repair Geometry vous permettra de sélectionner l'ordre et la priorité du problème que vous souhaitez réparer.
voici quelques autres liens de versions plus anciennes . Lorsque vous exécutez le vérificateur de fichiers de formes, vous terminez avec la reconstruction de dbf?
C'est l'étape qui crée les enregistrements à faire correspondre. Une des deux choses s'est produite pour provoquer l'erreur.

  1. Le shp a un objet (spatial) qui a été supprimé / supprimé par un autre logiciel / processus.
  2. Le dbf a un enregistrement qui fait référence à une géométrie nulle.
    Plusieurs choses peuvent provoquer cela.
    Le shx est en fait l'indice entre les deux.
    Compter les formes sans compter les enregistrements dbf n'est que la moitié de la solution.
Brad Nesom
la source
Malheureusement, la réparation de la géométrie n'efface pas l'erreur.
Aaron
1

En regardant l' article wikipedia sur les fichiers de formes , le fichier .shx doit contenir un index sur le fichier .shp, pas sur le fichier .dbf. Il pourrait donc être nécessaire de vérifier si .shx et .shp s'emboîtent.

Il est possible d'ouvrir un fichier de formes sans .dbf (ce qui signifie que vous n'avez pas de table attributaire), mais un index cassé générera un message d'erreur.

AndreJ
la source
Par qui est-ce "interdit"? Il est possible de récupérer toutes les informations sur les fonctionnalités uniquement à partir du fichier .shp.
whuber
1
Par le logiciel qui attend un index qui fonctionne bien. Pas les bons termes, j'ai un peu changé la réponse ...
AndreJ