Ich suche nach einer Funktion, um gemeinsame Grenzen zwischen Polygon-Features in einer Tabelle aufzulösen. ST_UNION () macht fast das, wonach ich suche, aber es erzeugt ein Multipolygon aus allen Polygonen in der Ebene, unabhängig davon, ob sie eine gemeinsame Grenze haben oder nicht. Ich würde lieber nur Grenzen zwischen Polygonen auflösen, die sich berühren. Ich dachte, es sollte eine Möglichkeit geben, ST_TOUCHES () zu verwenden, aber dann scheint die Notwendigkeit einer Überblendungsfunktion so weit verbreitet zu sein, dass ich überrascht wäre, wenn es keine eingebaute Funktion gibt, um dies zu erreichen.
Der Anwendungsfall sieht folgendermaßen aus: Ich habe Corine Landcover-Daten für ein großes europäisches Land heruntergeladen und möchte Grenzen zwischen verschiedenen Waldtypen auflösen (ca. 75.000 Polygone in einer Tabelle). Ich habe ST_UNION ausprobiert, aber es schlägt fehl mit einem "out of memory" -Fehler (30.000 Polygone haben jedoch funktioniert):
create table corine00 as
select st_union(the_geom) as the_geom,
sum(area_ha) as area_ha,
substr(code_00,1,2) as code_00
from clc00_c31_forests
group by substr(code_00,1,2)
Hinweis: Alle Gesamtstrukturcodes beginnen mit '31' und ich verwende PostGIS 1.4, GEOS-Version: 3.2.0-CAPI-1.6.0
Ich glaube, ST_Dump ist das, was Sie wollen:
ST_Dump :
Also für deinen Fall:
Ich bin nicht sicher, wie es mit der Tabellenerstellung, die Sie versuchen, interagieren wird, aber es sollte Ihnen die Geometrien als separate Einträge geben. Anschließend können Sie eine räumliche Verknüpfung (mithilfe von && und ST_Contains) zwischen den beiden Tabellen ausführen, um die Daten für die Geometrien zu erfassen.
quelle
Ist Ihr PostGIS gegen GEOS 3.1.0+ kompiliert? Für diese Version wurde eine viel schnellere kaskadierte Vereinigung implementiert, aber wenn sie nicht gefunden wird, wird der ältere Code verwendet, der um Größenordnungen langsamer ist.
Update : Es sieht so aus, als ob Ihr PostGIS den kaskadierten Vereinigungsansatz verwendet, aber der Speichermangel ist real. Ich würde versuchen, den verfügbaren Speicher für Ihre Postgres-Instanz zu erhöhen. Hier einige Ratschläge aus Paul Ramseys FOSS4G PostGIS-Vortrag von 2007 :
shared_buffers
work_mem
maintenance_work_mem
wal_buffers
checkpoint_segments
random_page_cost
In Ihrem Fall würde ich versuchen zu erhöhen
shared_buffers
, die allgemeine Empfehlung ist 25% des verfügbaren Speichers für einen Datenbankserver, aber versuchen Sie, ihn auf das 3-4-fache seines aktuellen Werts zu erhöhen und zu prüfen, ob er abgeschlossen ist.quelle