Daten aus Excel mit Attributtabellen in QGIS verknüpfen, ohne Duplikate zu erstellen?


15

Ich habe eine Attributtabelle mit zwei leeren Feldern in QGIS.

Beispiel 1

Ich möchte eine Excel-Datenbank importieren, um meine leeren Felder in QGIS auszufüllen. Meine Excel-Datei entspricht den Spalten in meiner QGIS-Attributtabelle.

Beispiel_2

Ich kann mein Excel (.CSV) ordnungsgemäß mit meinem Shapefile verknüpfen. Bei dem Vorgang wurden jedoch Duplikate erstellt, anstatt die leeren Felder wie gewünscht auszufüllen. Mit Hilfe von «Table Manager» kann ich die Situation korrigieren, aber es braucht viel Zeit. Ich suche nach einer effizienteren Möglichkeit, meine Excel-Daten zusammenzuführen.

Beispiel_3

Wie kann ich meine Excel-Datei mit meiner Attributtabelle verbinden, ohne Duplikate zu erstellen?


3
Schauen Sie sich dieses Tutorial an: Performing Table Joins
ArMoraer

Antworten:


13

Ich würde die folgenden Dinge tun, um das Leben leichter zu machen:

Erstellen Sie zuvor eine Sicherungskopie Ihres Shapefiles.

  1. Wechseln Sie in Ihrem Shapefile zu den Ebeneneigenschaften / -feldern und aktivieren Sie den Bearbeitungsmodus.
  2. Wählen Sie alle Felder außer dem ID-Feld aus
  3. Löschen Sie alle Felder mit Ausnahme des ID-Felds
  4. Füge deine CSV-Datei als Ebene in QGIS hinzu (Hauptmenü / Ebene / Ebene hinzufügen / Begrenzte Textebene hinzufügen) Bildbeschreibung hier eingeben(wähle keine Geometrie)
  5. Wählen Sie in Ihrem Shapefile Eigenschaften / Verknüpfungen aus und wählen Sie beide ID-Felder für Quelle und Ziel aus. Wie in der anderen Antwort auf diese Frage beschrieben.
  6. Speichern Sie Ihr geändertes Shapefile.

Bildbeschreibung hier eingeben

Dies ist die Registerkarte "Feld", auf die ich mich beziehe

Bildbeschreibung hier eingeben

Vergessen Sie nicht, die Bearbeitung vor und nach dem Löschen nicht benötigter Felder umzuschalten


12

Sie möchten die Excel-Datei mit dem Shapefile verbinden. Sie verbinden sie mit einem gemeinsamen Attribut und das Ergebnis ist eine verbundene Ebene, in der jeder Datensatz die Attribute des Shapefiles und der Excel-Datei enthält.

Ok, zuerst laden Sie Ihre Excel-Datei und Ihren Vektor später in die Ebenen. Ich habe einige Testdaten verwendet, aber Ihr Setup sollte wie folgt aussehen. Bildbeschreibung hier eingeben

Klicken Sie nun mit der rechten Maustaste auf die Ebene (im Ebenenbedienfeld) und wählen Sie Eigenschaften und dann Verbinden. Klicken Sie zuerst auf das grüne + Zeichen unten links (großer roter Pfeil im Bild unten) und es wird ein neues Menü zum Hinzufügen eines Vektor-Joins angezeigt (wie unten). Hier ist Ihre Join-Ebene die Excel-Datei (wählen Sie also die richtige Excel-Datei aus) & sheet) Das Verknüpfungsfeld ist das Feld in der Excel-Datei, das das gemeinsame Attribut für das Shapefile enthält. Das Zielfeld ist das übereinstimmende Feld im Shapefile. (in meinem Fall hießen beide gemeinsamen Felder "unit", aber wenn das Feld im Shapefile "UNIT_" genannt worden wäre, hätte ich dies anstelle von "UNIT" für mein Zielfeld verwendet.)
Bildbeschreibung hier eingeben Es gibt noch ein paar andere Optionen, mit denen Sie beim Join herumspielen können, zum Beispiel, wenn Sie nur bestimmte Felder usw. sehen möchten. Wenn Sie also zurückgehen und sich die Attribute des Shapefiles ansehen, werden Sie sehen, dass diese verbunden sind es hat jetzt die entsprechenden Attribute der Excel-Datei wie unten.

Bildbeschreibung hier eingeben

Hier sind einige praktische Tutorials, die Ihnen Schritt für Schritt zeigen, wie es geht:

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

Wie verbinde ich externe Tabellen mit der Attributtabelle eines Shapefiles in QGIS?

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

und das Tutorial ArMoraer in den Kommentaren erwähnt.


Ich habe mir das Tutorial mapbox.com/tilemill/docs/guides/joining-data angesehen , das übrigens sehr nützlich war. Ich kann meine DBF-Datei jedoch immer noch nicht mit meinem Shapefile verknüpfen. Es überrascht mich, weil meine beiden Tischstrukturen perfekt zusammenpassen. Ich verstehe das «Join-Feld» und das «Target-Feld» scheinbar nicht. Könnten Sie bitte weitere Details hinzufügen?
Laurent Robitaille-Lainesse

