Jointure par attribut / spatialite avec SQL / jointure externe gauche dans QGIS

8

J'ai une couche avec des polygones (appelons-la "bois") qui est coupée par "n" objets linéaires ("routes"). Chaque route a un attribut roadid unique.

Je dois ajouter TOUS les roadid (pas seulement les premières trouvailles de QGis) à la couche de bois-polygones qu'ils croisent pour cette dernière utilisation. De préférence, tous les roadid devraient être dans une nouvelle colonne d'attributs des "bois", divisée par exemple par ",".

S'il n'y avait qu'une seule route dans chaque bois, je pourrais utiliser l'outil "join attribute by position" pour obtenir les roadid sur les polygones. L'attribut voulu est une chaîne unique, donc cela n'aide pas à additionner / moyenne / min / max les champs, et il n'y a pas d'option pour les lier ensemble sous forme de chaînes divisées par ",".

Edit: Il n'y a pas de solution sans l'aide de plugins ou de programmes externes (voir le commentaire de Matthias Kuhn ci-dessous).

(QGIS 2.10.1-Pisa)

Papierwolf
la source
Veuillez clarifier ce dont vous avez besoin à la fin du processus. Un champ contenant plusieurs valeurs séparées ou une seule valeur? Et si une seule valeur est nécessaire, quelle valeur doit être conservée lorsque vous avez plusieurs correspondances? (par exemple: garder la route la plus longue, la plus chevauchante, la plus petite
carte d'
J'ai besoin de toutes les valeurs, question mise à jour - merci pour l'astuce.
Papierwolf
1
C'est typiquement le genre de tâche que j'effectuerais à l'intérieur de PostGIS en utilisant une jointure externe gauche ... si par hasard vous utilisez PostGis, je peux fournir une réponse rapide, mais en utilisant uniquement QGIS, il faudra peut-être beaucoup plus d'étapes.
MarHoff
1
C'est quelque chose qui n'est pas (encore) possible avec QGIS. En général, cela est discuté sous le terme "fonctions agrégées" et je suis convaincu que nous verrons cela dans une version pas trop loin dans le futur. En attendant, je recommanderais d'utiliser une solution de base de données (par exemple postgres) ou il peut y avoir un outil de traitement que je ne connais pas actuellement.
Matthias Kuhn
2
Vous pouvez intersecter la couche de polygones avec la couche de polylignes. De cette façon, vous obtenez des identifiants de polygones et de polylignes qui se croisent. Vous pouvez écrire un script / plugin Python pour collecter des identifiants de polyligne vers des identifiants de polygone, mais ce n'est pas la meilleure solution d'un point de vue relationnel.
Zoltan

Réponses:

6

Utilisez la base de données Spatialite!

Il s'agit d'une base de données spatiale légère basée sur des fichiers prise en charge par QGIS.

  1. Première mise en place d'une base de données spatialite suivant ces instructions

  2. Poussez vos deux tables vers cette base de données spatialite à l'aide du gestionnaire de bases de données QGIS

  3. En supposant que vos tables sont appelées "polygone" et "ligne", exécutez la commande SQL suivante dans l'interface de requête du gestionnaire de base de données.

SELECT polygon.id,
polygon.lib, -- Place here any field releveant for you (they must also be in grouping clauses, see below)
group_concat(line.id,',') as list_id_line -- this function concatenate the id of every line that touch you polygon
FROM polygon LEFT OUTER JOIN line
ON Intersects(polygon.geom,line.geom) -- Spatial Dabatabase Rule !
GROUP BY polygon.id, polygon.lib -- theses are the grouping clauses
  1. Prendre plaisir!

Plus d'explications et de plaisir en lisant les fonctions d'agrégation SQLite ici et les fonctions de spatialite ici

MarHoff
la source
Merci MarHoff, cela semble prometteur! Je vais examiner de plus près votre solution demain et vous donner votre «réponse d'acceptation» et votre vote bien mérités.
Papierwolf
En effet, vérifiez si cela fonctionne avant;) J'ai été en fait assez étonné par le potentiel de Spatialite en tant qu'option sans serveur. Car je travaille sur PostGis vous m'avez donné une belle occasion de l'essayer!
MarHoff
Votre solution fonctionne très bien. Merci encore d'avoir fourni les sources et le script. Ils aident vraiment un débutant à comprendre comment cela fonctionne. J'essaierai de mettre à jour la question et les balises pour aider les autres à trouver cette question et votre réponse.
Papierwolf
Je vous en prie! Et j'adore le nouveau titre. À mon humble avis, il serait peut-être juste de remplacer la balise "expression" par "spatialite". Au revoir;)
MarHoff
1
Apprenez de mes erreurs: Gardez à l'esprit que vous devez cocher "Créer un index spatial" lors de l'importation de données vers SpatiaLite (ou le faire plus tard en cliquant avec le bouton droit sur les tables). Vos requêtes SQL, y compris les opérations géométriques, prendront du temps si vous oubliez de le faire.
Papierwolf