Estou tentando descobrir como derivar matematicamente os pontos comuns de dois círculos que se cruzam na superfície da Terra, dado um centro Lat / Lon e um raio para cada ponto.
Por exemplo, dado:
- Lat / Lon (37.673442, -90.234036) Raio 107,5 NM
- Lat / Lon (36.109997, -90.953669) Raio 145 NM
Eu deveria encontrar dois pontos de interseção com um deles sendo (36.948, -088.158).
Seria trivialmente fácil resolver isso em um plano plano, mas não tenho experiência em resolver equações em uma esfera imperfeita, como a superfície da Terra.
Respostas:
Não é muito mais difícil na esfera do que no avião, uma vez que você reconhece que
Os pontos em questão são as interseções mútuas de três esferas: uma esfera centralizada abaixo do local x1 (na superfície da Terra) de um determinado raio, uma esfera centralizada abaixo do local x2 (na superfície da Terra) de um determinado raio e a própria Terra , que é uma esfera centralizada em O = (0,0,0) de um determinado raio.
A interseção de cada uma das duas primeiras esferas com a superfície da Terra é um círculo, que define dois planos. As interseções mútuas de todas as três esferas estão, portanto, na interseção desses dois planos: uma linha .
Consequentemente, o problema é reduzido ao cruzamento de uma linha com uma esfera, o que é fácil.
Aqui estão os detalhes. As entradas são os pontos P1 = (lat1, lon1) e P2 = (lat2, lon2) na superfície da Terra, considerados como uma esfera, e dois raios correspondentes r1 e r2.
Converter (lat, lon) em (x, y, z) coordenadas geocêntricas. Como sempre, porque podemos escolher unidades de medida nas quais a Terra possui um raio unitário,
No exemplo, P1 = (-90.234036 Grau, 37.673442 Grau) possui coordenadas geocêntricas x1 = (-0.00323306, -0.7915, 0.61116) e P2 = (-90.953669 Grau, 36.109997 Grau) possui coordenadas geocêntricas x2 = (-0.0134464, -0.807775 0,589337).
Converta os raios r1 e r2 (medidos ao longo da esfera) em ângulos ao longo da esfera. Por definição, uma milha náutica (NM) é 1/60 de grau de arco (que é pi / 180 * 1/60 = 0,0002908888 radianos). Portanto, como ângulos,
O círculo geodésico do raio r1 em torno de x1 é a interseção da superfície da Terra com uma esfera euclidiana de raio sin (r1) centrada em cos (r1) * x1.
O plano determinado pela interseção da esfera do raio sin (r1) em torno de cos (r1) * x1 e a superfície da Terra é perpendicular a x1 e passa pelo ponto cos (r1) x1, de onde sua equação é x.x1 = cos (r1) (o "." representa o produto escalar usual ); da mesma forma para o outro plano. Haverá um ponto único x0 na interseção desses dois planos que é uma combinação linear de x1 e x2. Escrevendo x0 = a x1 + b * x2, as duas equações planares são
Usando o fato de que x2.x1 = x1.x2, que escreverei como q, a solução (se existir) é dada por
No exemplo em execução, calculo a = 0,973503 eb = 0,0260194.
Evidentemente, precisamos de q ^ 2! = 1. Isso significa que x1 e x2 não podem ser o mesmo ponto nem pontos antipodais.
Agora todos os outros pontos na linha de interseção dos dois planos diferem de x0 por algum múltiplo de um vetor n que é mutuamente perpendicular a ambos os planos. O produto cruzado
faz o trabalho fornecido n é diferente de zero: mais uma vez, isso significa que x1 e x2 não são coincidentes nem diametralmente opostos. (Precisamos ter o cuidado de calcular o produto cruzado com alta precisão, pois envolve subtrações com muito cancelamento quando x1 e x2 estão próximos um do outro.) No exemplo, n = (0,0272194, -0,00631254, -0,00803124) .
Portanto, buscamos até dois pontos da forma x0 + t * n que se encontram na superfície da Terra: ou seja, seu comprimento é igual a 1. Equivalentemente, seu comprimento ao quadrado é 1:
O termo com x0.n desaparece porque x0 (sendo uma combinação linear de x1 e x2) é perpendicular a n. As duas soluções são facilmente
e é negativo. Mais uma vez, é necessária alta precisão, porque quando x1 e x2 estão próximos, x0.x0 está muito próximo de 1, levando a uma perda de precisão do ponto flutuante. No exemplo, t = 1,07509 ou t = -1,07509. Os dois pontos de interseção, portanto, são iguais
Por fim, podemos converter essas soluções de volta para (lat, lon) convertendo as coordenadas geocêntricas (x, y, z) em geográficas:
Para a longitude, usar o arco tangente generalizada retornando valores na faixa de -180 a 180 graus (em aplicações de computação, esta função leva ambos x e y como argumentos ao invés de apenas a relação y / x, que é às vezes chamado de "ATAN2").
Eu obtenho as duas soluções (-88.151426, 36.989311) e (-92.390485, 38.238380), mostradas na figura como pontos amarelos.
Os eixos exibem as coordenadas geocêntricas (x, y, z). A mancha cinza é a parte da superfície da Terra de -95 a -87 graus de longitude e 33 a 40 graus de latitude (marcada com uma gratícula de um grau). A superfície da Terra foi parcialmente transparente para mostrar as três esferas. A correção das soluções computadas é evidente pela forma como os pontos amarelos ficam nas interseções das esferas.
fonte
O caso elipsoidal :
Esse problema é uma generalização da localização de fronteiras marítimas definidas como "linhas medianas" e há uma extensa literatura sobre esse tópico. Minha solução para esse problema é alavancar a projeção azimutal equidistante:
Esse algoritmo converge quadraticamente e produz uma solução precisa em um elipsóide. (É necessária precisão no caso de fronteiras marítimas, pois determina os direitos de pesca, petróleo e minerais.)
As fórmulas são dadas na Seção 14 da Geodésica em um elipsóide de revolução . A projeção azimutal equidistante elipsoidal é fornecida por GeographicLib . Uma versão do MATLAB está disponível em projeções geodésicas para um elipsóide .
fonte
Aqui está um código R para fazer isso:
fonte
Seguindo a resposta do @ whuber , aqui está um código Java que é útil por dois motivos:
Não é otimizado ou completo (deixei de lado as classes óbvias como
Point
), mas deve fazer o truque.Além disso, observe o uso de
atan2
- é o inverso do que você esperaria da resposta do @ whuber (não sei por que, mas funciona):fonte
Código 'R' em funcionamento para a resposta @wuhber.
fonte
Se um círculo é o Nortstar, existe uma maneira mais fácil com a esfera unitária.
Você pode medir sua latitude com a Nortstar. Então você tem uma posição relativa nesta esfera. v1 (0, sen (la), cos (la)) Você conhece a posição (ângulo) de outra estrela (estrela2), de almanach. v2 (sin (lo2) * cos (la2), sin (la2), cos (lo2) * cos (la2)) Seus vetores. Da equação da esfera.
lo2 é a longitude relativa. É desconhecido .
O ângulo entre você e a estrela2, você também pode medir, (m) E você sabe, o produto interno de um vetor de duas unidades é cos (ângulo) de entre. cos (m) = ponto (v1, v2) u pode calcular agora a longitude relativa (lo2). lo2 = acos ((cos (m) -sin (la) * sin (la2)) / (cos (la) * cos (la2)))
Afinal, você adiciona a longitude real de star2 a lo2. (ou sub, depende do lado oeste de você ou do leste.) lo2 agora é a sua longitude.
Desculpe pelo meu inglês, eu nunca aprendo esse idioma.
2 coisas: Northstar significa estrela polar.
Outro. Como o ângulo medido na horizontal relativamente, sempre precisa de correção de 90 ângulos. É válido para m ângulo também.
ps: média do ângulo real: posição da estrela - correção do tempo.
fonte