Join durch Attribut / Spatialite mit SQL / Left Outer Join in QGIS

8

Ich habe eine Ebene mit Polygonen (nennen wir es "Wald"), die von "n" Linienobjekten ("Straßen") geschnitten wird. Jede Straße hat ein eindeutiges Attribut roadid.

Ich muss ALLE Roadids (nicht nur die ersten QGis-Funde) zu der Holz-Polygon-Schicht hinzufügen, die sie für die letztere Verwendung schneiden. Vorzugsweise sollten sich alle Roadids in einer neuen Attributspalte des "Waldes" befinden, geteilt durch zB ",".

Wenn es nur eine Straße in jedem Holz gäbe, könnte ich das Werkzeug "Attribut nach Position verbinden" verwenden, um Straßen-IDs auf den Polygonen zu erhalten. Das gewünschte Attribut ist eine eindeutige Zeichenfolge, daher hilft es nicht, die Felder zu summieren / zu berechnen / zu min / max, und es gibt keine Option, sie als durch "," geteilte Zeichenfolgen zusammenzubinden.

Bearbeiten: Ohne die Hilfe von Plugins oder externen Programmen gibt es derzeit keine Lösung (siehe Kommentar von Matthias Kuhn unten).

(QGIS 2.10.1-Pisa)

Papierwolf
quelle
Bitte klären Sie am Ende des Prozesses, was Sie benötigen. Ein Feld mit mehreren getrennten Werten oder nur einem Wert? Und wenn ein einzelner Wert benötigt wird, welcher Wert muss beibehalten werden, wenn Sie mehrere Übereinstimmungen haben? (zB: längste Straße halten, die überlappendere, kleinste ID usw.)
MarHoff
Ich brauche alle Werte, Frage aktualisiert - danke für den Hinweis.
Papierwolf
1
Dies ist die Art von Aufgabe, die ich in PostGIS mit einem LEFT OUTER JOIN ausführen würde. Wenn Sie zufällig PostGis verwenden, kann ich eine schnelle Antwort geben, aber die Verwendung von nur QGIS erfordert möglicherweise viel mehr Schritte.
MarHoff
1
Dies ist mit QGIS (noch) nicht möglich. Im Allgemeinen wird dies unter dem Begriff "Aggregatfunktionen" diskutiert, und ich bin zuversichtlich, dass wir dies in einer nicht allzu weit entfernten Version sehen werden. In der Zwischenzeit würde ich empfehlen, eine Datenbanklösung (z. B. Postgres) zu verwenden, oder es gibt möglicherweise ein Tool für die Verarbeitung, das mir derzeit nicht bekannt ist.
Matthias Kuhn
2
Sie können die Polygonebene mit der Polylinienebene schneiden. Auf diese Weise erhalten Sie sich überschneidende Polygon- und Polylinien-IDs. Sie können ein Python-Skript / Plugin schreiben, um Polylinien-IDs zu Polygon-IDs zu sammeln, aber aus relationaler Sicht ist dies nicht die beste Lösung.
Zoltan

Antworten:

6

Verwenden Sie die Spatialite-Datenbank!

Es handelt sich um eine leichtgewichtige dateibasierte räumliche Datenbank, die von QGIS sofort unterstützt wird.

  1. Richten Sie zuerst eine Spatialite-Datenbank gemäß diesen Anweisungen ein

  2. Verschieben Sie Ihre beiden Tabellen mit dem QGIS DB-Manager in diese Spatialite- Datenbank

  3. Angenommen, Ihre Tabellen heißen "Polygon" und "Zeile", führen Sie den folgenden SQL-Befehl in der DB Manager-Abfrageoberfläche aus.

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. Genießen!

Weitere Erklärungen und Spaß beim Lesen der SQLite-Aggregatfunktionen hier und der Spatialite-Funktionen hier

MarHoff
quelle
Danke MarHoff, das sieht vielversprechend aus! Ich werde mir Ihre Lösung morgen genauer ansehen und Ihnen Ihre wohlverdiente "Antwort annehmen" und Ihre Zustimmung geben.
Papierwolf
In der Tat prüfen, ob es vorher funktioniert;) Ich war tatsächlich ziemlich erstaunt über das Spatialite-Potenzial als serverlose Option. Da ich an PostGis arbeite, haben Sie mir eine schöne Gelegenheit gegeben, es zu versuchen!
MarHoff
Ihre Lösung funktioniert einwandfrei. Nochmals vielen Dank für die Bereitstellung der Quellen und des Skripts. Sie helfen einem Anfänger wirklich zu verstehen, wie dies funktioniert. Ich werde versuchen, die Frage und die Tags erneut zu aktualisieren, damit andere diese Frage und Ihre Antwort finden können.
Papierwolf
Bitte schön! Und ich liebe den neuen Titel. IMHO könnte es auch fair sein, das Tag "Ausdruck" durch "Spatialite" zu ersetzen. Tschüss;)
MarHoff
1
Lernen Sie aus meinen Fehlern: Denken Sie daran, dass Sie beim Importieren von Daten in SpatiaLite "Spatial Index erstellen" aktivieren müssen (oder später, indem Sie mit der rechten Maustaste auf die Tabellen klicken). Ihre SQL-Abfragen einschließlich geometrischer Operationen werden ewig dauern, wenn Sie dies vergessen.
Papierwolf