¿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?

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.

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.