J'essaie de trouver un outil pour créer le squelette d'un grand ensemble de données vectorielles en utilisant QGIS et son bundle. Il doit être directement programmable par programme via Python ou la ligne de commande (QGIS, GRASS, OGR, etc. sont tous corrects).
La cible est un grand polygone mince avec des trous représentant des rues et j'ai besoin d'obtenir une approximation du réseau routier via la squelette.
Ce que j'ai trouvé jusqu'à présent:
- GRASS 7.0 a
v.skeleton
ce qui devrait être assez bon mais ne semble pas être prêt à être intégré à QGIS dans un avenir proche. - CGAL a des algorithmes squelettés, bien sûr, mais le support Python est très pauvre.
- pySkeleton ne fonctionne pas pour moi et je n'ai probablement pas le temps de récupérer le code.
D'autres alternatives (openJump skeletonizer, cet ancien plugin ArcGIS ...) ne peuvent pas être facilement connectées à QGIS / Python.
D'autres suggestions?
Réponses:
Ce document "Skeletonizing Polygons Using PostGIS" décrit un processus qui utilise des outils de PostGIS et GRASS , qui peuvent tous deux être appelables. Il mentionne l'utilisation de PostGIS pour créer un squelette des vecteurs et le nettoyer en utilisant à nouveau PostGIS ou GRASS.
Il existe des outils existants de la boîte à outils de traitement qui, espérons-le, simplifient les choses lors de l'appel à partir de Python / ligne de commande, tels que:
Importer dans PostGIS - utilisez pour importer votre jeu de données.
PostGIS exécute SQL - utilisez pour exécuter la
ST_StraightSkeleton
fonction.v.clean - utilisez pour exécuter l'
rmdangle
outil.J'espère que cela t'aides!
la source
Une option, un peu ronde, pourrait être d'utiliser le module de squelettisation de la grille de SAGA ( http://www.saga-gis.org/saga_module_doc/2.1.3/imagery_segmentation_1.html ), soit via QGIS, soit en utilisant l'
saga_cmd
utilitaire de ligne de commande . Vous devez d'abord convertir votre polygone en raster SAGA.Sinon, comme indiqué par @ Alpha-beta-soup, vous pouvez utiliser
v.skeleton
depuis GRASS sur la ligne de commande.Pour utiliser un outil de ligne de commande à partir de Python, utilisez le
subprocess
module pour passer la chaîne de commande au système.la source