2009-12-04 20 views
49

Ich habe detaillierte US-Landkarten, von den TIGER LINE Datensätzen. Wie kann ich die Daten abtasten, glätten oder verschlechtern, so dass ich geradere, kantigere, weniger "verrauschte" Formen erhält, um die geographischen Merkmale darzustellen - in diesem Fall nur Kreisgrenzen und Staatsgrenzen, aber vielleicht auch im allgemeinen Fall?GIS-Daten intelligent degradieren oder glätten (Polygone vereinfachen)?

Die Abtastung kann zur Renderzeit erfolgen, wenn dies effizient durchgeführt werden kann oder ein paralleler Datensatz generiert und gespeichert werden kann. Ich benutze PostGIS, und die Linien sind Multi-Polylinien von shp2pgsql generiert - aber jede Lösung, wo Sie eine schlangenartige Linie nehmen und es auf eine glattere Linie von etwa der gleichen Bedeutung für einen menschlichen Interpreter reduzieren würde sehr nützlich sein.

Antwort

29

Das Problem beim einfachen Wegwerfen von Punkten ist, 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 Grundannäherung des Polygons und verfeinern Sie es dann nach oben zu Ihrer komplexen Form.

Ein hervorragendes Beispiel für diesen Ansatz ist die Douglas-Puecker algorithm. Sie beginnen mit zwei Scheitelpunkten, die vom gesamten Polygon gezeichnet werden. Fügen Sie einen dritten Eckpunkt hinzu, indem Sie den Knoten auswählen, der am weitesten von einer zwischen den ersten beiden Eckpunkten gezeichneten Kante entfernt liegt. Fügen Sie weitere Punkte hinzu, bis Sie etwas haben, das Ihrem ursprünglichen Polygon entspricht.

8

Hier ist ein einfacher iterativer Glättungsalgorithmus:

für jeweils drei aufeinanderfolgende Punkte auf jedem Pfad, wenn der mittlere Punkt keine Kreuzungen und ist innerhalb von einigen kleinen Schwellenwinkeln des direkten Weges zwischen den beiden äußeren Punkten, es entfernen .

Wiederholen bis zufrieden.

58

Douglas-Peucker ist definitiv der richtige Ansatz. Es gibt einige einfache Möglichkeiten, um 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 starten:

alt text

und am Ende mit etwas wie folgt aus:

alt text

In PostGIS Douglas-Peucker implementiert als simplify, die Syntax, detaillierte here at bostongis.org, ist eine Variante von:

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

Dies funktionierte sogar auf dem vollständigen 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 der Menüpunkt Tools > Geometry Tools > Simplify Geometries ein vereinfachtes Shapefile beliebiger Geometrie exportiert und als Layer zu Ihrem aktuellen Projekt hinzugefügt wird.

Dies ist ein ziemlich grundlegendes Tool-Set und ich fragte die Frage auf einem zu niedrigen Niveau, obwohl es schön war, die zugrunde liegende Mathematik zu lernen, gibt es eine gute Erklärung der , zusammen mit Beispielcode, der sich nicht ergibt zu notwendig sein!

+5

Nizza aufgeführt sind. Gibt es eine Möglichkeit, dies zu tun, während gemeinsame Kanten mit anderen Polygonen beibehalten werden? z.B. vereinfachte länder in europa mit gemeinsamen grenzen. – naught101

+0

andere Polygon-Generalisierungsoptionen mit QGIS unter [Glätten/Generalisieren eines Polygons in qgis] (http://gis.stackexchange.com/questions/25914/how-to-smooth-generalize-a-polygon-in-qgis) auf Schwester GIS-SE Website. –

+2

cool, aber wie mehrere Polygone behandeln, wenn sie nebeneinander sind? Wie wenn Sie Shapes verschiedener Postleitzahlenbereiche haben? – Gerwald

7

Sie könnten auch Visvalingam Algorithmus, versuchen Sie, die iterativ die geringste wahrnehmbare Teil einer Linie entfernt.Hier ist eine große Erklärung dieses Algorithmus:

17

Statt QGIS, ich schlage vor, mit ogr2ogr weil es does not delete polygons!

ogr2ogr output.shp input.shp -simplify 0.0001 
+3

Sind die Einheiten zur Vereinfachung der Einheiten der Projektion? Zum Beispiel vielleicht sind das Lat oder Long Grad? –

+0

Es scheint, dass die Einheiten tatsächlich die Einheiten sind, die für die Koordinaten in der Datei verwendet werden. –

4

Sie könnten auch Simplify.js verwenden, die eine Kombination von Douglas-Peucker und Radial Entfernung Algorithmen verwendet. Es gibt auch Links zu vielen Häfen zu anderen Sprachen, die auf der github project