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


116

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 que contém X ( Wikipedia )

A Wikipedia o visualiza bem, usando uma analogia com elástico, e existem alguns bons algoritmos para calculá-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 (mínimo?) Área 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).

insira a descrição da imagem aqui

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

Alguma idéia, algoritmos e links?


Em que contexto você deseja gerar cascos côncavos / formas alfa? No PostGIS, ArcMap, um mapa da web, seu próprio software?
fmark

PostGIS e meus próprios scripts Python.
Adam Matan

Existe uma versão compatível com C ++ Linux da implementação do algoritmo do casco côncavo?
31418 Sylv255

Se você tiver uma nova pergunta, faça-o clicando no botão Fazer pergunta . Inclua um link para esta pergunta se ela ajudar a fornecer contexto. - Do comentário
Evil Genius

A Biblioteca de Algoritmos de Geometria Computacional (CGAL) é uma biblioteca C ++ com Alpha Shapes. Possui um download do Linux e é licenciado como GPL / LGPL para a versão> = 4.0.
klewis

Respostas:


57

Como aponta o scw , você deseja 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, julho de 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 Distância de direção opcional 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 existem muitos módulos python que você poderia usar. Eu ouvi coisas boas sobre CGAL , uma biblioteca de geometria computacional em C ++. Os wrappers Python existem para partes da CGAL, incluindo a exposição da implementação de forma alfa da CGAL ao Python .

Esteja ciente de que partes da CGAL são licenciadas sob a QPL, o que significa que, se você distribuir seu programa, vinculado à CGAL, poderá ser necessário liberá-lo sob a QPL. Não há problema em manter seu código de propriedade se você não redistribuir o código ou os binários do programa.


Não consigo compilar os wrappers python do CGAL - parece que eles não são suportados há um tempo e não funcionam mais com uma versão recente do CGAL.
21811 Conradlee

2
@mark: O segundo link que você postou parece estar morto.
Radek

1
ligações @fmark PostGIS parecem ser morto ..
radek


29

Essa parece ser uma aplicação específica das formas alfa , que são da minha leitura uma forma mais geral desse problema. O R possui o módulo alphahull , que possui excelente documentação sobre o cálculo de formas alfa . Verifique também este plano de fundo detalhado das formas alfa. Se você só quer calcular cascas convexas / côncavas, veja lasboundary , parte de lastools , ele escalas bem e pode lidar com milhões de pontos de entrada.

Por fim, essa interessante aplicação de formas alfabéticas do Flickr fez as rondas há um tempo, mostrando sua utilidade para agregar conteúdo pontual gerado pelo usuário:

casco alfa do texas do flickr


1
OMG a fonte é escrito em :-) Fortran
Adam Matan

Existe o pacote clustr escrito em C ++, se for melhor para você; mas tenha cuidado com o licenciamento em CGAL: github.com/straup/Clustr
ACS

2
Belo exemplo do mundo real.
davidf


19

Criei uma ferramenta altamente eficiente, chamada [lasboundary] [1,2], que calcula um casco côncavo para o LIDAR no formato LAS / LAZ / SHP / ASCII e armazena o resultado como um polígono de limite de vetor no formato ESRI Shapefile ou um geo arquivo KML com referência.

Aqui está um exemplo de execução:

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

Algumas fotos dos resultados estão aqui .



10

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 inúmeras alterações nos objetos resultantes produzidos pelo pacote alphahull. Como tal, eu precisava reescrever a função. Adicionei uma função convexHull ao pacote spatialEco. No entanto, devido a restrições de licenciamento no pacote alphahull, esta função está disponível apenas na versão de desenvolvimento no GitHub. A versão de desenvolvimento pode ser instalada usando:

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

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

library(sp)
library(spatialEco)
data(meuse)
 coordinates(meuse) = ~x+y
a <- convexHull(meuse, alpha=100000)
  plot(a)
    points(meuse, pch=19)

Converta o SpatialLinesDataFrame resultante em SpatialPolygonsDataFrame

library(sf)
a <- sf::st_as_sf(a) 
a <- sf::st_polygonize(a)
class( a <- as(a, "Spatial") )
  plot(a)

Teste vários valores alfa

par(mfcol=c(2,2))
   for (a in c(500, 1500, 5000, 100000)) {
   ch <- convexHull(meuse, alpha = a)
     plot(ch)
      points(meuse, pch=19)
        title( paste0("alpha=", a))      
   }

vários parâmetros alfa ahull


+1 Você poderia explicar como isso difere do pacote de formas alfa ?
whuber

3
A saída do objeto alphahull é armazenada como uma matriz e deve ser coagida a um objeto sp utilizável. Eu consideraria isso uma função "auxiliar" para criar um polígono que pode ser exportado para um formato GIS. Essa função usa o pacote alphahull para criar o objeto da matriz do casco, cria um objeto sp e explode o slot de polígono, tornando-o um objeto de quadro de dados de polígono de peça única. Nada está aparecendo na ajuda do pacote, mas pode haver coerção nativa implementada recentemente para um objeto de classe sp que eu não conheço. Se for esse o caso, informe-me para que eu possa desativar esta função.
21412 Jeffrey Evans

Qual é a linguagem de programação?
quer

Obrigado @JeffreyEvans Eu consegui fazer isso funcionar. Você poderia explicar os parâmetros? Dei uma olhada no artigo vinculado da jstatsoft, mas é bastante impenetrável.
Geotheory

9

O JTS ( http://tsusiatsoftware.net/jts/main.html ) fornece uma implementação de Casco Convexo. Martin Davies também mencionou ter um algoritmo Alpha Shape em andamento, portanto, talvez você queira verificar o repositório SVN para ver se ele ainda existe, se é isso que você deseja.


Ainda não há implementação côncava de formas de casco / alfa a partir de junho de 2012, até onde eu sei.
precisa saber é o seguinte

Ainda nada em Maio de 2013.
Crescent Fresh

O JTS está vivo? A última versão é de 19 de dezembro de 2006. vividsolutions.com/jts/JTSHome.htm
angelcervera

tente o link na resposta
Ian Turton

O JTS agora está no Github e é a versão 1.15 da abordagem: github.com/locationtech/jts Embora, até onde eu saiba , ainda não pareça haver uma implementação do Alpha Shapes.
Colin Woodbury


7

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

  • Casco - Ken Clarkson (2002)

Outro algoritmo de casco convexo com implementações C e Java está aqui:


7

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

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

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

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

Dividir geometria de várias partes em geometrias de peças únicas [booleano]
Padrão: False

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


Processamento de uso do console.runalg ('qgis: côncavo', entrada, alfa, buracos, no_multigeometry, saída)

Além disso, a Esri possui uma ferramenta Geometria Mínima de Limite (Gerenciamento de Dados)

O que permite escolher o tipo de geometria, que inclui casco convexo

insira a descrição da imagem aqui



3

Para ajudar com a parte de "definição adequada" da sua pergunta; você pode ter consultado https://en.wikipedia.org/wiki/Convex_hull e obtido o que poderia ser considerado uma definição "adequada", mas achou que falta, por isso talvez uma definição mais "útil" seja:

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

Isso é útil porque, dado um ponto, você pode construir uma linha através dela e testar a linha construída que cruza os segmentos do casco.

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

2
o op está perguntando sobre cascos côncavas, e não cascos convexos
Winwaed
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.