Pregunta:
Lo que necesito es unir polígonos que se cruzan en una sola geometría y dejar otros sin cambios.
Puedo hacer esto usando la siguiente consulta, que une todos los polígonos en una sola geometría y luego la vuelca a los separados.
INSERT INTO unioned(geom)
SELECT ST_MULTI((ST_Dump(ST_Union(geom))).geom) from footprints;
El problema es que tengo más de un millón de filas en una base de datos y la operación ST_Union
nunca termina. ¿Hay alguna forma de lograr lo mismo sin unir todas las geometrías?
Respuesta:
Aquí hay un enfoque diferente que espero sea mucho más rápido para el tipo de datos que mostró anteriormente:
ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) FROM footprints;
Esta consulta:
- Utiliza
ST_ClusterIntersecting
paraST_ClusterIntersecting
grupos de huellas de edificios que forman una "cadena de intersección" y pega cada grupo en unaGeometryCollection
. Devuelve una matriz. - Utiliza
unnest
para la matriz de colecciones de geometrías en una fila para cada colección de geometrías. - Utiliza
ST_UnaryUnion
paraST_UnaryUnion
los elementos dentro de cada colección de geometría.