139 votos

¿Cuáles son la Definición, Algoritmos y Soluciones Prácticas para el Casco Cóncavo?

Envoltura Convexa

Una envoltura convexa de una forma se define como:

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

Wikipedia lo visualiza de manera clara utilizando una analogía de una banda de goma, y existen algunos buenos algoritmos para computarlo.

Envoltura Concava

Una envoltura concava se visualiza usando la línea roja en la imagen a continuación (la línea azul visualiza la envoltura convexa). Intuitivamente, es un polígono que abarca todos los puntos, pero tiene menos (¿mínima?) área en comparación con la envoltura convexa. Como resultado, la longitud del perímetro del polígono es mayor.

Una envoltura concava puede ser la solución para algunos problemas del mundo real (por ejemplo, encontrar el límite razonable de una ciudad).

introduce la descripción de la imagen aquí

¿Existe una definición adecuada, algoritmo y solución práctica para el concepto de una Envoltura Concava?

El Wiki de Grass tiene algunas descripciones e imágenes, y existe una solución comercial en concavehull.com.

0 votos

¿En qué contexto deseas generar conchas cóncavas/figuras alfa? ¿En PostGIS, ArcMap, un mapa web, tu propio software?

0 votos

Ambos PostGIS y mis propios scripts de Python.

0 votos

¿Existe una versión compatible con Linux de C++ de la implementación del algoritmo de casco cóncavo?

67voto

akdom Puntos 6724

Como scw señala, quieres una implementación de α-shapes.

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

Edelsbrunner, H.; Kirkpatrick, D.; Seidel, R.; , "On the shape of a set of points in the plane," Information Theory, IEEE Transactions on , vol.29, no.4, pp. 551- 559, jul 1983

Existen implementaciones de código abierto para los entornos en los que estás interesado:

PostGIS

Si estás utilizando el stack de PostGIS, la extensión opcional Driving Distance de pgRouting expone una implementación de forma alfa. Sin embargo, no estoy seguro si puedes variar el parámetro alfa.

A continuación se muestra un ejemplo de uso:

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 haya muchos módulos de Python que podrías utilizar. He escuchado cosas buenas sobre CGAL, una biblioteca de geometría computacional en C++. Existen envolturas de Python para partes de CGAL, incluida la exposición de la implementación de formas alfa de CGAL a Python.

Ten en cuenta que algunas partes de CGAL están bajo licencia QPL, lo que significa que si distribuyes tu programa vinculado a CGAL, es posible que necesites liberarlo bajo la licencia QPL. Está bien mantener tu código como propietario si no redistribuyes el código de tu programa o los binarios.

0 votos

No puedo hacer que los envoltorios de Python de CGAL se compilen---parece que no han sido compatibles durante un tiempo y ya no funcionan con una versión reciente de CGAL.

2 votos

@fmark: El segundo enlace que publicaste parece estar caído.

1 votos

@fmark Los enlaces de PostGIS parecen estar muertos.

36voto

Robert Höglund Puntos 5572

Esto parece ser una aplicación específica de formas alfa, que según mi lectura son una forma más general de este problema. R tiene el módulo alphahull, que tiene una excelente documentación sobre cómo calcular formas alfa. También puedes consultar este fondo detallado sobre formas alfa. Si solo quieres calcular envolventes convexas/concavas, echa un vistazo a lasboundary, parte de lastools, escala bien y puede manejar millones de puntos de entrada.

Finalmente, esta interesante aplicación de formas alfa por Flickr dio vueltas hace un tiempo, mostrando su utilidad para agrupar contenido de puntos generados por el usuario:

envoltura alfa de Texas de Flickr

1 votos

OMG la fuente está escrita en FORTRAN :-)

0 votos

Hay el paquete clustr escrito en C++ si eso te conviene mejor; pero ten cuidado con la licencia en CGAL: github.com/straup/Clustr

2 votos

Bonito ejemplo del mundo real.

23voto

Lars Mæhlum Puntos 4569

Hay una implementación de ST_ConcaveHull en la rama 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 bueno tenerlo como parte integral de PostGIS.

23voto

jbkkd Puntos 202

He creado 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 límite vectorial en formato de archivo ESRI Shapefile o un archivo KML georreferenciado.

Aquí hay un ejemplo de ejecución:

C:\lastools\bin>lasboundary -i SerpentMound.las -o SerpentMound_boundary.shp
leyendo 3265110 puntos y calculando casco convexo para 3265110 puntos
creciendo hacia adentro hacia el casco cóncavo (con concavidad = 50)
emitir el casco cóncavo
el casco cóncavo tiene 1639 puntos

Algunas imágenes de resultados están aquí.

11voto

Adam Ernst Puntos 6939

JTS (https://github.com/locationtech/jts) proporciona una implementación de Envoltura Convexa. Martin Davies también mencionó tener un algoritmo de Forma Alfa en proceso, por lo que tal vez quieras revisar el repositorio SVN para ver si ya está disponible si eso es lo que buscas.

0 votos

Todavía no hay ninguna implementación de casco cóncavo/formas alfa hasta junio de 2012 según lo que puedo ver.

0 votos

Todavía nada en mayo de 2013.

0 votos

¿Está JTS vivo? La última versión es de Dec 19, 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