Comment joindre tous les polygones qui se croisent et en laisser d'autres sans changement dans les postgis?

8

Ce dont j'ai besoin, c'est d'unir les polygones qui se croisent dans une seule géométrie et d'en laisser d'autres sans changement.

entrez la description de l'image ici

Je suis capable de le faire en utilisant la requête suivante, qui unit tous les polygones en une seule géométrie, puis les vide sur des polygones séparés.

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

entrez la description de l'image ici

Le problème est que j'ai plus d'un million de lignes dans une base de données et que l' ST_Unionopération ne se termine jamais. Existe-t-il un moyen d'y parvenir sans rejoindre toutes les géométries?

Serhey Ladonya
la source

Réponses:

7

Voici une approche différente qui, je pense, sera beaucoup plus rapide pour le type de données que vous avez montré ci-dessus:

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

Cette requête:

  1. Utilise ST_ClusterIntersectingpour trouver des groupes d'empreintes de construction qui forment une "chaîne d'intersection", et colle chaque groupe dans un GeometryCollection. Renvoie un tableau.
  2. Utilise unnestle tableau de collections de géométries dans une ligne pour chaque collection de géométries.
  3. Permet ST_UnaryUnionde réunir les éléments de chaque collection de géométries.
dbaston
la source
Merci beaucoup pour votre réponse @dbaston. Savez-vous pourquoi ST_ClusterIntersectingrenvoie la géométrie avec SRID = 0? Comment cela pourrait-il être résolu? Tentative d'exécution de la requête suivante: INSERT INTO fixed_footprints(geom) SELECT ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) as geom FROM footprints;J'ai eu l'erreur suivante:[22023] ERROR: Geometry SRID (0) does not match column SRID (4326)
Serhey Ladonya
pense que j'ai résolu ceci: INSERT INTO fixed_footprints(geom) SELECT ST_Multi(st_setsrid(ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))), 4326)) as geom FROM footprints;Je vais essayer ça sur un plus grand plateau
Serhey Ladonya
@SerheyLadonya semble que le problème SRID soit un bogue ST_ClusterIntersecting. Merci de l'avoir signalé, je vais le réparer.
dbaston