Aktualisieren Sie eine Shapefile-Attributtabelle mit Werten aus einer anderen DBF-Tabelle

10

Ich versuche hier zu erklären, was ich versuche zu tun:

Ich habe ein Shapefile und eine unabhängige DBF-Tabelle mit denselben Feldern. In der DBF-Tabelle sind alle Felder ausgefüllt, in der Shapefile-Attributtabelle jedoch nur eines. Nennen wir es "OneField". Ich möchte überprüfen, ob die Werte von "OneField" (Shapefile) mit den Werten in "OneField" (DBF-Tabelle) übereinstimmen, und in diesem Fall die verbleibenden leeren Felder in der Shapefile-Attributtabelle mit denen füllen in der unabhängigen dbf-Tabelle.

Im Moment versuche ich nur, die Werte aus der unabhängigen DBF-Tabelle in die Shapefile-Attributtabelle zu kopieren, aber ich stecke fest (wenn ich diesen Code ausführe, erhalte ich die Meldung, dass Pythonwin nicht mehr funktioniert und nichts mit den Tabellen passiert). Können Sie mir bitte helfen?

Hier ist der 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

Vielen Dank

Bogdan Palade
quelle
1
Sie können Ihre ursprüngliche Frage bearbeiten, um Informationen zu korrigieren oder hinzuzufügen.
Brad Nesom
Versuchen Sie, alle Zeilen mit .next () herauszunehmen. Mit arcpy sind die Zeilen iterierbar. Sie für "for" -Schleifen, Sie tun nicht .next ()
gotchula

Antworten:

3

Aus der Sicht des Codes sieht es so aus, als würden Sie "row" für eine Reihe (~ 4) verschiedener Dinge verwenden, von denen einige unnötig erscheinen. Ich mache nicht viel mit arcpy, aber ich würde mir vorstellen, dass so etwas besser funktionieren würde. Wenn dies der Fall wäre, würde die gesamte OneField-Spalte in Ihrem FC mit dem letzten Wert von OneField aus Ihrer Tabelle gefüllt:

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
quelle
neuhausr, vielen Dank, es funktioniert gut, wie Sie es ausdrücken
Bogdan Palade
2

Meine Methode zum Verschieben von Daten von einer Datenbank in ein Shapefile. Ist (natürlich bevorzuge ich dies in einer GUI-Software zu tun), die Datenbank mit dem Shapefile zu verbinden.

An diesem Punkt wähle ich normalerweise Attribute aus, die nicht null sind (ich mache dies im ID-Feld der zweiten Tabelle). Wenn sie nicht null sind, stimmen sie überein.

Sobald dies erledigt ist, können Sie die Werte über shapefile.onefield <> table.onefield auswählen.

Führen Sie dann Ihre Berechnung im Shapefile aus.

Brad Nesom
quelle
-1

Es tut mir leid, dass ich Ihre Frage nicht beantwortet habe, aber ich würde dies definitiv stattdessen in der Datenbankumgebung tun. Besonders wenn es sich um viele Daten handelt, wird dies wahrscheinlich viel schneller sein.

Wenn Sie beispielsweise das Shapefile und die Datenbank in eine PostGIS-Datenbank laden, könnte Ihre Abfrage folgendermaßen aussehen:

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;

Wenn Sie die Verknüpfungsfelder indexieren, sollte dies sehr schnell gehen. Sie können natürlich stattdessen shape_table aktualisieren, möchten aber stattdessen eine neue Tabelle erstellen, um die ursprünglichen Daten nicht zu zerstören.

Nicklas Avén
quelle