Unire i dati da Excel alla tabella degli attributi in QGIS senza creare duplicati?


15

Ho una tabella degli attributi con due campi vuoti in QGIS.

Esempio 1

Voglio importare un database Excel per riempire i miei campi vuoti in QGIS. Il mio file Excel corrisponde alle colonne nella mia tabella degli attributi QGIS.

Example_2

Sono in grado di unire correttamente il mio Excel (. CSV) al mio shapefile. Tuttavia, il processo, anziché riempire i campi vuoti come desidero, ha creato duplicati. Con l'aiuto di «Table Manager» sono in grado di correggere la situazione, ma richiede molto tempo. Sto cercando un modo più efficiente per unire i miei dati Excel.

Example_3

Come posso unire il mio file Excel alla mia tabella degli attributi senza creare duplicati?


3
Dai

Risposte:


13

Farei le seguenti cose per semplificare la vita:

Prima di farlo, esegui un backup del tuo file di forma.

  1. Nel tuo file di forma, vai alle proprietà / ai campi del livello e attiva la modalità di modifica.
  2. seleziona tutto il campo tranne il campo ID
  3. Elimina tutti i campi tranne il campo ID
  4. aggiungi il tuo file csv come layer in QGIS (Menu principale / Layer / Aggiungi layer / Aggiungi layer di testo delimitato) inserisci qui la descrizione dell'immagine(scegli nessuna geometria)
  5. nel tuo file di forma, seleziona proprietà / join e scegli entrambi i campi ID per origine e destinazione. Come descritto nell'altra risposta a questa domanda.
  6. Salva il tuo Shapefile modificato.

inserisci qui la descrizione dell'immagine

questa è la scheda Campo a cui mi riferisco

inserisci qui la descrizione dell'immagine

Non dimenticare di attivare o disattivare la modifica prima e dopo l'eliminazione del campo non necessario


13

Ti consigliamo di unire il file Excel al file shapefile. Li unirai su un attributo comune e il risultato sarà un layer unito in cui ogni record contiene gli attributi sia del file shapefile che del file excel.

Ok, prima carichi il tuo file Excel e il tuo vettore in seguito nei livelli. Ho usato alcuni dati di test che ho creato ma la tua configurazione dovrebbe essere simile alla seguente. inserisci qui la descrizione dell'immagine

Ora fai clic con il pulsante destro del mouse sul livello (nel pannello dei livelli) e scegli le proprietà, quindi scegli unisci. Per prima cosa premi il segno verde + in basso a sinistra (grande freccia rossa nella figura sotto) e si aprirà un nuovo menu Aggiungi vettore di join (come sotto) Qui il tuo livello di join sarà il file Excel (quindi scegli il file Excel appropriato & foglio) il campo join è il campo nel file excel che contiene l'attributo comune allo shapefile. Il campo target è il campo corrispondente nello shapefile. (nel mio caso a entrambi i campi comuni è stato assegnato il nome unità, ma se il campo fosse chiamato UNIT_ nello shapefile lo avrei usato al posto di UNIT per il mio campo target)
inserisci qui la descrizione dell'immagine Ci sono alcune altre opzioni che puoi confondere con il join, come se vuoi solo vedere determinati campi, ecc ... comunque così ora sono uniti e se torni indietro e guardi gli attributi del file di forma, vedrai ora ha gli attributi corrispondenti del file Excel come di seguito.

inserisci qui la descrizione dell'immagine

Ecco alcuni tutorial utili per mostrarti passo dopo passo come farlo:

https://www.mapbox.com/tilemill/docs/guides/joining-data/

http://maps.cga.harvard.edu/qgis/wkshop/join_csv.php

http://qgis.spatialthoughts.com/2012/03/using-tabular-data-in-qgis.html

Come unire le tabelle esterne con la tabella degli attributi di un file di forma in QGIS?

http://www.digital-geography.com/qgis-tutorial-ii-how-to-join-data-with-shapefiles/#.Vs9vpmHXKUk

e il tutorial ArMoraer menzionato nei commenti.


Ho guardato il tutorial mapbox.com/tilemill/docs/guides/joining-data che, tra l'altro, è stato molto utile. Tuttavia, non riesco ancora a unire il mio file DBF al mio shapefile. Mi sorprende perché entrambe le strutture del mio tavolo si abbinano perfettamente. Mi sembra di aver frainteso il «campo Join» e il «campo Target». Potresti aggiungere maggiori dettagli per favore?
Laurent Robitaille-Lainesse,

1
@Laurent Robitaille-Lainesse Ho aggiornato il mio post con una guida più dettagliata. Ho unito un file Excel di prova a un file di forma poligonale solo per assicurarmi che i miei passi fossero corretti.
Grazie,

Sono riuscito a unire correttamente il mio file Excel a QGIS. Osservo che l'opzione «join» aggiunge un nuovo campo nella tabella degli attributi. Correggimi se sbaglio, ma sembra impossibile aggiungere i dati dal mio file Excel al campo vuoto nella mia tabella degli attributi.
Laurent Robitaille-Lainesse,

