Ich habe eine Straßentabelle, die ich basierend auf einer Reihe von Attributen ausgewählt habe (sagen wir, es ist speed_limit < 25
). Es gibt Gruppen von Straßen, die lokal benachbart sind. Ich möchte diese Sätze verbundener Linienfolgen in GeometryCollections gruppieren. In der Abbildung unten würde es zwei GeometryCollections geben: eine mit den roten Linien und eine mit den blauen Linien.
Ich habe versucht, ein paar "Auflösen, Deaggregieren" -Abfragen auszuführen, die wie folgt lauten:
SELECT (ST_Dump(st_union)).geom
FROM
(SELECT ST_Union(geom) FROM roads) sq
Nach allem, was ich ausprobiert habe, habe ich entweder ein einzelnes Feature ( ST_Union
) oder meine ursprüngliche Geometrie ( ST_Dump
von ST_Union
).
Vielleicht ist es möglich, dies mit einer Art WITH RECURSIVE
Magie zu tun ?
Antworten:
Also zum Beispiel. Hier ist eine einfache Tabelle mit zwei verbundenen Kantengruppen:
Hier ist eine rekursive Funktion, die anhand der ID einer Kante alle Kanten sammelt, die sich berühren:
Deshalb müssen wir nach jeder Gruppe die ID einer Kante finden, die noch nicht Teil einer Gruppe ist. Was tragischerweise eine zweite rekursive Abfrage erfordert.
Was zusammengenommen ein nettes Set mit der Startnummer und jeder Gruppe ergibt, die es angesammelt hat. Ich überlasse es dem Leser als Übung, die Arrays von id wieder in eine Abfrage umzuwandeln, um Geometrie für das Mapping zu erstellen.
quelle
grouplist
Array:insert into lines (id, geom) values ( 15, 'LINESTRING(0 0, 10 10)');
. Das Ändernarray_agg(id)
der Funktion "Zurück zu"array_agg(DISTINCT id)
scheint das Problem zu beheben.Hier ist ein Ansatz, der eine temporäre Tabelle verwendet, um Cluster inkrementell zusammenzufassen. Ich mag den temporären Tabellenansatz nicht wirklich, aber dies scheint recht gut zu funktionieren, wenn die Anzahl der Zeilen zunimmt (ich habe 1,2 Millionen Zeilen in meiner Eingabe).
quelle
ST_ClusterIntersecting
Funktion in PostGIS geschrieben habe. Wenn Ihre Daten so klein sind, dass sie in den Arbeitsspeicher passen, empfiehlt es sich, eine leistungsfähigere Lösung zu finden.