Partiendo de algunos puntos aleatorios, en un intento de imitar los de la imagen del OP, donde los dos primeros se cruzan espacialmente, luego el 2º y el 3º tienen el mismo atributo id (2), con un par de otros puntos que ni se cruzan espacialmente ni tienen el mismo atributo, la siguiente consulta produce 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;
Aquí hay varios pasos:
- utilice
ST_Union
agrupando por id, para agrupar primero por atributo
- utilice
ST_ClusterIntersecting
para combinar los del mismo grupo que se cruzan espacialmente
- añadir un id a cada uno de los clusters (tabla multis) -- intentar hacerlo directamente en el ClusterIntersecting lleva a que todas las geometrías tengan un id de 1
- Unión de las geometrías volcadas desde el paso 2, agrupando por el id del paso 3 -- esta es la disolver parte. Esto hace que los dos polígonos superpuestos en su cluster A, se unan, en lugar de estar superpuestos, como lo están al final del paso 2.
Bastante largo, pero funciona (y, estoy seguro de que hay una forma más corta).
Usando la herramienta WKT en QGIS, (y descubriendo lo horrible que soy con las herramientas de edición) produce clusters como el siguiente, donde se puede ver que el cluster etiquetado como a, está todo junto -- es decir, de un solo color.
![enter image description here]()
Si pones un ST_AsText alrededor del final, ST_UNION(d.geom), entonces puedes ver los resultados directamente.
0 votos
Utilizas demasiado las subconsultas. Esto elimina su capacidad de agrupar por el atributo en el que desea agrupar.
0 votos
Así que hay que hacer una unión espacial y luego también una unión basada en el número de característica, por lo que se esperan 3 multipolígonos del diagrama anterior. Sospecho que esto requerirá un proceso de dos pasos, pero sólo quería ser claro en la pregunta, antes de ofrecer una respuesta.
0 votos
Sí, quiero unir los polígonos del buffer y recoger el resultado basado en el número de las características de entrada.
0 votos
¿Alguna novedad al respecto? Me gustaría saber si esto funciona para usted, ya que por lo que veo, he respondido a la pregunta.
0 votos
Perdona la tardanza en la respuesta, hace un par de días que no me conecto.