Próbuję wyjaśnić tutaj, co próbuję zrobić:
Mam jeden plik kształtów i jedną niezależną tabelę dbf z tymi samymi polami. W tabeli dbf wszystkie pola są wypełnione, ale w tabeli atrybutów shapefile tylko jedna, nazwijmy ją „OneField”. Chcę sprawdzić, czy wartości z „OneField” (Shapefile) są takie same, jak wartości w „OneField” (tabela dbf), a jeśli tak, to wypełnić pozostałe puste pola w tabeli atrybutów shapefile w niezależnej tabeli dbf.
W tej chwili próbuję po prostu skopiować wartości z niezależnej tabeli dbf do tabeli atrybutów shapefile, ale utknąłem (po uruchomieniu tego kodu pojawia się komunikat, że pythonwin przestał działać i nic nie dzieje się z tabelami). Czy możesz mi pomóc?
Oto kod:
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
Dziękuję Ci bardzo
Odpowiedzi:
Właśnie to robi narzędzie QGIS „Dołącz według atrybutu”. Pobiera plik shapefile i plik dbf (lub drugi plik shapefile) i łączy ich tabele atrybutów. Narzędzie jest napisane w języku Python, więc tutaj znajdziesz wszystko, czego potrzebujesz: http://trac.osgeo.org/qgis/browser/trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py
źródło
Z punktu widzenia kodu wygląda na to, że używasz „wiersza” do kilku (~ 4) różnych rzeczy, z których niektóre wydają się niepotrzebne. Nie robię wiele z arkowaniem, ale wyobrażam sobie, że coś takiego działałoby lepiej. Gdyby tak się stało, skończyłbyś z całą kolumną OneField w twoim FC wypełnioną ostatnią wartością OneField z twojej tabeli:
źródło
Spędziłem dużo czasu, próbując to sam i mam coś, co działa. Sprawdź mój kod tutaj, aby go uruchomić.
Jak zaktualizować klasę obiektów poprzez iterację po wartościach z rozgałęzianiem? .
Musisz utworzyć listę zawierającą wszystkie pola, aby można było je iterować.
źródło
Moja metoda przenoszenia danych z dbf do pliku kształtu. Czy (oczywiście wolę to zrobić w oprogramowaniu GUI) dołączyć dbf do pliku shapefile.
W tym momencie zwykle wybieram atrybuty, które nie mają wartości null (robię to w polu identyfikatora drugiej tabeli). Jeśli nie są one puste, to pasują do siebie.
Po wykonaniu tej czynności możesz wybrać wartości za pomocą shapefile.onefield <> table.onefield.
Następnie uruchom swoje obliczenia w pliku shapefile.
źródło
Przepraszam, że nie odpowiedziałem na twoje pytanie, ale zdecydowanie zrobiłbym to w db-environment. Zwłaszcza jeśli jest to dużo danych, prawdopodobnie będzie to znacznie szybsze.
Jeśli na przykład załadujesz plik kształtu i plik dbf do bazy danych PostGIS, zapytanie może wyglądać mniej więcej tak:
Jeśli umieścisz indeks w polach łączenia, powinno to być bardzo szybkie. Możesz oczywiście zaktualizować shape_table, ale zamiast tego chcesz utworzyć nową tabelę, aby nie zniszczyć oryginalnych danych.
źródło