it-swarm.com.de

Wie lassen sich GIS-Daten intelligent abbauen oder glätten (Polygone vereinfachen)?

Ich habe detaillierte US-County-Karten aus den TIGER LINE Datensätzen. Wie kann ich die Daten abtasten, glätten oder herabsetzen, so dass ich gerade, kantigere, weniger "lautere" Formen erhält, um die geographischen Merkmale darzustellen - in diesem Fall nur Landesgrenzen und Staatslinien, aber vielleicht auch im allgemeinen Fall? 

Die Abtastung könnte zur Renderzeit erfolgen, wenn dies effizient durchgeführt werden kann oder ein paralleler Datensatz erzeugt und gespeichert werden könnte. Ich verwende PostGIS , und die Linien sind von shp2pgsql erzeugte Mehrfach-Polylinien -, aber jede Lösung, bei der Sie eine störrische Linie nehmen und sie auf eine glattere Linie von ungefähr derselben Bedeutung für einen menschlichen Interpreter reduzieren, wäre sehr nützlich .

49
unmounted

Das Problem beim einfachen Wegwerfen von Punkten besteht darin, dass Sie die Form des ursprünglichen Polygons schnell verzerren können. Ein besserer Ansatz ist es, aus der anderen Richtung zu kommen; Beginnen Sie mit einer einfachen Näherung des Polygons und verfeinern Sie es dann in Richtung auf Ihre komplexe Form. 

Ein hervorragendes Beispiel für diesen Ansatz ist der Douglas-Puecker-Algorithmus . Sie beginnen mit zwei aus dem gesamten Polygon gezeichneten Scheitelpunkten. Fügen Sie einen dritten Scheitelpunkt hinzu, indem Sie den Scheitelpunkt auswählen, der am weitesten von einer Kante liegt, die zwischen den ersten beiden Scheitelpunkten gezeichnet wird. Fügen Sie weitere Punkte hinzu, bis Sie etwas haben, das Ihrem ursprünglichen Polygon hinreichend ähnelt.

30
ire_and_curses

Douglas-Peucker ist definitiv der richtige Ansatz. Es gibt einige einfache Möglichkeiten, auf Implementierungen davon in PostGIS und QGIS zuzugreifen, von denen ich dachte, dass ich sie hier für diejenigen hinzufügen würde, die auf diesen Beitrag mit einer ähnlichen Frage stoßen. Das Ziel ist, mit so etwas zu beginnen:

alt text

und am Ende mit so etwas:

alt text

In PostGIS ist Douglas-Peucker als simplify implementiert. Die ausführliche Syntax hier bei bostongis.org ist eine Variante von:

SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table

Dies funktionierte auch mit dem gesamten nationalen Datensatz sehr gut, mit einigen wenigen Fehlern, die auf schlechte zugrunde liegende Daten zurückzuführen zu sein scheinen. Es stellt sich auch heraus, dass in QGIS das Menüelement Tools > Geometry Tools > Simplify Geometries ein vereinfachtes Shapefile einer beliebigen Geometrie exportiert und es Ihrem aktuellen Projekt als Ebene hinzufügt.

Dies ist ein ziemlich grundlegender Werkzeugsatz, und ich habe die Frage auf einem zu niedrigen Niveau gestellt, obwohl es nett war, die zugrundeliegende Mathematik zu lernen, gibt es eine gute Erklärung dafür hier: http: //www.mappinghacks. com/code/PolyLineReduction / , zusammen mit Beispielcode, der sich als nicht allzu notwendig herausstellt!

61
unmounted

Anstelle von QGIS schlage ich vor, ogr2ogr zu verwenden, da es keine Polygone löscht !

ogr2ogr output.shp input.shp -simplify 0.0001
19
Carlos Rendon

Hier ist ein einfacher iterativer Glättungsalgorithmus:

wenn für jeden der drei aufeinanderfolgenden Punkte eines Pfads der mittlere Punkt keine Schnittpunkte hat und sich innerhalb eines kleinen Schwellenwertwinkels des direkten Pfads zwischen den beiden äußeren Punkten befindet, entfernen Sie ihn.

Wiederholen, bis zufrieden. 

8
Will

Sie können auch den Algorithmus von Visvalingam ausprobieren, der iterativ den am wenigsten wahrnehmbaren Teil einer Linie entfernt. Hier ist eine großartige Erklärung dieses Algorithmus:

7
Lars Grammel

Sie können auch Simplify.js verwenden, das eine Kombination aus Douglas-Peucker - und Radialdistanz-Algorithmen verwendet. Es gibt auch Links zu vielen Ports zu anderen Sprachen, die im github-Projekt aufgeführt sind.

4

Antwort von @unmounted ist korrekt, aber ich möchte noch einen Vorschlag hinzufügen.

Verwenden Sie immer die Funktion ST_SimplifyPreserveTopology anstelle von ST_Simplify in PostGIS. Beide verwenden den gleichen zugrunde liegenden Algorithmus (Douglas-Peucker), der erstere vermeidet jedoch Vereinfachungen, die zu ungültigen Geometrien führen würden. Beispielsweise kann ST_Simplify zu einer Geometrie führen, die sich selbst schneidet.

0
Rauni Lillemets