J'essaie d'expliquer ici ce que j'essaie de faire:
J'ai un shapefile et une table dbf indépendante avec les mêmes champs. Dans la table dbf, tous les champs sont remplis mais dans la table d'attributs shapefile, un seul, nomme-le "OneField". Ce que je veux faire est de vérifier que les valeurs de "OneField" (Shapefile) sont les mêmes que les valeurs de "OneField" (table dbf) et si c'est le cas, de remplir les champs vides restants dans la table d'attributs shapefile avec ceux dans la table dbf indépendante.
Pour le moment, j'essaie simplement de copier les valeurs de la table dbf indépendante dans la table d'attributs shapefile mais je suis bloqué (lorsque j'exécute ce code, je reçois un message indiquant que pythonwin a cessé de fonctionner et qu'il ne se passe rien aux tables). Pouvez-vous me donner un coup de main s'il vous plaît?
Voici le code:
import arcpy
table = "link/to/table.dbf"
fc = "link/to/shapefile.shp"
# Create a search cursor
rowsTable = arcpy.SearchCursor(table)
# Create an update cursor
rowsFc = arcpy.UpdateCursor(fc)
for row in rowsTable:
row = row.getValue("OneField")
valueTable = row
for row in rowsFc:
row = row.setValue("OneField", valueTable)
rowsFc.updateRow(row)
row = rowsFc.next()
row = rowsTable.next()
del row, rowsFc, rowsTable
Merci beaucoup
Réponses:
C'est exactement ce que fait l'outil QGIS ftools "Join by Attribute". Il prend un fichier de formes et un fichier dbf (ou un deuxième fichier de formes) et joint leurs tables d'attributs. L'outil est écrit en python, vous devriez donc trouver tout ce dont vous avez besoin ici: http://trac.osgeo.org/qgis/browser/trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py
la source
Du point de vue du code, on dirait que vous utilisez "rangée" pour un tas (~ 4) de choses différentes, dont certaines semblent inutiles. Je ne fais pas grand chose avec arcpy, mais j'imagine que quelque chose comme ça fonctionnerait mieux. Si c'était le cas, vous vous retrouveriez avec la colonne OneField entière dans votre FC remplie avec la dernière valeur de OneField de votre table:
la source
J'ai passé beaucoup de temps à essayer moi-même et j'ai quelque chose qui fonctionne. Référez-vous à mon code ici pour le faire fonctionner.
Comment mettre à jour la classe d'entités en parcourant les valeurs avec une ramification? .
Vous devrez créer une liste contenant tous les champs afin de pouvoir les parcourir.
la source
Ma méthode pour déplacer des données d'un dbf vers un fichier de formes. Est (bien sûr, je préfère le faire à l'intérieur d'un logiciel gui) joindre le dbf au shapefile.
À ce stade, je sélectionne normalement des attributs qui ne sont pas nuls (je le fais sur le champ id de la deuxième table). S'ils ne sont pas nuls, ils correspondent.
Une fois cela fait, vous pouvez sélectionner les valeurs par shapefile.onefield <> table.onefield.
Exécutez ensuite votre calcul dans le fichier de formes.
la source
Désolé de ne pas répondre à votre question, mais je le ferais certainement dans db-environment à la place. Surtout si c'est beaucoup de données, alors ce sera probablement beaucoup plus rapide.
Si vous chargez par exemple le fichier de formes et le dbf dans un db PostGIS, votre requête pourrait ressembler à ceci:
Si vous mettez un index sur les champs de jointure, cela devrait être très rapide. Vous pouvez bien sûr mettre à jour shape_table à la place, mais vous souhaitez plutôt créer une nouvelle table pour ne pas détruire les données d'origine.
la source