A partire da alcuni punti casuali, in un atteggiamento di imitazione di quelli nell'immagine del PO, in cui i primi due si intersecano spazialmente, quindi il 2 ° e il 3 ° hanno lo stesso attributo id (2), con un paio di altri punti che non si intersecano né spazialmente né hanno lo stesso attributo, la seguente query produce 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;
Ci sono diversi passaggi qui:
- utilizzare
ST_Union
, raggruppando per ID, per primo gruppo per attributo
- usare
ST_ClusterIntersecting
per combinare quelli dello stesso gruppo che si intersecano nello spazio
- aggiungi un id a ciascuno dei cluster (tabella multis) - provando a farlo direttamente in ClusterIntersecting porta tutte le geometrie a ottenere un id di 1
- Unisci le geometrie scaricate dal passaggio 2, raggruppando per l'id dal passaggio 3: questa è la parte dissolta . Questo fa sì che i due poligoni sovrapposti nel cluster A vengano uniti, anziché essere sovrapposti, come si trovano alla fine del passaggio 2.
Piuttosto a lungo, ma funziona (e, sono sicuro che c'è un modo più breve).
L'uso dello strumento WKT in QGIS (e scoprire quanto sono terribile con gli strumenti di modifica) produce cluster come il seguente, in cui puoi vedere il cluster etichettato come un, è tutto insieme - cioè, un colore.
Se aggiungi un testo ST_AsText alla finale, ST_UNION (d.geom), puoi vedere direttamente i risultati.
MODIFICA seguendo ulteriori informazioni nei commenti: Poiché inizi con i punti, dovrai incorporare il buffer nella mia soluzione originale, che ho inserito nel CTE temporaneo all'inizio per imitare il diagramma. Sarebbe più semplice aggiungere il buffer nel CTE dei sindacati, in modo da poter eseguire tutte le geometrie contemporaneamente. Quindi, usando una distanza del buffer di 1000, come esempio, il seguente ora restituisce 3 cluster, come previsto.
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;