¿Cómo unir todos los polígonos que se cruzan y dejan a otros sin cambios en postgis?

8

Lo que necesito es unir polígonos de intersección en una sola geometría y dejar a los demás sin cambios.

ingrese la descripción de la imagen aquí

Puedo hacer esto usando la siguiente consulta, que une todos los polígonos en una sola geometría y luego los vuelca a los separados.

INSERT INTO unioned(geom)
SELECT ST_MULTI((ST_Dump(ST_Union(geom))).geom) from footprints;

ingrese la descripción de la imagen aquí

El problema es que tengo más de un millón de filas en una base de datos y la ST_Unionoperación nunca termina. ¿Hay alguna manera de lograr lo mismo sin unir todas las geometrías?

Serhey Ladonya
fuente

Respuestas:

6

Aquí hay un enfoque diferente que espero sea mucho más rápido para el tipo de datos que mostró arriba:

ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) FROM footprints;

Esta consulta:

  1. Utiliza ST_ClusterIntersectingpara encontrar grupos de huellas de edificios que forman una "cadena de intersección", y pega cada grupo en un GeometryCollection. Devuelve una matriz.
  2. Utiliza unnestla matriz de colecciones de geometría en una fila para cada colección de geometría.
  3. Se utiliza ST_UnaryUnionpara unir los elementos dentro de cada colección de geometría.
dbaston
fuente
Muchas gracias por tu respuesta @dbaston. ¿Sabes por qué ST_ClusterIntersectingdevuelve geometría con SRID = 0? ¿Cómo se podría resolver esto? Intentando ejecutar la siguiente consulta: INSERT INTO fixed_footprints(geom) SELECT ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) as geom FROM footprints;recibí el siguiente error:[22023] ERROR: Geometry SRID (0) does not match column SRID (4326)
Serhey Ladonya
creo que resolví esto: INSERT INTO fixed_footprints(geom) SELECT ST_Multi(st_setsrid(ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))), 4326)) as geom FROM footprints;
Probaré
@SerheyLadonya parece que el problema de SRID es un error ST_ClusterIntersecting. Gracias por señalarlo, lo arreglaré.
dbaston