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.