Mais

O que são definição, algoritmos e soluções práticas para casco côncavo?


Casco convexo

Um casco convexo de uma forma é definido como:

Em matemática, o casco convexo ou envelope convexo para um conjunto de pontos X em um espaço vetorial real V é o conjunto convexo mínimo contendo X (Wikipedia)

A Wikipedia o visualiza muito bem usando uma analogia de elástico, e existem alguns bons algoritmos para computá-lo.

Casco Côncavo

Um casco côncavo é visualizado usando a linha vermelha na imagem abaixo (a linha azul visualiza o casco convexo). Intuitivamente, é um polígono que abrange todos os pontos, mas tem menos área (mínima?) Em comparação com o casco convexo. Como resultado, o comprimento do limite do polígono é maior.

Um casco côncavo pode ser a solução para alguns problemas do mundo real (por exemplo, encontrar o limite razoável de uma cidade).

Não consegui encontrar uma definição, um algoritmo e uma solução prática adequados para a noção de um casco côncavo. O Grass Wiki tem algumas descrições e imagens, e há uma solução comercial em concavehull.com.

Quaisquer ideias, algoritmos e links?


Como scw aponta, você quer uma implementação de formas α.

As formas alfa podem ser consideradas uma generalização do casco convexo. Eles foram descritos pela primeira vez em 1981 em:

Edelsbrunner, H .; Kirkpatrick, D .; Seidel, R .; , "Sobre a forma de um conjunto de pontos no plano", Teoria da Informação, IEEE Transactions on, vol.29, no.4, pp. 551-559, Jul 1983

Existem implementações de código aberto para os ambientes nos quais você está interessado:

PostGIS

Se você estiver usando a pilha PostGIS, a extensão opcional de distância de condução do pgRouting expõe uma implementação de formato alfa. Não tenho certeza se você pode variar o parâmetro alfa, no entanto.

O uso está abaixo:

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');

Pitão

Provavelmente, há muitos módulos Python que você pode usar. Tenho ouvido coisas boas sobre CGAL, uma biblioteca de geometria computacional C ++. Wrappers do Python existem para partes do CGAL, incluindo a exposição da implementação da forma alfa do CGAL para o Python.

Esteja ciente de que partes do CGAL são licenciadas sob o QPL, o que significa que se você distribuir seu programa, vinculado ao CGAL, pode ser necessário liberá-lo sob o QPL. É bom manter seu código proprietário se você não redistribuir o código do programa ou binários.


Aqui está o que você está procurando.

Você pode baixar e testar o programa: (em java, sob licença GPL)

O artigo que apresenta o algoritmo está lá:

Duckham, M., Kulik, L., Worboys, M.F., Galton, A. (2008) Geração eficiente de polígonos simples para caracterizar a forma de um conjunto de pontos no plano. Reconhecimento de padrão v41, 3224-3236


Esta parece ser uma aplicação específica de formas alfa, que, pela minha leitura, são uma forma mais geral desse problema. R tem o módulo alphahull, que possui excelente documentação sobre como calcular formas alfa. Verifique também este histórico detalhado sobre formas alfa. Se você deseja apenas calcular cascos convexos / côncavos, verifique lasboundary, parte de lastools, ele é bem dimensionado e pode lidar com milhões de pontos de entrada.

Finalmente, esta aplicação interessante de formas alfa pelo Flickr circulou há algum tempo, mostrando sua utilidade para agregar conteúdo de pontos gerado pelo usuário:


Existe uma implementação de ST_ConcaveHull no tronco PostGIS. http://postgis.net/docs/ST_ConcaveHull.html


Criei uma ferramenta altamente eficiente, chamada fronteira (1,2), que calcula um casco côncavo para LIDAR no formato LAS / LAZ / SHP / ASCII e armazena o resultado como um polígono de contorno vetorial no formato ESRI Shapefile ou um arquivo KML georreferenciado.

Aqui está um exemplo de execução:

C:  lastools  bin> lasboundary -i SerpentMound.las -o SerpentMound_boundary.shp lendo 3265110 pontos e calculando o casco convexo para 3265110 pontos crescendo para dentro em direção ao casco côncavo (com concavidade = 50) produzindo o casco côncavo o casco côncavo tem 1639 pontos

Algumas imagens de resultado estão aqui.


Aqui está uma função R que implementa o modelo Alpha Hull. A saída é um objeto de polígono sp. Por favor, veja o exemplo no cabeçalho. Requer os pacotes sp, alphahull e maptools.