1
@Laurent Robitaille-Lainesse Ich habe meinen Beitrag mit einer Schritt-für-Schritt-Anleitung aktualisiert. Ich habe eine Test-Excel-Datei mit einem Polygon-Shapefile verknüpft, um sicherzustellen, dass meine Schritte korrekt waren.
ed.hank

Ich konnte meine Excel-Datei ordnungsgemäß mit QGIS verknüpfen. Ich beobachte, dass mit der Option «join» ein neues Feld in die Attributtabelle eingefügt wird. Korrigieren Sie mich, wenn ich falsch liege, aber es scheint unmöglich zu sein, die Daten aus meiner Excel-Datei in das leere Feld in meiner Attributtabelle einzufügen.
Laurent Robitaille-Lainesse

1
Wenn Sie ein leeres Feld haben, verwenden Sie den Feldrechner, um das neu verbundene Feld mit dem Feld in Ihrer Tabelle zu füllen.
ed.hank

10

Um eine weitere Methode hinzuzufügen, können Sie ein Projektmakro einrichten, das beim Laden Folgendes ausführt:

  1. Fügt Ihr Shapefile automatisch Ihrem CSV hinzu
  2. Aktualisiert die Felder IP1undIP2
  3. Entfernt die verbundenen Felder und lässt nur die Felder des Shapefiles (dh keine Dulplikate)

Erstellen Sie zunächst ein Projekt, falls Sie dies noch nicht getan haben, und wechseln Sie dann zur Symbolleiste:

Projekt> Projekteigenschaften ...> Makros

Verwenden Sie dann den folgenden Code in der def openProject():Funktion und geben Sie die Namen Ihrer Ebenen und die Felder ein, die Sie verbinden möchten. Ich habe für meine Shapefile- und CSV-Datei "Example" und "Spreadsheet" mit folgendem Feld verwendet 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())

Projektmakro

Stellen Sie sicher, dass die Ebenen nicht verbunden sind, speichern Sie das Projekt und aktivieren Sie Makros, indem Sie zur Symbolleiste gehen:

Einstellungen> Allgemein> Makros aktivieren


Wenn Sie jetzt das Projekt schließen und die CSV-Datei bearbeiten, sollten die Felder beim nächsten Laden des Projekts automatisch aktualisiert werden:

Bearbeiten der CSV-Datei

Ergebnisse


7

Mein Vorschlag ist, Open Source LibreOffice / Open Office zu verwenden, um Ihre Excel-Datei zu bearbeiten und eine DBF-Datei zu erstellen. Ich habe ein Testheft für Sie vorbereitet. Arbeitsmappe testen - Link

  1. Datei in Libre Office / Open Office öffnen.
  2. Fügen Sie die Daten aus Ihrer Excel-Datei in eine Excel-Tabelle ein.
  3. Einfügen in "DBF" -Blattdaten aus Ihrer DBF-Datei (nur ID, X, Y einfügen) (IP1- und IP2-Werte werden automatisch hinzugefügt).
  4. Speichern Sie die Datei als name.dbf (wobei der Name dem Namen Ihrer Formdatei entspricht).

Ergebnistabelle ohne Duplikate in QGIS: Bildbeschreibung hier eingeben


5

Warum sind dort zunächst die leeren Felder? Können Sie ohne die leeren Felder beginnen und nur die beiden im Join erzeugten Spalten verwenden? Ich denke, das ist der einfachste Ansatz. Entweder das oder Sie suchen ein Tool, das dem Tool "Laden" in ArcGIS ähnelt.

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

Wenn Sie keine Geodatabase verwenden, kann ich dies nur empfehlen.


Ich verwende keine Geodatabase. Tatsächlich bin ich damit nicht vertraut.
Laurent Robitaille-Lainesse

1
@ LaurentRobitaille-Lainesse Ich empfehle dringend, eine neue File-Geodatabase und anschließend eine neue Feature-Class darin zu erstellen und diese zum Speichern Ihrer Daten zu verwenden. Ich empfehle auch eine kurze Recherche zu Geodatabases und Feature-Classes und warum wir sie verwenden und was sie jenseits von Shapefiles bieten.
Stella

4

Ich weiß nicht, ob es eine direkte Möglichkeit gibt, ohne Duplikat beizutreten, da diese .shp-Datei durch Attribut in .DBF (Datenbankdatei) unterstützt wird. Dieses DBF verfügt über eine Deklaration des Spaltentyps wie Integer, Real, String usw. mit Details zu Länge und Genauigkeit. Die CSV-Datei enthält nur normale Spalten ohne deklarierten Typ. Ich weiß nicht, wie groß Ihre Datei ist. Für mich behalte ich die doppelten Felder und verwende dann den Feldrechner mit der allgemeinen Formel:

Original Field_x = Feld_x duplizieren

Löschen Sie dann alle diese duplizierten Felder (über QGIS oder ein Datenbankprogramm)


3

Ich glaube, der einfachste Weg, dies zu beheben, wäre, einfach die zwei fraglichen Spalten in der QGIS-Tabelle vor dem Join zu löschen. Wenn Sie sich dann dem Shapefile anschließen, werden die beiden gewünschten Spalten nicht dupliziert und behalten ihre ursprünglichen Spaltennamen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.