Joindre plusieurs enregistrements à une seule fonctionnalité à l'aide de QGIS?

25

J'essaie de créer une jointure / relation dans QGIS où j'ai un fichier de formes de bâtiments et auquel j'aimerais joindre une table non spatiale (.csv) contenant des personnes qui travaillent dans chaque bâtiment. J'ai donc plusieurs enregistrements dans ma table que je voudrais pouvoir joindre à mes fonctionnalités uniques dans mon fichier de formes. Je peux uniquement exécuter une jointure dans QGIS où le premier enregistrement est joint à la fonction de fichier de formes (c'est-à-dire la construction) mais les enregistrements suivants sont supprimés.

Quelqu'un pourrait-il me dire comment terminer cette jointure / relation dans QGIS?

Mick
la source
J'avais une question similaire ici gis.stackexchange.com/questions/5797/… Le plugin RT Layer SQL et les plugins eVis ont été suggérés. J'ai utilisé le plug-in eVis mais ce n'était pas la solution idéale.
Ando
2
J'ai le même problème et effectivement rejoindre les tables fonctionne. L'astuce consiste à joindre les tables avec plusieurs valeurs à la table avec la valeur unique (ici, de la personne au bâtiment, plutôt que l'inverse). D'après ce que je ressens, le problème est qu'en faisant cela, vous ne pouvez pas ensuite rechercher et exporter le résultat sous la forme d'un fichier géoréférencé, qui est un bug (du moins pour moi). Une façon de contourner ce problème? marc
Quel est le résultat final que vous souhaitez atteindre? Même si vous parvenez à faire une jointure, voulez-vous la présenter sur une carte? Faites des statistiques? En fonction de cela, différents flux de travail peuvent être suivis, mais l'utilisation d'une base de données est généralement une bonne idée si vous souhaitez créer des jointures.
johanvdw

Réponses:

15

J'ai résolu ce problème en utilisant QGIS 1.7.0 en enregistrant d'abord la couche vectorielle en tant que table de valeurs séparées par des virgules (CSV) avec le champ de géométrie converti en texte bien connu. Pour ce faire, le champ de calque de la boîte de dialogue "Enregistrer le calque vectoriel sous ..." doit lire GEOMETRY = AS_WKT pour créer un champ de texte bien connu de la géométrie avec la colonne nommée WKT.

Le fichier de géométrie CSV a ensuite été joint à la table d'attributs non géométriques dans une jointure un-à-plusieurs sous l'onglet des jointures de propriétés de la table d'attributs non géométriques.

La jointure résultante a été enregistrée sous un autre fichier CSV de géométrie.

Lorsque cette table est ouverte dans QGIS, chaque enregistrement d'attribut était représenté par sa géométrie vectorielle appropriée.

En faisant tout cela, j'ai découvert que le plug-in de texte délimité n'est pas nécessaire pour ouvrir un fichier de géométrie CSV si les délimiteurs sont des virgules et que le champ de géométrie WKT est nommé WKT.

Pour plus de détails sur la façon de procéder, veuillez consulter mon didacticiel sur http://georgiawildlife.com/node/2849 .

Greg Krakow
la source
Bonne approche, j'ai fait une chose similaire en utilisant simplement ogr2ogrpour créer les fichiers CSV à partir des fichiers de formes. Ensuite, un simple script R pour fusionner les fichiers sur le champ commun que je voulais et réécrire sur CSV. Puis à ogr2ogrnouveau pour créer le fichier de formes fusionné.
vpipkt
1
Ceci peut être évalué le plus haut, mais le processus destiné à cela est répondu par @underdark ci-dessous. C'est un hack et pas du tout la meilleure option, il est lent et inefficace et entraîne des fichiers plus volumineux et plus d'étapes.
nittyjee
10

Les jointures créées dans les propriétés de calque ajoutent uniquement des colonnes aux entités existantes. Si la couche vectorielle n'a que 160 entités, une jointure ne peut pas augmenter le nombre d'entités!

Utilisez plutôt la fonction de couche virtuelle. Il offre de vraies jointures de type SQL / base de données. Pour un exemple, voir mon récent article: Petits multiples pour les cartes de flux OD utilisant des couches virtuelles

entrez la description de l'image ici

obscur
la source
7

Dans QGIS 1.7, il existe un nouveau moteur pour les jointures (vous le trouverez dans les propriétés vectorielles).

Les tables sans géométrie peuvent désormais être ajoutées à un projet comme n'importe quelle autre couche (vectorielle).

Giovanni Manghi
la source
7

À partir de la version 2.2, QGIS prend en charge les relations un-à-plusieurs. Définissez-les cependant dans les propriétés du projet, et non dans les propriétés du calque vectoriel. Et puis les enregistrements associés apparaîtront dans la table d'attributs de la couche ou identifier les résultats via le formulaire.

Voir la réponse et le lien vers un bon guide ici .

Anna Pestereva
la source
4

Faites la jointure dans LibreOffice Base.

Vous ne pouvez pas surmonter le fait que vous essayez de gérer une relation 1 à plusieurs.

Pour les non spatiaux à non spatiaux, cela vaut la peine d'apprendre. Je trouve que la plus grande astuce consiste à s'assurer que les champs d'attribut de jointure ont exactement les mêmes termes.

Ouvrez les données spatiales localisées en tant que couche dans QGIS, puis sélectionnez tous les enregistrements de la table attributaire dans QGIS (effacer la sélection, inverser la sélection) et copiez-les dans une nouvelle feuille dans LibreOffice Calc. Vous trouverez que le premier champ est WKT, qui est une description de la fonctionnalité qui peut être universellement utilisée dans le SIG. Calc vous donnera une boîte de dialogue pour importer la table collée, choisissez délimité par des tabulations, assurez-vous que la virgule n'est pas cochée car elle mordra le champ WKT en bits. Mettez ensuite cette table en surbrillance dans Calc, passez à Base, mettez en surbrillance l'icône Tables à gauche et collez. La base passera par une boîte de dialogue pour importer la table. Le champ WKT peut être conservé via la jointure et lorsque le fichier est réimporté dans QGIS en tant que .csv, ils sont utilisés pour déplacer les fonctionnalités. N'oubliez pas la projection.

De cette façon, vous aurez le contrôle total de la jointure et pourrez le faire en «sens inverse». Pour effectuer des jointures dans Base, assurez-vous que le champ de données unique (le 1) est une clé primaire, puis pointez-le sur le "plusieurs" si vous connaissez un concept de 1 à plusieurs ou de 1 à n. Les jointures sont établies en créant des relations | TOOLS |. Comme je l'ai mentionné, vous voudrez probablement donner un coup de pied à quelqu'un lorsque vous trouverez que les champs de jointure contiennent les mêmes informations mais ont utilisé un texte ou une syntaxe différente pour les représenter.

hth

BWill
la source
2

Je ne pense pas que ce soit possible de lier des tables avec une relation 1 à plusieurs dans QGIS. Vous pouvez également essayer gvSIG. Ici, vous pouvez créer 1 à plusieurs liens. Après avoir créé le lien, la sélection d'une entité sur la carte mettra en surbrillance tous les enregistrements associés dans la table liée.

Ecodiv
la source
1
Depuis l'introduction des couches virtuelles, cette réponse n'est plus correcte.
underdark