** Atualização (15/01/2018) Houve várias alterações nos objetos resultantes produzidos pelo pacote alphahull. Como tal, precisei reescrever a função. Eu adicionei uma função convexHull ao pacote spatialEco. No entanto, devido a restrições de licenciamento no pacote alphahull, essa função está disponível apenas na versão de desenvolvimento no GitHub. A versão de desenvolvimento pode ser instalada usando:

biblioteca (devtools) install_github ("jeffreyevans / spatialEco")

Aqui está um exemplo do uso de funções

biblioteca (sp) biblioteca (espacialEco) dados (meuse) coordenadas (meuse) = ~ x + y a <- convexHull (meuse, alfa = 100000) plot (a) pontos (meuse, pch = 19)

Converta o SpatialLinesDataFrame resultante em SpatialPolygonsDataFrame

biblioteca (sf) a <- sf :: st_as_sf (a) a <- sf :: st_polygonize (a) classe (a <- as (a, "Espacial")) plot (a)

Teste vários valores alfa

par (mfcol = c (2,2)) para (a em c (500, 1500, 5000, 100000)) {ch <- convexHull (meuse, alfa = a) pontos do gráfico (ch) (meuse, pch = 19) título (paste0 ("alpha =", a))}


Sobre a implementação de R Alpha-Shapes, há um artigo sobre "Convertendo Alpha-Shapes em Objetos SP"

É baseado em alphahull, sp e spgrass6 http://casoilresource.lawr.ucdavis.edu/drupal/node/919


JTS (https://github.com/locationtech/jts) fornece uma implementação Convex Hull. Martin Davies também mencionou ter um algoritmo Alpha Shape em andamento, então você pode querer verificar o repositório SVN para ver se ele já está instalado, se é isso que você deseja.


Falando sobre JTS, você pode usar Geoscript para manipular a biblioteca JTS. http://geoscriptblog.blogspot.com/2010/06/unwrapped-jts-with-python.html para um artigo sobre casco convexo. Implementações de GeoScript estão disponíveis em JavaScript, Python, Scala e Groovy. O site oficial: http://geoscript.org


Aqui está um programa escrito em C que calcula cascos convexos, formas alfa, triangulações de Delauney e volumes de Voronoi:

  • Hull - Ken Clarkson (2002)

Outro algoritmo de casca convexa com implementações C e Java está aqui:

  • Convex Hull (2D) - Computational Geometry in C, Joseph O'Rourke (1998)

Para adicionar às respostas anteriores para este post, pelo menos a partir do QGIS 2.6 tem algoritmo de casco côncavo

Parâmetros
Camada de ponto de entrada [vetor: ponto]
coloque a descrição do parâmetro aqui

Limiar (0-1, onde 1 é equivalente a Convex Hull) [número]
coloque a descrição do parâmetro aqui
Padrão: 0,3

Permitir furos [boolean]
coloque a descrição do parâmetro aqui
Padrão: Verdadeiro

Divida a geometria de várias partes em geometrias de partes únicas [booleano]
Padrão: False

Saídas casco côncavo [vetor]
coloque a descrição da saída aqui

Uso do console
processing.runalg ('qgis: concavidade', entrada, alfa, furos, no_multigeometria, saída)

Além disso, a Esri possui uma ferramenta Minimum Bounding Geometry (Data Management)

O que permite que você escolha o tipo de geometria, que inclui casco convexo


Há um novo complemento para GRASS GIS 7 disponível: v.concave.hull. Veja também http://grasswiki.osgeo.org/wiki/Create_concave_hull


Para ajudar com a parte da "definição adequada" de sua pergunta; você pode ter olhado em https://en.wikipedia.org/wiki/Convex_hull e obtido o que poderia muito bem ser considerado uma definição "adequada", mas não encontrou, então talvez uma definição mais "útil" seja:

Para cada ponto dentro de um casco convexo, uma linha reta para algum ponto fora do casco só cruzará o casco uma vez.

Isso é útil porque, dado um ponto, você pode construir uma linha através dele e testar essa linha construída cruzando os segmentos do casco.

  • Sem interseção, o ponto não está no casco.
  • Uma intersecção do ponto está no casco.
  • Duas interseções, o ponto está dentro do casco
  • Uma linha reta não pode cruzar um casco convexo mais de duas vezes


Assista o vídeo: Algoritmos Aproximativos - UFC - Reduções que preservam aproximação - Exemplos (Outubro 2021).