Algoritmo de interseção que manipula corretamente o meridiano de 180 ° e os pólos?

9

Existe um algoritmo de interseção conhecido que lida corretamente com 180 meridianos e polos?

Por exemplo, digamos que tenhamos uma lista de valores de latitude e longitude que representam a Antártica. Digamos que também temos um polígono simples que representa um avião. Queremos saber se o avião está sobre a Antártica.

A interseção de polígono 2D genérico não funciona nesse caso se você simplesmente usar a latitude para ye longitude para x, porque o sistema de coordenadas planas terá arestas nas longitudes -180 e 180 e latitude -90 e 90. A Antártica sairá da página em três das bordas.

Sean
fonte

Respostas:

14

O SIG (como um campo) não está muito quente quando se trata de realmente lidar com a superfície do globo.

Por exemplo, seu problema não está totalmente definido. Ao contrário do 2D, onde sabemos que as arestas de um polígono são compostas de linhas retas, o que elas estão no globo? Arcos de grandes círculos, minimizando a distância entre vértices, são uma boa escolha, mas não o único. Linhas retas (que assim viajam abaixo da superfície do globo) são outra opção, por exemplo. (Linhas Rhumb também são uma escolha, mas potencialmente uma opção idiota, especialmente perto dos postes ...) Aqui está um ótimo link para questões de interpretação de bordas do WRT: http://blog.opengeo.org/2010/08/10/shape-of -a-polygon /

Outro grande problema com a abordagem de projeto para 2d e depois se cruzar, além das singularidades que outros mencionaram, é que qualquer ponto de interseção recém-criado (onde as bordas dos polígonos se cruzam) ficará fora do lugar e dependerá da projeção usada. (Acredito que é daí que a recomendação para densificação vem: Ao adicionar uma tonelada de vértices intermediários, você obtém um erro reduzido da projeção no meio das bordas dos polígonos.)

Supondo que você não queira fazer todos os compromissos e soluções alternativas da projeção para 2D e esteja procurando pensar e codificar alguma coisa, criei um pouco de código de protótipo (e somente protótipo!) Para um cliente que lide com isso.

Aqui está um esboço da abordagem. Você precisará saber o que é um vetor , bem como o significado dos produtos de ponto e cruz . (Advertência: a wikipedia é conveniente para links rápidos, mas suficiente se for a sua primeira introdução aos tópicos. Um bom tutorial em gráficos 3D ajudará.)

  • Represente um ponto na esfera por um vetor 3D cartesiano unitário. O ponto na superfície da Terra é onde, se você estender o vetor para um raio infinitamente longo, ele cruzaria a superfície da Terra.
  • Represente grandes círculos por um avião através da origem. (Em 3D, um único vetor de unidade é suficiente para definir um plano através da origem; é o normal para o plano.) O grande círculo é a interseção de todo o plano com a superfície da Terra.
  • Você pode encontrar os pontos de interseção de dois grandes círculos cruzando seus dois planos.
  • Defina um arco de um grande círculo em dois pontos. O vetor que define o grande círculo normal é o produto cruzado dos vetores dos pontos inicial e final.
  • Para determinar se um ponto que sabemos estar no grande círculo está dentro do arco, crie dois planos, tais como: eles são perpendiculares ao plano do grande círculo, um contém o ponto inicial e o outro contém o ponto final, e eles são orientados de frente um para o outro. Então o ponto está no arco, se estiver no 'interior' dos dois planos. (Para ajudar a visualizar: você criou o sorriso de pac-man quando ele mastiga o arco. Se o ponto de teste está entre suas mandíbulas, ele fica no arco, como já sabemos que está no grande círculo.)
  • Para determinar se dois arcos se cruzam: encontre os dois pontos de interseção dos seus grandes círculos correspondentes e teste cada ponto para ver se está dentro dos dois arcos.
  • Uma definição menos ambígua: um polígono é uma coleção de pontos, cada um dos quais conectado por arestas que consistem em arcos de grandes círculos. Os pontos são ordenados de forma que, se você caminhar ao longo da superfície da Terra ao longo das bordas do polígono, o 'interior' do polígono estará à sua esquerda. Vamos deixar polígonos complexos (ilhas, buracos e auto-interseções) fora dele por enquanto.
  • Você pode dizer se um ponto está no lado direito ou esquerdo de um plano através do sinal do produto pontual de seus vetores correspondentes. (Isso é equivalente a, à medida que você viaja pelo grande círculo, se o ponto na superfície da esfera está à sua esquerda ou à sua direita.)
  • Um teste preciso para determinar se um ponto está dentro de um polígono: Ele fica no lado esquerdo de todas as arestas?
  • Agora temos a capacidade de testar se um ponto está dentro de um polígono e determinar passagens de arestas: os ingredientes para interseções polígono-polígono! A margem deste comentário é muito pequena para escrever um algoritmo completo, mas as etapas básicas são: (a) encontrar todas as interseções e, em seguida, (b) caminhar pelas arestas, alternando em qual polígono você está andando ao encontrar pontos de interseção.
  • Quando todas as opções acima estiverem funcionando, comece a pensar em estratégias de indexação para torná-las mais rápidas, pois os contornos do ponto no polígono I são O (n) no número de arestas e a interseção do polígono O (m * n) no número de arestas.

