Wie kann die Speicherpartitionierung in Postgis beschleunigt werden?


9

Ich habe eine Reihe überlappender Polygone und versuche, den Raum zu partitionieren, um überlappende Polygone zu vermeiden. Ich denke, mein Problem ist ziemlich einfach. Mit einem ESRI-Produkt und http://arcscripts.esri.com/details.asp?dbid=16700 berechnete mein Mitarbeiter es in 48s.

Ich versuche es mit Postgis unter Verwendung von http://s3.opengeo.org/postgis-power.pdf#page=24 (Erraten der Details unter Verwendung von http://trac.osgeo.org/postgis/wiki/UsersWikiSimplifyPreserveTopology) als Inspiration), aber es ist so langsam, dass ich es nicht mit mehr als 10 Polys machen kann (ich habe 800 davon zu teilen). Der langsame Teil ist die ST_Union, ich habe verschiedene Dinge ausprobiert, aber keine war erfolgreich, hier ist der aktuelle Stand der Dinge:

select geom from
(select st_linemerge(st_union(geom)) as geom from
    (select st_exteriorring((st_dumprings((st_dump(t.geom)).geom)).geom) as geom from
        (SELECT geometry AS geom, id
               FROM tt
              WHERE campaign_id = 204
              ORDER BY id limit 200) t) t2) t3

Dies wurde für 26 Minuten berechnet (das linemerge () ist eigentlich nicht). Die Polys sind MultiPolygons, falls der st_dump Sie stört.

Hast du einen Tipp? Die st_union () der Linienführung ist der sehr langsame Teil.

Vielen Dank,

Nico.

PS: Hier sind einige Zahlen: 852 Multipolygone, die zu 14880 Polygonen führen, was zu 21467 Linestrings mit insgesamt 315513 Eckpunkten führt.


Wenn niemand antwortet, können Sie die PostGIS-Mailingliste ausprobieren.
GIS-Jonathan

Ich bin kein wirklicher Fan von Mailinglisten, außerdem könnte es auch ein GEOS-Problem sein, das sich über JTS beschweren könnte. Nun, ich ziehe es vor, das Problem offen zu halten.
Nraynaud

Wenn ich die Linien sammle und eine Vereinigung mit einer leeren Geometrie herstelle, kann ich dies in 800s tun: st_union (st_collect (geom), st_setsrid (geomfromtext ('POINT EMPTY'), 900913)), das fast 20-mal langsamer ist als das ESRI-Zeug.
Nraynaud

1
Versuchen Sie aus dem Speicher st_union von st_linemerge (st_union ...) zu löschen, wenn es hilft
Simplexio

Antworten:


3

Diese Antwort hilft @nraynaud möglicherweise nicht direkt, wird aber hoffentlich etwas Licht in das Thema bringen.

Es gibt ein ähnliches Problem in SpatiaLite <4.0 aufgrund eines Problems mit GEOS. Unter diesem Link finden Sie eine Diskussion des Problems.

Die Problemumgehung besteht darin, die Funktion ST_Union () durch ST_UnaryUnion (ST_Collect ()) zu ersetzen. Leider ist ST_UnaryUnion erst nach PostGIS 2.0 verfügbar (soweit ich das beurteilen kann.)


1

Welche PostGIS-Version verwenden Sie? Die Vereinigung ist viel langsamer, wenn Sie PostGIS <1.4 oder GEOS <3.2 verwenden. Eine viel schnellere Vereinigung wurde in 1.4 eingeführt, erfordert aber auch GEOS 3.2+. Wenn Sie also weniger als 1,4 verwenden, würde ich zuerst auf mindestens 1,5 aktualisieren.

SELECT postgis_full_version();

Überprüfen.

Sie möchten auch die ursprünglichen Kanten der Polygone beibehalten. Wenn Sie nur überlappende Bereiche auflösen möchten,

SELECT ST_Union(geom) FROM tt WHERE campaign_id = 204;

Würde den Trick machen.


Hallo, hier ist das Ergebnis: "POSTGIS =" 1.5.3 "GEOS =" 3.3.2-CAPI-1.7.2 "PROJ =" Rel. 4.8.0, 6. März 2012 "LIBXML =" 2.7.3 "USE_STATS". Ich konnte in letzter Zeit keine relevante Ergänzung zur Gewerkschaft in GEOS finden. Ich habe eine Beschleunigung in Polygon-Gewerkschaften gefunden, aber ich füge keine Polygone zusammen, und diese Beschleunigung scheint umstritten zu sein. Ich möchte meine Polygone absolut nicht vereinen, da ich Werte für überlappende Polygone hinzufügen muss.
Nraynaud
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.