Frage

Ich habe US Kreis Karten detailliert, von den TIGER LINE Datensatz. Wie könnte ich, glatt probieren, oder die Daten verschlechtern, so dass ich straighter bekommen, mehr kantig, weniger „laut“ Formen der geografischen Merkmale zu repräsentieren - in diesem Fall nur Landkreisgrenzen und Staatsgrenzen, aber vielleicht auch im allgemeinen Fall?

Die Probenahme kann bei Rendering-Zeit passiert, wenn diese effizient durchgeführt werden kann, oder eine parallele Datensatz erzeugt werden könnte und gespeichert. Ich verwende PostGIS , und die Linien sind Multi-Polylinien von shp2pgsql erzeugt - aber keine Lösung, wo Sie eine nehmen Wellenlinie und reduziert es etwa gleiche Bedeutung für einen menschlichen Dolmetscher zu einer glatteren Linie wäre sehr nützlich.

War es hilfreich?

Lösung

Das Problem mit einfach Punkten Wegwerfen ist, dass man schnell die Form des ursprünglichen Polygon verzerren kann. Ein besserer Ansatz ist es aus der anderen Richtung zu kommen; mit einer grundlegenden Annäherung des Polygons beginnen und es dann nach oben in Richtung Ihrer komplexe Form verfeinern.

Ein hervorragendes Beispiel für diesen Ansatz ist der Douglas-Puecker Algorithmus . Sie beginnen mit zwei aus dem vollen Polygon gezeichnet Eckpunkte. Hinzufügen eines dritten Eckpunkt durch die eine Auswahl, die am weitesten von einer Kante zwischen den ersten beiden Vertices gezogen liegt. Fügen Sie weitere Punkte, bis Sie etwas haben, das ausreichend ursprünglichen Polygon ähnelt.

Andere Tipps

Douglas-Peucker ist auf jeden Fall der richtige Ansatz. Es gibt einige einfache Möglichkeiten, Implementierungen davon in PostGIS zuzugreifen und QGIS, dass ich dachte, dass ich für die hier möchte hinzufügen, die mit einer ähnlichen Frage in diesem Beitrag kommen. Das Ziel ist, mit so etwas zu starten:

alt text

und am Ende mit etwas wie folgt aus:

alt text

In PostGIS Douglas-Peucker als simplify implementiert, die Syntax, detaillierten hier bei bostongis.org , ist eine Variante von:

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

Das funktionierte sehr gut, auch auf dem vollen nationalen Datensatz mit einigen wenigen Fehlern, die zu schlechten zugrunde liegenden Daten aufgrund scheinen. Es stellt sich auch heraus, dass in QGIS der Menüpunkt Tools > Geometry Tools > Simplify Geometries eine vereinfachtes Shape-Datei beliebiger Geometrie exportieren und sie als Schicht auf Ihr aktuelles Projekt hinzuzufügen.

Dies ist eine ziemlich grundlegende Werkzeug-Set und ich stellte die Frage bei einer zu niedrigen Niveau, obwohl es schön war die zugrundeliegende Mathematik zu lernen, gibt es eine gute Erklärung, dass

Statt QGIS, ich schlage vor, mit ogr2ogr weil es nicht Polygone nicht löschen!

ogr2ogr output.shp input.shp -simplify 0.0001

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 abnehmen.

Wiederholen, bis zufrieden.

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

Sie können auch verwenden Simplify.js , die eine Kombination von Douglas-Peucker und Radial Entfernung Algorithmen. Es gibt auch Links zu vielen Häfen in anderen Sprachen wurden an dem GitHub Projekt

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

Immer Funktion ST_SimplifyPreserveTopology statt ST_Simplify in PostGIS verwenden. Beide verwenden den gleichen zugrunde liegenden Algorithmus (Douglas-Peucker), aber die ehemaligen vermeidet Vereinfachungen, die in einem ungültigen Geometrien führen würden. Zum Beispiel selbst schneidet in der Geometrie führen, die ST_Simplify kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top