Pheew.

Há algumas grandes vantagens nessa abordagem: Todas as operações acima se resumem apenas a multiplicações e adições. (Após a conversão de dados para esta representação: por exemplo, coordenadas lat / long requerem alguns trig para obter um vetor cartesiano XYZ.) Não há singularidades nos pólos ou no sistema de coordenadas e não há muitos casos especiais com os quais se preocupar (exemplo caso especial : arestas sobrepostas paralelas).

Observando o código, parece que o pacote Spheres que alguém vinculou segue alguma dessa abordagem, embora também pareça um pouco incompleta.

O PostGIS também pode usar uma abordagem semelhante sobre seu tipo de dados geográficos , mas eu não olhei por baixo do capô. Eu sei que, para indexação espacial, pelo menos, eles usam uma árvore R sobre cartesiana 3D.

(Nota: essa resposta se tornou longa o suficiente para que eu provavelmente vá editar em uma postagem de blog ... Feedback / comentários muito bem-vindos!)

Dan S.
fonte
5

Na verdade, estou procurando uma solução geral que funcione para muitos polígonos grandes.

A maioria das respostas que li até agora concentra-se naturalmente em encontrar uma projeção adequada para seus recursos. Isso pode ser contra-intuitivo, mas aqui você precisa considerar onde uma projeção falha em funcionar, não onde funciona bem.

Algumas projeções não funcionam apenas em um ponto: elas estão entre as chamadas projeções "globais". Um bom exemplo é o equidistante azimutal: o único ponto que você não pode projetar é o diametralmente oposto ao seu ponto de origem. (Na verdade, não é estritamente verdade que você não pode projetar esse último ponto; estou discutindo uma questão técnica. Basta que a projeção tenha problemas graves no pólo oposto.)

Portanto, se você puder encontrar um único ponto P fora da união de todos os polígonos com os quais planeja trabalhar, tudo o que você precisa fazer é trabalhar dentro de uma projeção global que falhe apenas nesse único ponto. ( Por exemplo , use um azimutal equidistante oblíquo centrado no ponto diametralmente oposto a P. )

(Você pode encontrar esse ponto automaticamente. Por exemplo, crie um polígono que cubra a terra, armazene um pouco a união de todos os seus recursos, remova esse buffer do polígono da terra e selecione qualquer ponto arbitrário no restante. O motivo do armazenamento em buffer é que é melhor ficar longe dos pontos singulares onde uma projeção falha, quanto mais melhor: é uma questão de precisão computacional.)

Existem muitas projeções globais com propriedades desejáveis, incluindo equidistantes, conformes ( por exemplo , estereográficas) e áreas iguais. Portanto, escolher uma projeção global para sua análise não é uma limitação grave.

