Wie kann man alle sich überschneidenden Polygone verbinden und andere ohne Änderung der Postgis verlassen?

8

Was ich brauche, ist, sich überschneidende Polygone in einer einzigen Geometrie zu vereinen und andere unverändert zu lassen.

Geben Sie hier die Bildbeschreibung ein

Ich kann dies mit der folgenden Abfrage tun, bei der alle Polygone zu einer einzigen Geometrie zusammengefasst und dann auf die separaten Geometrien übertragen werden.

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

Geben Sie hier die Bildbeschreibung ein

Das Problem ist, dass ich mehr als eine Million Zeilen in einer Datenbank habe und der ST_UnionVorgang nie endet. Gibt es eine Möglichkeit, dasselbe zu erreichen, ohne alle Geometrien zu verbinden?

Serhey Ladonya
quelle

Antworten:

6

Hier ist ein anderer Ansatz, von dem ich erwarte, dass er für den oben gezeigten Datentyp viel schneller ist:

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

Diese Abfrage:

  1. Wird verwendet, ST_ClusterIntersectingum Gruppen von Gebäudegrundrissen zu finden, die eine "Schnittkette" bilden, und um jede Gruppe in eine zu kleben GeometryCollection. Gibt ein Array zurück.
  2. Verwendet unnestdas Array von Geometriesammlungen in einer Zeile für jede Geometriesammlung.
  3. Dient ST_UnaryUnionzum Vereinigen der Elemente in jeder Geometriesammlung.
dbaston
quelle
Vielen Dank für Ihre Antwort @dbaston. Wissen Sie, warum ST_ClusterIntersectingGeometrie mit SRID = 0 zurückgegeben wird? Wie könnte das gelöst werden? Beim Versuch, die folgende Abfrage auszuführen: INSERT INTO fixed_footprints(geom) SELECT ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) as geom FROM footprints;Ich habe den folgenden Fehler erhalten:[22023] ERROR: Geometry SRID (0) does not match column SRID (4326)
Serhey Ladonya
Ich glaube, ich habe das gelöst: Ich INSERT INTO fixed_footprints(geom) SELECT ST_Multi(st_setsrid(ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))), 4326)) as geom FROM footprints;werde es an einem größeren Set
ausprobieren
@SerheyLadonya sieht aus, als wäre das SRID-Problem ein Fehler ST_ClusterIntersecting. Vielen Dank für den Hinweis, ich werde es reparieren lassen.
Dbaston