Enveloppe convexe
Une coque convexe d'une forme est définie comme:
En mathématiques, l'enveloppe convexe ou l'enveloppe convexe d'un ensemble de points X dans un espace vectoriel réel V est l'ensemble convexe minimal contenant X ( Wikipedia )
Wikipedia le visualise bien en utilisant une analogie avec un élastique, et il existe de bons algorithmes pour le calculer .
Coque concave
Une coque concave est visualisée à l'aide de la ligne rouge dans l'image ci-dessous (la ligne bleue représente la coque convexe). Intuitivement, il s’agit d’un polygone qui englobe tous les points, mais a une superficie inférieure (minimale?) À celle de la coque convexe. En conséquence, la longueur de la limite du polygone est plus longue.
Une coque concave peut être la solution à certains problèmes du monde réel (par exemple, trouver la limite raisonnable d'une ville).
Je n'ai pas réussi à trouver une définition, un algorithme et une solution pratique appropriés pour la notion de coque concave. Le wiki Grass a quelques descriptions et images , et concavehull.com propose une solution commerciale .
Des idées, des algorithmes et des liens?
la source
Réponses:
Comme le fait remarquer scw , vous souhaitez une implémentation des formes α .
Les formes alpha peuvent être considérées comme une généralisation de la coque convexe. Ils ont été décrits pour la première fois en 1981 dans:
Des implémentations open source existent pour les environnements qui vous intéressent:
PostGIS
Si vous utilisez la pile PostGIS, l' extension facultative Distance de conduite de pgRouting expose une implémentation de forme alpha. Je ne sais pas si vous pouvez modifier le paramètre alpha, cependant.
L'utilisation est ci-dessous:
Python
Il y a probablement beaucoup de modules python que vous pourriez utiliser. J'ai entendu de bonnes choses à propos de CGAL , une bibliothèque de géométrie de calcul C ++. Des wrappers Python existent pour certaines parties de CGAL, notamment pour exposer l' implémentation de la forme alpha de CGAL à Python .
Sachez que certaines parties de CGAL sont sous licence QPL, ce qui signifie que si vous distribuez votre programme lié à CGAL, vous devrez peut-être le publier sous QPL. Il est bon de garder votre code propriétaire si vous ne redistribuez pas votre code de programme ou vos fichiers binaires.
la source
Voici ce que vous recherchez.
Vous pouvez télécharger et tester le programme: (en java, sous licence GPL)
Le papier présentant l'algorithme est là:
Duckham, M., Kulik, L., Worboys, MF, Galton, A. (2008). Génération efficace de polygones simples permettant de caractériser la forme d'un ensemble de points dans le plan. Pattern Recognition v41, 3224-3236
la source
Cela semble être une application spécifique des formes alpha , qui sont de ma lecture une forme plus générale de ce problème. R possède le module alphahull , qui possède une excellente documentation sur le calcul des formes alpha . Vérifiez également ce fond détaillé sur les formes alpha. Si vous voulez seulement calculer des coques convexes / concaves, jetez un œil à lasboundary , une partie de lastools , elle s’adapte bien et peut gérer des millions de points d’entrée.
Enfin, cette application intéressante de formes alpha de Flickr a fait le tour il y a quelque temps, montrant son utilité pour l'agrégation de contenu en points généré par l'utilisateur:
la source
Il y a une implémentation de ST_ConcaveHull dans le coffre PostGIS. http://postgis.net/docs/ST_ConcaveHull.html
la source
J'ai créé un outil très efficace, appelé [lasboundary] [1,2], qui calcule une coque concave pour LIDAR au format LAS / LAZ / SHP / ASCII et stocke le résultat sous la forme d'un polygone de frontière vectorielle au format ESRI Shapefile ou d'un fichier géo. fichier KML référencé.
Voici un exemple d'exécution:
Quelques images de résultats sont ici .
la source
À propos de l'implémentation de R Alpha-Shapes, il existe un article sur "Conversion des formes alpha en objets SP"
Il est basé sur alphahull, sp et spgrass6 http://casoilresource.lawr.ucdavis.edu/drupal/node/919
la source
Voici une fonction R qui implémente le modèle Alpha Hull. La sortie est un objet polygone sp. Veuillez voir l'exemple dans l'en-tête. Il nécessite les packages sp, alphahull et maptools.
** Mise à jour (01-15-2018) De nombreux changements ont été apportés aux objets résultants générés par le paquet alphahull. En tant que tel, je devais réécrire la fonction. J'ai ajouté une fonction convexHull au paquet spatialEco. Cependant, en raison de restrictions de licence dans le package alphahull, cette fonction est uniquement disponible dans la version de développement sur GitHub. La version de développement peut être installée à l'aide de:
Voici un exemple d'utilisation des fonctions
Convertissez le SpatialLinesDataFrame résultant en SpatialPolygonsDataFrame
Tester plusieurs valeurs alpha
la source
JTS ( http://tsusiatsoftware.net/jts/main.html ) fournit une implémentation Convex Hull. Martin Davies a également mentionné la mise en place d'un algorithme Alpha Shape. Vous voudrez peut-être vérifier le référentiel SVN pour voir s'il est déjà entré si c'est ce que vous voulez.
la source
En parlant de JTS, vous pouvez utiliser Geoscript pour manipuler la bibliothèque JTS. http://geoscriptblog.blogspot.com/2010/06/unwrapped-jts-with-python.html pour un article sur la coque convexe. Les implémentations GeoScript sont disponibles en JavaScript, Python, Scala et Groovy. Le site officiel: http://geoscript.org
la source
Voici un programme écrit en C qui calcule les coques convexes, les formes alpha, les triangluations de Delauney et les volumes de Voronoï:
Un autre algorithme de coque convexe avec des implémentations C et Java est ici:
la source
Pour ajouter aux réponses précédentes de ce message, au moins à partir de QGIS 2.6, un algorithme de coque concave est présent.
Esri dispose également d’un outil Géométrie de limite minimale (Gestion des données).
Ce qui vous permet de choisir le type de géométrie, qui inclut une coque convexe
la source
Un nouvel addon pour GRASS GIS 7 est disponible: v.concave.hull . Voir aussi http://grasswiki.osgeo.org/wiki/Create_concave_hull
la source
Pour aider avec la "bonne définition" partie de votre question; vous avez peut-être regardé https://en.wikipedia.org/wiki/Convex_hull et obtenu ce qui pourrait bien être considéré comme une définition "correcte", mais l'a trouvée manquante; une définition plus "utile" est peut-être:
Pour chaque point à l'intérieur d'une coque convexe, une ligne droite jusqu'à un point ne se trouvant pas à l'intérieur de la coque ne coupera la coque qu'une fois.
Ceci est utile car, à partir d'un point, vous pouvez construire une ligne à travers celle-ci et tester pour cette ligne construite les segments intersectant la coque.
la source