zaktualizuj jedną tabelę atrybutów shapefile o wartości z innej tabeli dbf

10

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

Bogdan Palade
źródło
1
Możesz edytować swoje oryginalne pytanie, poprawić lub dodać informacje.
Brad Nesom,
spróbuj wyjąć wszystkie linie, które mają .next (), z arkpy wiersze są iterowalne, ty dla pętli „for” na nich, nie rób .next ()
gotchula

Odpowiedzi:

3

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:

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
źródło
neuhausr, dziękuję bardzo, działa dobrze, jak to ująłeś
Bogdan Palade,
2

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.

Brad Nesom
źródło
-1

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:

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;

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.

Nicklas Avén
źródło