Vereinfachung benachbarter Polygone mit PostGIS?

24

Ich bin auf ein Problem gestoßen, bei dem ein Satz benachbarter Polygone vereinfacht wurde. Wenn ich jedes Polygon einzeln mit dem Douglas-Peucker-Algorithmus (der von vielen Open-Source-Werkzeugen verwendet wird) vereinfache, sind die resultierenden Polygone normalerweise nicht mehr benachbart. Dieses Problem besteht beispielsweise bei der Vereinfachung der Grenzen von Ländern / Provinzen.

Hat jemand eine Lösung dafür mit PostGIS?

Stachu
quelle

Antworten:

19

Ein topologisches Vektormodell liefert das, was Sie benötigen. In einem nicht topologischen Speicher (z. B. einem Shapefile) wird eine einzelne Kante zwischen Geometrien zweimal gespeichert. In einem topologischen Vektor werden die Bereiche getrennt von den Linien gespeichert, sodass Anpassungen vorgenommen werden können, ohne die Topologie zu beeinflussen. Ich konnte kein gutes Diagramm finden, also habe ich dieses einfache Beispiel erstellt, in dem die Bereiche A, B und C aus den Schnittpunkten der Linien (Verbindung 1-4) berechnet werden, die sie trennen. Beispiel eines topologischen Vektors

Dieses Modell wird von ArcInfo als Coverages verwendet, in GRASS als Standardvektormodell , und kann in PostGIS mit dem experimentellen PostGIS-Topologietool verwendet werden . Möglicherweise besteht eine einfachere Lösung darin, Ihre Daten in Linien umzuwandeln, die redundanten Segmente zu entfernen und Ihre Polygone nach der Vereinfachung neu zu erstellen.

scw
quelle
15

Sie möchten Ihre Polygone in Linien verwandeln, diese Linien zu einfachen Überdeckungskanten machen, diese Kanten vereinfachen, sie dann wieder zu Polygonen aufbauen und schließlich mit Point-in-Polygon die Attribute der alten Polygone wieder mit den verknüpfen neue.

CREATE TABLE rings AS SELECT (ST_DumpRings(polys)).geom AS rings FROM polytable;
CREATE TABLE simplerings AS SELECT ST_Union(rings) AS simplerings FROM rings;
CREATE TABLE newpolycollection AS SELECT ST_Polygonize(ST_Simplify(simplerings, 10.0)) AS geom FROM simplerings;
CREATE TABLE newpolysnoattributes AS SELECT (ST_Dump(geom)).geom FROM newpolycollection;
CREATE TABLE newpolytable AS SELECT new.geom, old.attr FROM newpolysnoattributes new, polytable old WHERE ST_Contains(new.geom, ST_PointOnSurface(old.polys));

Es gibt Fehler in den oben genannten, aber das Kernkonzept ist da. Sie können alles in einer Abfrage tun, wenn Sie möchten.

Paul Ramsey
quelle
2

Um dieses Problem zu vermeiden, sollten Sie Ihre Daten unter Verwendung topologischer Einschränkungen modellieren. http://mapshaper.org/ macht es.

julien
quelle
-1

Sie müssen tessellieren. In der alten ARC / INFO-Theorie zum Erstellen von Geometrie werden zwei benachbarte Geometrien durch eine Polylinie erstellt und diese Polylinie gemeinsam genutzt. Wenn Sie also generalisieren, werden beide Rahmen generalisiert, da auf dieselbe Polylinie verwiesen wird.

CrazyEnigma
quelle