Mehr

Verknüpfen von zwei Datensätzen basierend auf übereinstimmenden Werten in mehreren Feldern


Ich versuche, eine Möglichkeit zu finden, CSV-Daten nur dann mit einer Vektorebene zu verbinden, wenn beide übereinstimmende Werte in . teilen mehrere Felder und nicht nur ein Feld.

Dies ist ein Problem, auf das ich bei mehreren Projekten stoße, aber ich beschreibe hier nur eines als Beispiel:

Die Daten, mit denen ich arbeite, sind folgende:

  • ein Shapefile-Layer, der eine Liste aller US-Städte/Städte mit einer Bevölkerung von mehr als 10.000 enthält.
  • 49 CSV-Dateien (eine für jeden der unteren 48 Bundesstaaten + 1 für D.C.) vom Bureau of Justice Statistics (BJS), die Daten zur Gewaltkriminalität nach Städten enthalten.

Ich versuche, die Daten aus den BJS-.csv-Dateien mit dem Layer "US-Städte und -Städte" zusammenzuführen, damit jedes Stadt-Feature Daten für Gewaltverbrechen in dieser Stadt enthält.

Das Problem ist, dass ich in der "Joins"-Schnittstelle nur ein Feld auswählen kann, an dem ich teilnehmen möchte. Wenn Sie zum Beispiel zu "US Towns & Cities" --> Properties --> Joins gehen und auf "+" klicken, um einen neuen Join zu erstellen, habe ich Folgendes (ab QGIS-Version 2.12):

Hier verbinde ich also die BJS-Daten für Georgia mit dem Layer "US-Städte und -Städte" nach Städtenamen ... Nehmen Sie nun an, dass ich dasselbe für die BJS-Florida-Daten getan habe.

Nun gibt es mehrere Möglichkeiten, wie dies zu Problemen führt. Das größte Problem besteht darin, dass es Namenskollisionen für Städte in verschiedenen Bundesstaaten gibt. Der Kartenlayer "US-Städte und -Städte" enthält beispielsweise 8 Städte mit dem Namen "Gainesville", denen jetzt ALLE BJS-Daten für Gainesville, Georgia UND Gainesville, Florida zugeordnet sind:

Ich muss die Kriminalitätsdaten für eine Stadt nur eingeben, wenn beide der Name der Stadt UND des Bundesstaates stimmen überein, sodass die Daten von Gainesville, Florida, nur mit Gainesville, Florida und nicht mit Gainesville, Georgia verknüpft werden… Wie mache ich das?

Ein weiteres Problem, das durch den obigen Ansatz verursacht wird und nicht unbedingt zu falschen Ergebnissen führt, aber "falsch" erscheint, ist, dass jede einzelne Stadt jetzt fast 1000 NULL-Felder enthält (~20 davon für jede der 49 CSV-Dateien)… I habe das Gefühl, dass es einen besseren Weg geben muss, dies zu tun.


Eine Möglichkeit wäre, die beiden ID-Spalten mit dem Feldrechner für jede Tabelle zu einem neuen virtuellen Feld zu verketten. Dann treten Sie auf den virtuellen Feldern bei.

Persönlich würde ich mich stattdessen für eine DB-Lösung wie Spatialite oder PostGIS entscheiden, bei der Sie mehr Kontrolle über den Join haben.