Comenzando con algunos puntos aleatorios, en un intento de imitar aquellos en la imagen del OP, donde los dos primeros se cruzan espacialmente, luego el segundo y el tercero tienen el mismo id de atributo (2), con un par de otros puntos que ni se cruzan espacialmente ni tienen Con el mismo atributo, la siguiente consulta produce 3 grupos:
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;
Aquí hay varios pasos:
- uso
ST_Union
, agrupación por id, al primer grupo por atributo
- se usa
ST_ClusterIntersecting
para combinar aquellos del mismo grupo que se cruzan espacialmente
- agregue una identificación a cada uno de los grupos (tabla multis): intente hacer esto directamente en ClusterIntersecting conduce a todas las geometrías obteniendo una identificación de 1
- Une las geometrías volcadas del paso 2, agrupando por la identificación del paso 3: esta es la parte de disolución . Esto hace que los dos polígonos superpuestos en su grupo A se unan, en lugar de superponerse, ya que se encuentran al final del paso 2.
Es bastante largo, pero funciona (y estoy seguro de que hay un camino más corto).
El uso de la herramienta WKT en QGIS (y descubrir lo horrible que soy con las herramientas de edición) produce grupos como el siguiente, donde puede ver que el grupo que está etiquetado como a, está todo junto, es decir, un color.
Si coloca un ST_AsText alrededor de la final, ST_UNION (d.geom), puede ver los resultados directamente.
EDITE después de más información en los comentarios: a medida que comience con los puntos, deberá incorporar el búfer en mi solución original, que puse en el CTE temporal al principio para imitar su diagrama. Sería más fácil agregar el búfer en las uniones CTE, para que pueda hacer todas las geometrías a la vez. Entonces, usando una distancia de búfer de 1000, como ejemplo, lo siguiente ahora devuelve 3 grupos, como se esperaba.
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;