A principal limitação é que o software mais popular disponível no mercado, o ArcGIS, não suporta muitas versões oblíquas de projeções globais! :-(

whuber
fonte
3

Você pode resolver isso com projeções!

Só porque os "fins" das escalas estão em -180 e +180, não significa que você precise considerar o mapa com esses fins.

Use EPSG: 32761 ( http://spatialreference.org/ref/epsg/32761/ )

Converta seus valores de latitude e longitude em coordenadas no espaço do no-break e, em seguida, você poderá usar cálculos regulares de geometria para determinar se o seu avião está sobre a Antártica.

Mais informações sobre o sistema de coordenadas estereográficas da Universal Polar estão disponíveis em: http://en.wikipedia.org/wiki/Universal_Polar_Stereographic_coordinate_system

Se você está apenas tentando determinar um algoritmo de interseção para polígonos gigantes, trate a Terra como um esferóide (ou mesmo uma esfera) e use a geometria esférica para analisar seus polígonos.

Eu encontrei uma biblioteca chamada Spheres que é GPL, para que você pudesse revisar seu código para ver exatamente quais algoritmos eles usam para interseção de arco e "pontos dentro de um polígono esférico".

No entanto, quando você deseja desenhar esses polígonos em uma superfície plana (como papel ou tela), será necessário escolher uma projeção , ou pelo menos um estilo de projeção.

mwalker
fonte
Mas como eu determinaria qual projeção usar? Concordo que, no caso específico da Antártica, você pode usar o UPS, mas e se você tiver algum polígono abreviado que atravessa os hemisférios? Talvez um exemplo melhor do que a Antartica seja um polígono que representa onde atualmente há luz do dia.
29710 Sean
"Escolher a projeção correta" provavelmente seria um ótimo tópico para wiki da comunidade. Geralmente, depois de escolher uma projeção, é porque você já chegou a um caso específico. Se você não sabe onde está o seu polígono, meu conselho é transformar a origem da Terra no centro do seu polígono e, em seguida, usar as coordenadas cartesianas.
mwalker
Estou procurando uma solução geral que funcione com muitos polígonos grandes. Se eu precisar usar uma projeção personalizada para cada polígono, parece que o desempenho seria lento.
Sean
1

Embora haja problemas com o uso de coordenadas cartesianas, não vejo o problema no exemplo que você forneceu. Aqui está o que parece para mim, com um polígono cobrindo a Antártica limitado pelas bordas do espaço de coordenadas:

Antártica
(fonte: geohack.net )

A interseção entre o plano e o continente pode ser calculada com segurança sem a realização de transformações complexas.

scw
fonte
De fato, isso funcionará e você não precisará converter para uma projeção diferente. Você só precisa fechar o polígono "Antártica" ao longo das três arestas que cruza. Eu também usaria o centróide do polígono do avião, pois é mais simples determinar se um ponto está dentro de um polígono do que fazer uma interseção de polígonos.
mwalker
Não gosto muito dessa abordagem. Distorções pesadas ocorrerão e a interseção poderá resultar verdadeira, enquanto não estiver.
George Silva
Não consigo pensar em um par de casos em que se projetam esta seria importa, como calcular grandes distâncias de círculo, ou computação área perto dos pólos. Talvez esteja faltando alguma coisa, mas não vejo como o cruzamento solicitado aqui mudaria nessas condições.
scw 29/07
Eu acho que o exemplo do avião não foi perfeito; um exemplo melhor pode ser uma nuvem grande.
29510 Sean
Na verdade, scw, você está correto. Para análise de pontos, isso não importaria, apenas para cálculos de distância e área. Meu erro: P
George Silva
0

Uma solução para esse problema é usar algum tipo de sistema de coordenadas tridimensionais para a Terra, em vez de um sistema de coordenadas bidimensional. Se os polígonos 2D receberem uma grande quantidade virtual de profundidade, como na metade do caminho para o centro da Terra, os polígonos não precisarão ser modelados como curvas na superfície da Terra. Deve ser suficiente apenas para os vértices estarem na superfície.

Sean
fonte
0

Uma solução possível é cortar o polígono em sub-polígonos em todas as bordas (180 meridianos e pólos). O software pode até manter algum tipo de referência entre o polígono original e os sub-polígonos.

Sean
fonte
0

Pegue o centróide do avião e use-o como ponto de tangência para uma projeção azimutal . Você também precisaria densificar as geometrias antes de projetá-las para casos como a área da Terra que atualmente vê a luz do dia.

Kirk Kuykendall
fonte
Isso parece caro. E se eu tiver muitos aviões, ou pior, nuvens? Por favor, explique também o que se entende por "densificar"?
21710 Sean
Sim, seria caro. Para fazer isso globalmente, talvez o plano não seja o caminho a seguir, afinal. Parece que uma abordagem de trigonometria esférica poderia ser usada como base para uma sobreposição de polígonos vetoriais de conjuntos de dados em todo o mundo (por exemplo, qual a porcentagem de terra coberta por luz do dia e nuvens). Todas as sobreposições de polígono que eu conheço são baseadas em planar. en.wikipedia.org/wiki/trifonometria
esférica