Eu tenho uma tabela PostGIS com alguns polígonos (armazenados usando o tipo de dados geography). Eles representam regiões em uma terra esférica.
Para cada par de vértices escolhido entre todos os polígonos, quero calcular se esses dois vértices são "visíveis" um para o outro. (Existem n * ( n -1) / 2 desses pares, em que n é o número total de vértices únicos em todos os polígonos da tabela.) Por "visível um ao outro", quero dizer que o caminho do grande círculo entre o dois vértices não cruzam nenhum dos polígonos da tabela.
Qual é a maneira mais rápida de fazer esse cálculo, preferencialmente no PostgreSQL / PostGIS?
Eu tenho algo que funciona, mas é lento. Eu ingenuamente itero sobre todos os pares e vejo se o LineString entre eles cruza algum polígono. (O tipo de dados geográficos do PostGIS lida com toda a matemática difícil da esfera para mim.) Então, eu me pergunto se existe uma estrutura de dados ou algoritmo inteligente que possa acelerar as coisas.
Respostas:
Deduzir o que não é visível. Suponha que você esteja em um vértice na praia, olhando para dois vértices remotos de um polígono vizinho. Então você pode assumir que qualquer vértice em todo o setor por trás desses vértices é invisível a partir desse vértice.
fonte