Como unir todos os polígonos que se cruzam e deixam outros sem alteração no postgis?

8

O que eu preciso é unir polígonos que se cruzam em uma única geometria e deixar outros sem alterações.

insira a descrição da imagem aqui

Consigo fazer isso usando a seguinte consulta, que une todos os polígonos em uma única geometria e os despeja nos separados.

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

insira a descrição da imagem aqui

O problema é que eu tenho mais de um milhão de linhas em um banco de dados e a ST_Unionoperação nunca termina. Existe alguma maneira de conseguir o mesmo sem unir todas as geometrias?

Serhey Ladonya
fonte

Respostas:

6

Aqui está uma abordagem diferente que, espero, será muito mais rápida para o tipo de dados que você mostrou acima:

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

Esta consulta:

  1. Usa ST_ClusterIntersectingpara encontrar grupos de pegadas de construção que formam uma "cadeia de interseção" e cola cada grupo em um GeometryCollection. Retorna uma matriz.
  2. Usa unnesta matriz de coleções de geometria em uma linha para cada coleção de geometria.
  3. Usa ST_UnaryUnionpara unir os itens em cada coleção de geometria.
dbaston
fonte
Muito obrigado pela sua resposta @dbaston. Você sabe por que ST_ClusterIntersectingretorna geometria com SRID = 0? Como isso poderia ser resolvido? Tentando executar a seguinte consulta: INSERT INTO fixed_footprints(geom) SELECT ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) as geom FROM footprints;Eu recebi o seguinte erro:[22023] ERROR: Geometry SRID (0) does not match column SRID (4326)
Serhey Ladonya
acho que resolveu este: INSERT INTO fixed_footprints(geom) SELECT ST_Multi(st_setsrid(ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))), 4326)) as geom FROM footprints;vai tentar fazer isso em um conjunto maior
Serhey Ladonya
@SerheyLadonya parece que o problema do SRID é um erro ST_ClusterIntersecting. Obrigado por apontar, eu vou consertá-lo.
dbaston