Skelettieren Sie Vektoren in QGIS / Python

8

Ich versuche, ein Werkzeug zu finden, um mit QGIS und seinem Bundle ein Skelett eines großen Vektordatensatzes zu erstellen. Es sollte direkt programmgesteuert über Python oder die Befehlszeile aufrufbar sein (QGIS, GRASS, OGR usw. sind alle in Ordnung).

Das Ziel ist ein großes dünnes Polygon mit Löchern, die Straßenbereiche darstellen, und ich muss eine Annäherung des Straßennetzes durch Skelettierung erhalten.

Was ich bisher gefunden habe:

  • GRASS 7.0 v.skeletonsollte gut genug sein, scheint aber in naher Zukunft nicht in QGIS integriert zu sein.
  • CGAL hat natürlich Skelettierungsalgorithmen, aber die Python-Unterstützung ist sehr schlecht.
  • pySkeleton funktioniert bei mir nicht und ich habe wahrscheinlich keine Zeit, den Code zu retten.

Andere Alternativen (openJump Skeletonizer, dieses alte ArcGIS-Plugin ...) lassen sich nicht einfach in QGIS / Python einbinden .

Irgendwelche anderen Vorschläge?

Jan Šimbera
quelle
4
GRASS 7.0 ist "direkt programmgesteuert über Python oder die Befehlszeile aufrufbar". Warum muss Ihre Lösung auch so eng an QGIS gebunden sein? Und was ist mit PostGIS? Wie werden Ihre Daten gespeichert?
Alphabetasoup
2
Ich möchte die Lösung als direkt verwendbares QGIS-Plugin veröffentlichen - daher möchte ich mich an die von QGIS gebündelte GRASS-Version halten.
Jan Šimbera

Antworten:

6

Dieses Dokument „Skelettierung Polygonen PostGIS“ beschreibt ein Verfahren , das Tool von nutzt PostGIS und GRASS , von denen beide könnten aufrufbar sein. Es wird erwähnt, dass PostGIS verwendet wird, um ein Skelett der Vektoren zu erstellen und es entweder mit PostGIS erneut oder mit GRASS zu bereinigen.

Es gibt vorhandene Tools aus der Processing Toolbox, die hoffentlich das Aufrufen über Python / Befehlszeile vereinfachen, wie z.

  • In PostGIS importieren - Verwenden Sie diese Option, um Ihren Datensatz zu importieren.

  • PostGIS führt SQL aus - wird zum Ausführen der ST_StraightSkeletonFunktion verwendet.

  • v.clean - Verwenden Sie diese Option , um das rmdangleTool auszuführen .

Hoffe das hilft!

Joseph
quelle
Vielen Dank! Ich muss jedoch davon ausgehen, dass kein PostGIS installiert ist ...
Jan Šimbera
@ JanŠimbera - Herzlich willkommen Kumpel und viel Glück! Klingt nach einem sehr interessanten Problem, das Sie haben :)
Joseph
4

Eine etwas umständliche Option könnte darin bestehen, das Grid-Skeletonization-Modul von SAGA ( http://www.saga-gis.org/saga_module_doc/2.1.3/imagery_segmentation_1.html ) entweder über QGIS oder über das Befehlszeilenprogramm zu verwenden saga_cmd. Sie müssten zuerst Ihr Polygon in ein SAGA-Raster konvertieren.

Andernfalls können Sie, wie von @ Alpha-beta -oup angegeben, v.skeletonvon GRASS in der Befehlszeile aus verwenden.

Verwenden Sie das subprocessModul, um die Befehlszeichenfolge an das System zu übergeben, um ein Befehlszeilentool in Python zu verwenden.

Paulo Raposo
quelle
Danke für den Vorschlag. Ich möchte lieber nicht in Raster konvertieren, da der Umfang groß ist und ich das Ergebnis mit einer feinen Auflösung benötige. Ich denke darüber als letzten Ausweg nach.
Jan Šimbera