Casco convexo
Un casco convexo de una forma se define como:
En matemáticas, el casco convexo o envoltura convexa para un conjunto de puntos X en un espacio vectorial real V es el conjunto convexo mínimo que contiene X ( Wikipedia )
Wikipedia lo visualiza muy bien usando una analogía de banda elástica, y hay algunos buenos algoritmos para calcularlo .
Casco Cóncavo
Se visualiza un casco cóncavo utilizando la línea roja en la imagen a continuación (la línea azul visualiza el casco convexo). Intuitivamente, es un polígono que abarca todos los puntos, pero tiene menos (¿mínimo?) Área en comparación con el casco convexo. Como resultado, la longitud del límite del polígono es más larga.
Un casco cóncavo puede ser la solución para algunos problemas del mundo real (por ejemplo, encontrar el límite razonable de una ciudad).
No he podido encontrar una definición adecuada, un algoritmo y una solución práctica para la noción de un casco cóncavo. El Wiki hierba tiene algunas descripciones e imágenes , y no hay una solución comercial en concavehull.com .
¿Alguna idea, algoritmos y enlaces?
fuente
Respuestas:
Como señala scw , desea una implementación de formas α .
Las formas alfa se pueden considerar una generalización del casco convexo. Se describieron por primera vez en 1981 en:
Existen implementaciones de código abierto para los entornos que le interesan:
PostGIS
Si está utilizando la pila PostGIS, la extensión opcional de Distancia de conducción de pgRouting expone una implementación de forma alfa. Sin embargo, no estoy seguro de si puede variar el parámetro alfa.
El uso está debajo:
Pitón
Probablemente hay muchos módulos de Python que podría usar. He escuchado cosas buenas sobre CGAL , una biblioteca de geometría computacional de C ++. Existen envoltorios de Python para partes de CGAL, incluida la exposición de la implementación de forma alfa de CGAL a Python .
Tenga en cuenta que algunas partes de CGAL tienen licencia bajo QPL, lo que significa que si distribuye su programa, vinculado a CGAL, es posible que deba liberarlo bajo QPL. Está bien mantener su código de propiedad si no redistribuye su código de programa o binarios.
fuente
Esto es lo que estás buscando.
Puede descargar y probar el programa: (en Java, bajo licencia GPL)
El documento que presenta el algoritmo está ahí:
Duckham, M., Kulik, L., Worboys, MF, Galton, A. (2008) Generación eficiente de polígonos simples para caracterizar la forma de un conjunto de puntos en el plano. Reconocimiento de patrones v41, 3224-3236
fuente
Esta parece ser una aplicación específica de formas alfa , que son, desde mi lectura, una forma más general de este problema. R tiene el módulo alphahull , que tiene una excelente documentación sobre el cálculo de formas alfa . También revise este fondo detallado sobre formas alfa. Si solo desea calcular cascos convexos / cóncavos, vea el límite de las láminas , parte de lastools , se escala bien y puede manejar millones de puntos de entrada.
Finalmente, esta interesante aplicación de formas alfa de Flickr hizo un recorrido hace un tiempo, mostrando su utilidad para agregar contenido de puntos generado por el usuario:
fuente
Hay una implementación de ST_ConcaveHull en el tronco PostGIS. http://postgis.net/docs/ST_ConcaveHull.html
fuente
Creé una herramienta altamente eficiente, llamada [lasboundary] [1,2], que calcula un casco cóncavo para LIDAR en formato LAS / LAZ / SHP / ASCII y almacena el resultado como un polígono de contorno vectorial en formato ESRI Shapefile o un geo de archivo KML referenciado.
Aquí hay un ejemplo de ejecución:
Algunas fotos de resultados están aquí .
fuente
Acerca de las formas alfa de la implementación R, hay un artículo sobre "Convertir formas alfa en objetos SP"
Está basado en alphahull, sp y spgrass6 http://casoilresource.lawr.ucdavis.edu/drupal/node/919
fuente
Aquí hay una función R que implementa el modelo Alpha Hull. La salida es un objeto de polígono sp. Por favor vea el ejemplo en el encabezado. Requiere los paquetes sp, alphahull y maptools.
** Actualización (15-01-2018) Se han producido numerosos cambios en los objetos resultantes producidos por el paquete alphahull. Como tal, necesitaba reescribir la función. Agregué una función convexHull al paquete spatialEco. Sin embargo, debido a restricciones de licencia en el paquete alphahull, esta función solo está disponible en la versión de desarrollo en GitHub. La versión de desarrollo se puede instalar usando:
Aquí hay un ejemplo del uso de funciones
Convierta el SpatialLinesDataFrame resultante en SpatialPolygonsDataFrame
Probar múltiples valores alfa
fuente
JTS ( http://tsusiatsoftware.net/jts/main.html ) proporciona una implementación de casco convexo. Martin Davies también mencionó que se está trabajando en un algoritmo de forma alfa, por lo que es posible que desee verificar el repositorio SVN para ver si todavía está dentro, si eso es lo que desea.
fuente
Hablando de JTS, puede usar Geoscript para manipular la biblioteca JTS. http://geoscriptblog.blogspot.com/2010/06/unwrapped-jts-with-python.html para un artículo sobre el casco convexo. Las implementaciones de GeoScript están disponibles en JavaScript, Python, Scala y Groovy. El sitio web oficial: http://geoscript.org
fuente
Aquí hay un programa escrito en C que calcula cascos convexos, formas alfa, triangulaciones de Delauney y volúmenes de Voronoi:
Otro algoritmo de casco convexo con implementaciones C y Java está aquí:
fuente
Para agregar a las respuestas anteriores para esta publicación, al menos a partir de QGIS 2.6 tiene un algoritmo de casco cóncavo
Además, Esri tiene una herramienta Geometría de límite mínimo (gestión de datos)
Lo que le permite elegir el tipo de geometría, que incluye el casco convexo
fuente
Hay un nuevo complemento para GRASS GIS 7 disponible: v.concave.hull . Ver también http://grasswiki.osgeo.org/wiki/Create_concave_hull
fuente
Para ayudar con la parte de "definición adecuada" de su pregunta; es posible que haya mirado https://en.wikipedia.org/wiki/Convex_hull y haya obtenido lo que bien podría considerarse una definición "adecuada", pero la encontró faltante, por lo que quizás una definición más "útil" sea:
Para cada punto dentro de un casco convexo, una línea recta a cualquier punto que no esté dentro del casco solo se cruza con el casco una vez.
Esto es útil porque dado un punto puede construir una línea a través de él y probar esa línea construida que intersecta segmentos del casco.
fuente