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!)