mettre à jour une table d'attributs de fichier de formes avec les valeurs d'une autre table dbf

10

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

Bogdan Palade
la source
1
Vous pouvez modifier votre question d'origine, pour corriger ou ajouter des informations.
Brad Nesom
essayez de supprimer toutes les lignes qui ont .next (), avec arcpy les lignes sont itérables, vous pour les boucles "for" sur elles, vous ne faites pas .next ()
gotchula

Réponses:

3

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:

for rowT in rowsTable:
    valueTable = rowT.getValue("OneField")
    for rowF in rowsFc:
        rowF.setValue("OneField", valueTable)
        rowsFc.updateRow(rowF)
        rowF = rowsFc.next()
    rowT = rowsTable.next() 
neuhausr
la source
neuhausr, merci beaucoup, ça fonctionne bien comme vous le dites
Bogdan Palade
2

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.

Brad Nesom
la source
-1

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:

CREATE TABLE new_table AS
SELECT a.the_geom, a.populated_field, b.populated_field2, b.populated_field3
FROM shape_table a LEFT JOIN dbf_table b ON a.populated_field=b.populated_field1;

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.

Nicklas Avén
la source