1
Se si dispone di un campo vuoto, utilizzare il calcolatore di campi per popolare dal campo appena unito al campo presente nella tabella.
ed.

10

Solo per aggiungere un altro metodo, è possibile impostare una macro di progetto che una volta caricata:

  1. Unisce automaticamente il tuo file di forma al tuo csv
  2. Aggiorna i campi IP1eIP2
  3. Rimuove i campi uniti lasciando solo i campi del file di forma (ovvero senza dulplicati)

Innanzitutto, crea un progetto se non l'hai già fatto e poi vai alla barra degli strumenti:

Progetto> Proprietà progetto ...> Macro

Quindi usa il seguente codice nella def openProject():funzione e inserisci i nomi dei tuoi livelli e i campi che vuoi unire. Ho usato "Esempio" e "foglio di calcolo" per il mio file di forma e file CSV rispettivamente con il campo ID:

from PyQt4.QtCore import *
import qgis
from qgis.core import QgsMapLayerRegistry, QgsVectorJoinInfo

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your shapefile name
    if layer.name() == "Example":
        qgis.utils.iface.setActiveLayer(layer)
        shp = qgis.utils.iface.activeLayer()

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your csv name
    if layer.name() == "spreadsheet":
        qgis.utils.iface.setActiveLayer(layer)
        csv = qgis.utils.iface.activeLayer()

# Set up join parameters
shpField='ID'
csvField='ID'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
shp.addJoin(joinObject)

# Define fields to update and joined fields to copy values from
ip1 = shp.fieldNameIndex('IP1') 
ip1_join = shp.fieldNameIndex('spreadsheet_IP1')
ip2 = shp.fieldNameIndex('IP2') 
ip2_join = shp.fieldNameIndex('spreadsheet_IP2')

shp.startEditing()
for feat in shp.getFeatures():
    shp.changeAttributeValue(feat.id(), ip1, feat.attributes()[ip1_join])
    shp.changeAttributeValue(feat.id(), ip2, feat.attributes()[ip2_join])
shp.commitChanges()

# Remove join 
shp.removeJoin(csv.id())

Macro del progetto

Assicurati che i livelli non siano uniti, salva il progetto e abilita le macro andando sulla barra degli strumenti:

Impostazioni> Generali> Abilita macro


Ora quando chiudi il progetto e modifichi il file csv, la prossima volta che carichi il progetto, i campi dovrebbero essere automaticamente aggiornati:

Modifica file CSV

risultati


7

Il mio consiglio è di usare LibreOffice / Open Office open source per modificare il file Excel e creare il file .dbf. Ho preparato una cartella di lavoro di prova per te. Cartella di lavoro di prova - collegamento

  1. Apri il file in Libre Office / Open Office.
  2. Incolla i dati del foglio "Excel" dal tuo file Excel.
  3. Copia nei dati del foglio "DBF" dal tuo file .dbf (incolla solo ID, X, Y) (i valori IP1, IP2 verranno aggiunti automaticamente).
  4. Salva come file name.dbf (dove name è uguale al nome del tuo file shape).

Tabella dei risultati senza duplicati in QGIS: inserisci qui la descrizione dell'immagine


5

Perché i campi vuoti sono lì per cominciare? Puoi iniziare senza i campi vuoti e usare solo le due colonne prodotte nel join? Penso che questo sia l'approccio più semplice. O quello o trovare uno strumento simile allo strumento "Carica" ​​in ArcGIS.

https://desktop.arcgis.com/en/arcmap/latest/extensions/production-mapping/loading-data-into-a-geodatabase.htm

Se non si utilizza un geodatabase, lo consiglio vivamente.


Non sto usando un geodatabase. In effetti, non ne ho familiarità.
Laurent Robitaille-Lainesse,

1
@ LaurentRobitaille-Lainesse Consiglio vivamente di creare un nuovo file geodatabase, quindi una nuova classe di funzionalità al suo interno e utilizzarlo per archiviare i tuoi dati. Consiglio anche di fare alcune brevi ricerche su geodatabase e classi di funzionalità e perché li usiamo, cosa offrono oltre agli shapefile.
Stella,

4

Non so se esiste un modo diretto per unirsi senza duplicati dal momento che il supporto del file .shp è attribuito in .DBF (file di database). Questo DBF ha una dichiarazione del tipo di colonna come intero, reale, stringa, ecc. Con dettagli della sua lunghezza e precisione. Il file CSV ha solo una colonna normale senza alcun tipo dichiarato. Non so quanto sia grande il tuo file. Per quanto mi riguarda, terrò i campi duplicati e quindi userò il calcolatore di campi con formula generale:

Field_x originale = Duplicate Field_x

Quindi eliminare tutti quei campi duplicati (tramite QGIS o programma di database)


3

Credo che il modo più semplice per risolvere questo problema sarebbe semplicemente quello di eliminare le due colonne in questione nella tabella QGIS prima del join. Quindi, quando si unisce il file di forma, le due colonne desiderate non saranno duplicate e manterranno i nomi delle colonne 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.