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).
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?
fonte
Respostas:
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:
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:
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.
fonte
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, MF, Galton, A. (2008) Geração eficiente de polígonos simples para caracterizar a forma de um conjunto de pontos no plano. Reconhecimento de padrões v41, 3224-3236
fonte
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:
fonte
Há uma implementação de ST_ConcaveHull no tronco PostGIS. http://postgis.net/docs/ST_ConcaveHull.html
fonte
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:
Algumas fotos dos resultados estão aqui .
fonte
Sobre a implementação do Alpha-Shapes, há um artigo sobre "Convertendo o Alpha-Shapes em objetos SP"
É baseado em alphahull, sp e spgrass6 http://casoilresource.lawr.ucdavis.edu/drupal/node/919
fonte
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:
Aqui está um exemplo do uso de funções
Converta o SpatialLinesDataFrame resultante em SpatialPolygonsDataFrame
Teste vários valores alfa
fonte
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.
fonte
Falando sobre JTS, você pode usar o Geoscript para manipular a biblioteca JTS. http://geoscriptblog.blogspot.com/2010/06/unwrapped-jts-with-python.html para obter um artigo sobre casco convexo. As implementações do GeoScript estão disponíveis em JavaScript, Python, Scala e Groovy. O site oficial: http://geoscript.org
fonte
Aqui está um programa escrito em C que calcula cascos convexos, formas alfa, triangluações de Delauney e volumes de Voronoi:
Outro algoritmo de casco convexo com implementações C e Java está aqui:
fonte
Para adicionar respostas anteriores a este post, pelo menos a partir do QGIS 2.6 possui algoritmo de casco côncavo
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
fonte
Existe um novo complemento para o GRASS GIS 7 disponível: v.concave.hull . Veja também http://grasswiki.osgeo.org/wiki/Create_concave_hull
fonte
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.
fonte