aggiorna una tabella degli attributi shapefile con i valori di un'altra tabella dbf


10

Cerco di spiegare qui cosa sto cercando di fare:

Ho un file shapefile e una tabella dbf indipendente con gli stessi campi. Nella tabella dbf tutti i campi sono popolati ma nella tabella degli attributi shapefile solo uno, lo chiamiamo "OneField". Quello che voglio fare è verificare che i valori di "OneField" (Shapefile) siano gli stessi di "OneField" (tabella dbf) e, in tal caso, popolare i campi vuoti rimanenti nella tabella degli attributi di shapefile con quelli nella tabella dbf indipendente.

Al momento sto solo cercando di copiare i valori dalla tabella indipendente dbf alla tabella degli attributi shapefile ma sono bloccato (quando eseguo questo codice ricevo un messaggio che pythonwin ha smesso di funzionare e non succede nulla alle tabelle). Puoi darmi una mano per favore?

Ecco il codice:

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

Grazie mille


1
È possibile modificare la domanda originale, per correggere o aggiungere informazioni.
Brad Nesom,

prova a eliminare tutte le righe che hanno .next (), con arcpy le righe sono iterabili, tu per "for" loop su di esse, non fai .next ()
gotchula

Risposte:



3

Dal punto di vista del codice, sembra che tu stia usando "row" per un sacco (~ 4) cose diverse, alcune delle quali sembrano non essere necessarie. Non faccio molto con arcpy, ma immagino che qualcosa del genere funzionerebbe meglio. In tal caso, finiresti con l'intera colonna OneField nel tuo FC popolata con l'ultimo valore di OneField dalla tua tabella:

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, grazie mille, funziona bene come lo metti
Bogdan Palade,


2

Il mio metodo per spostare i dati da un dbf a uno shapefile. È (ovviamente preferisco farlo all'interno di un software gui) unire il dbf allo shapefile.

A quel punto normalmente seleziono attributi che non sono nulli (lo faccio sul campo ID della seconda tabella). Se non sono nulli, hanno fatto corrispondere.

Una volta fatto ciò è possibile selezionare i valori da shapefile.onefield <> table.onefield.

Quindi esegui il calcolo nel file di forma.


-1

Ci scusiamo per non aver risposto alla tua domanda, ma lo farei sicuramente in db-environment. Soprattutto se si tratta di molti dati, probabilmente sarà molto più veloce.

Se ad esempio carichi lo shapefile e il dbf in un db PostGIS, la tua query potrebbe essere simile a questa:

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;

Se inserisci l'indice nei campi di unione, questo dovrebbe essere molto veloce. Puoi ovviamente aggiornare shape_table invece, ma preferisci creare una nuova tabella invece di non distruggere i dati originali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.