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
Antworten:
Genau das macht das QGIS ftools-Tool "Join by Attribute". Es nimmt ein Shapefile und eine DBF-Datei (oder ein zweites Shapefile) und verknüpft deren Attributtabellen. Das Tool ist in Python geschrieben, daher sollten Sie hier alles finden, was Sie brauchen: http://trac.osgeo.org/qgis/browser/trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py
quelle
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:
quelle
Ich habe viel Zeit damit verbracht, es selbst zu versuchen, und ich habe etwas, das funktioniert. Lesen Sie hier meinen Code, um ihn zum Laufen zu bringen.
Wie aktualisiere ich die Feature-Class, indem ich Werte mit Verzweigung durchlaufe? .
Sie müssen eine Liste erstellen, die alle Felder enthält, damit Sie sie durchlaufen können.
quelle
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.
quelle
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:
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.
quelle