Beginnend mit einigen zufälligen Punkten, um diejenigen im Bild des OP zu imitieren, bei denen sich die ersten beiden räumlich schneiden, haben der zweite und der dritte die gleiche Attribut-ID (2), mit einigen anderen Punkten, die sich weder räumlich schneiden noch haben Mit demselben Attribut erzeugt die folgende Abfrage 3 Cluster:
WITH
temp (id, geom) AS
(VALUES (1, ST_Buffer(ST_Makepoint(0, 0), 2)),
(2, ST_Buffer(ST_MakePoint(-0.7,0.5), 2)),
(2, ST_Buffer(ST_MakePoint(10, 10), 2)),
(3, ST_Buffer(ST_MakePoint(-2, 12), 2)),
(4, ST_Buffer(ST_MakePoint(5, -6), 2))),
unions(geoms) AS
(SELECT ST_Union(geom) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;
Hier gibt es mehrere Schritte:
- Verwenden Sie "
ST_Union
Gruppieren nach ID", um zuerst nach Attribut zu gruppieren
- Verwenden Sie
ST_ClusterIntersecting
diese Option, um diejenigen aus derselben Gruppe zu kombinieren, die sich räumlich schneiden
- Fügen Sie jedem Cluster eine ID hinzu (Tabelle Multis). Wenn Sie dies direkt im ClusterIntersecting versuchen, erhalten alle Geometrien eine ID von 1
- Vereinigen Sie die gedumpten Geometrien aus Schritt 2 und gruppieren Sie sie nach der ID aus Schritt 3 - dies ist der Auflösungsteil . Dies führt dazu, dass die beiden überlappenden Polygone in Ihrem Cluster A miteinander verbunden werden, anstatt sich zu überlappen, wie sie sich am Ende von Schritt 2 befinden.
Ziemlich lang, aber es funktioniert (und ich bin sicher, es gibt einen kürzeren Weg).
Wenn Sie das WKT-Tool in QGIS verwenden (und feststellen, wie schrecklich ich mit den Bearbeitungswerkzeugen bin), werden Cluster wie die folgenden erstellt, in denen Sie sehen können, dass der Cluster, den Sie als gekennzeichnet haben, alle zusammen ist - dh eine Farbe.
Wenn Sie einen ST_AsText um das Finale ST_UNION (d.geom) setzen, können Sie die Ergebnisse direkt sehen.
BEARBEITEN Sie nach weiteren Informationen in den Kommentaren: Wenn Sie mit Punkten beginnen, müssen Sie den Puffer in meine ursprüngliche Lösung integrieren - die ich zu Beginn in den temporären CTE eingefügt habe, um Ihr Diagramm nachzuahmen. Es wäre einfacher, den Puffer im CTE der Gewerkschaften hinzuzufügen, damit Sie alle Geometrien gleichzeitig ausführen können. Am Beispiel eines Pufferabstands von 1000 gibt das Folgende nun erwartungsgemäß 3 Cluster zurück.
WITH temp(id, geom) AS
(VALUES
(1, ST_SetSRID(ST_GeomFromText('MultiPoint(12370 361685)'), 31256)),
(2, ST_SetSRID(ST_GeomFromText('MultiPoint(13520 360880, 19325 364350)'), 31256)),
(3, ST_SetSRID(ST_GeomFromText('MultiPoint(11785 367775)'), 31256)),
(4, ST_SetSRID(ST_GeomFromText('MultiPoint(19525 356305)'), 31256))
),
unions(geoms) AS
(SELECT st_buffer(ST_Union(geom), 1000) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT id, ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;