139 votos

¿Cuál es la definición, los algoritmos y las soluciones prácticas para el casco cóncavo?

Casco convexo

Un casco convexo de una forma se define como:

En matemáticas, el casco convexo o la envoltura convexa de un conjunto de puntos X en un espacio vectorial real V es el conjunto convexo mínimo que contiene a X ( Wikipedia )

Wikipedia lo visualiza muy bien utilizando una analogía con una banda elástica, y hay algunos buenos algoritmos para calcularlo .

Casco cóncavo

Un casco cóncavo se visualiza mediante la línea roja de la imagen inferior (la línea azul visualiza el casco convexo). Intuitivamente, se trata de un polígono que abarca todos los puntos, pero que tiene un área menor (¿mínima?) en comparación con el casco convexo. En consecuencia, la longitud del límite del polígono es mayor.

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

enter image description here

No he conseguido encontrar una definición adecuada, un algoritmo y una solución práctica para la noción de casco cóncavo. El Grass Wiki tiene algunas descripciones e imágenes y existe una solución comercial en concavehull.com .

¿Alguna idea, algoritmos y enlaces?

0 votos

¿En qué contexto quieres generar cascos cóncavos/formas alfa? ¿En PostGIS, ArcMap, un mapa web, su propio software?

0 votos

Tanto PostGIS como mis propios scripts de Python.

0 votos

¿Existe una versión de C++ compatible con Linux que implemente el algoritmo del casco cóncavo?

67voto

akdom Puntos 6724

Como scw señala se desea una implementación de Formas α .

Las formas alfa pueden considerarse una generalización del casco convexo. Se describieron por primera vez en 1981 en:

Edelsbrunner, H.; Kirkpatrick, D.; Seidel, R.; , "Sobre la forma de un conjunto de puntos en el plano", Information Theory, IEEE Transactions on , vol.29, no.4, pp. 551- 559, Jul 1983

Existen implementaciones de código abierto para los entornos que le interesan:

PostGIS

Si está utilizando la pila PostGIS, pgRouting de la empresa, que es opcional Ampliación de la distancia de conducción expone una implementación de la forma alfa. Sin embargo, no estoy seguro de si se puede variar el parámetro alfa.

El uso es el siguiente:

SELECT the_geom AS alpha_shape 
FROM 
  points_as_polygon(
    'SELECT id, ST_X(your_geom) AS x, ST_Y(your_geom) AS y FROM your_table');

Python

Probablemente hay muchos módulos de python que podrías utilizar. He oído hablar bien de CGAL una biblioteca de geometría computacional en C++. Envoltorios de Python existen para partes de CGAL, incluyendo la exposición de los implementación de la forma alfa a Python .

Ten en cuenta que partes de CGAL están licenciadas bajo la QPL, lo que significa que si distribuyes tu programa, enlazado a CGAL, puedes necesitar liberarlo bajo la QPL. Está bien mantener su código propietario si no redistribuye su código de programa o binarios.

0 votos

No consigo compilar las envolturas python de CGAL---parece que hace tiempo que no se soportan y ya no funcionan con una versión reciente de CGAL.

2 votos

@fmark: El segundo enlace que has puesto parece estar muerto.

1 votos

@fmark Los enlaces PostGIS parecen estar muertos..

36voto

Robert Höglund Puntos 5572

Esto parece ser una aplicación específica de formas alfa que son, según mi lectura, una forma más general de este problema. R tiene el módulo alphahull que tiene excelente documentación sobre el cálculo de las formas alfa . También puedes ver esto antecedentes detallados en las formas alfa. Si sólo quiere calcular cascos convexos/cóncavos, consulte lasboundary , parte de lastools Se adapta bien y puede manejar millones de puntos de entrada.

Por último, este interesante aplicación de las formas alfa por Flickr se han dado a conocer hace un tiempo, mostrando su utilidad para la agregación de contenidos puntuales generados por los usuarios:

alpha hull of texas from flickr

1 votos

OMG el código fuente está escrito en FORTRAN :-)

0 votos

Existe el paquete clustr escrito en C++, si te conviene más; pero ten cuidado con las licencias de CGAL: github.com/straup/Clustr

2 votos

Buen ejemplo del mundo real.

23voto

Lars Mæhlum Puntos 4569

Hay una implementación de ST_ConcaveHull en el trunk de PostGIS. http://postgis.net/docs/ST_ConcaveHull.html

1 votos

Creo que esto aparece por primera vez en la versión 2.0 de PostGis

0 votos

¡Fantástico! Muy agradable tenerlo como parte integrante de PostGIS.

23voto

jbkkd Puntos 202

He creado una herramienta muy eficaz, 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 límites vectoriales en formato ESRI Shapefile o un archivo KML georreferenciado.

Este es un ejemplo de ejecución:

C:\lastools\bin>lasboundary -i SerpentMound.las -o SerpentMound_boundary.shp
reading 3265110 points and computing convex hull for 3265110 points
growing inward towards concave hull (with concavity = 50)
outputting the concave hull
concave hull has 1639 points

Algunas imágenes de los resultados son aquí .

11voto

Adam Ernst Puntos 6939

STC ( https://github.com/locationtech/jts ) proporciona una implementación de Convex Hull. Martin Davies también mencionó que tiene un algoritmo de forma alfa en las obras, por lo que es posible que desee comprobar el repositorio SVN para ver si está en todavía si eso es lo que quieres.

0 votos

Todavía no hay casco cóncavo / alfa formas de aplicación a partir de junio de 2012 por lo que yo puedo decir.

0 votos

Todavía nada en mayo de 2013.

0 votos

¿Está vivo el STC? La última versión es del 19 de diciembre de 2006. vividsolutions.com/jts/JTSHome.htm

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X