En commençant par quelques points aléatoires, dans un attept pour imiter ceux de l'image de l'OP, où les deux premiers se croisent spatialement, puis les 2ème et 3ème ont le même attribut id (2), avec quelques autres points qui ne se croisent pas spatialement ni n'ont le même attribut, la requête suivante produit 3 clusters:
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;
Il y a plusieurs étapes ici:
- utiliser
ST_Union
, regroupement par id, au premier groupe par attribut
- utiliser
ST_ClusterIntersecting
pour combiner ceux du même groupe qui se croisent spatialement
- ajouter un identifiant à chacun des clusters (table multis) - en essayant de le faire directement dans ClusterIntersecting, toutes les géométries obtiennent un identifiant de 1
- Union des géométries sous-évaluées de l'étape 2, regroupées par l'ID de l'étape 3 - il s'agit de la partie de dissolution . Cela provoque les deux polygones qui se chevauchent dans votre cluster A, à se réunir, plutôt que de se chevaucher, comme ils le sont à la fin de l'étape 2.
Plutôt long, mais ça marche (et, je suis sûr qu'il y a un chemin plus court).
L'utilisation de l'outil WKT dans QGIS (et en découvrant à quel point je suis affreux avec les outils d'édition) produit des clusters comme celui-ci, où vous pouvez voir le cluster que vous étiquetez comme un, est tout ensemble - c'est-à-dire une couleur.
Si vous mettez un ST_AsText autour de la finale, ST_UNION (d.geom), vous pouvez voir les résultats directement.
EDIT suivant plus d'informations dans les commentaires: Comme vous commencez avec des points, vous devrez incorporer le tampon dans ma solution d'origine - que j'ai mis dans le CTE temporaire au début pour imiter votre diagramme. Il serait plus facile d'ajouter le tampon dans les unions CTE, donc vous pouvez faire toutes les géométries à la fois. Ainsi, en utilisant une distance tampon de 1000, par exemple, ce qui suit renvoie désormais 3 clusters, comme prévu.
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;