quinta-feira, 14 de maio de 2015

Rolamento azimute - Determinando a direção de um veículo a partir de sua posição inicial e final


Uma dúvida bastante frequente quando começamos a trabalhar com objetos que se movem em um mapa ao longo de um período de tempo, é se é possível determinar a direção que o objeto tomou.

A resposta é sim. Se considerarmos que as linhas que cortam um mapa (meridianos e paralelos) fazem dele um eixo cartesiano, é fácil concluir que se tomarmos dois pontos geográficos, sendo um inicial (de onde partiu o objeto) e um final (para onde foi o objeto), será possível de alguma maneira determinar a direção do movimento.

Embora estejamos trazendo esta problemática para o mundo do desenvolvimento de aplicativos Android, essa questão é tão antiga quanto a história da navegação.

Assim, é fácil supor que uma solução para isto já exista há alguns séculos. Realmente. O nome técnico para a determinação da direção de um objeto a partir do movimento que fez em um mapa é "Rolamento Azimute".

Há uma fórmula matemática de domínio público, utilizada há tempos pela marinha e aeronáutica em navegação, conhecida como “Fórmula do rolamento azimute”. Esta fórmula tem como argumentos duas posições de GPS (latitude e longitude), sendo uma a posição inicial (de onde veio) e a outra a posição final (para onde foi). À partir dessas informações, retorna um valor em radianos, representando a direção do objeto em relação ao norte geográfico.

Ei-la:


angulo = atan2(sin(longitude2-longitude1)*cos(latitude2), cos(latitude1)*sin(latitude2) - sin(latitude1)*cos(latitude2)*cos(longitude2-longitude1) )


O resultado vem em radianos. Portanto, deve-se convertê-lo para graus:


angulo = angulo * 57.2957795

 
Também é preciso garantir que o ângulo esteja entre zero e 360º, pois o resultado da nossa fórmula retorna um campo negativo de -1 a -180º e outro positivo, de 1 a 180º. Para corrigir, é simples:


Se angulo < 0
   angulo=abs(angulo)
Senao
    angulo=360-angulo


Depois destes acertos, “angulo” conterá o valor desejado. Ou seja, o ângulo em relação ao norte geográfico, do deslocamento do objeto no espaço. Em outras palavras, a direção em que o objeto se moveu.

É claro que, embora ter o conhecimento dessa fórmula seja meio caminho andado, há outras questões envolvidas no cálculo. Por exemplo, num conjunto de posições atuais de objetos, é preciso ter todas as sua posições anteriores. E calcular a direção para cada uma delas, através do uso da fórmula. Onde isso será feito? No aplicativo? Em uma API que será consumida pelo aplicativo? Há questões de performance embutidas na discussão.

Além disso é preciso pensar na maneira de informar isso ao usuário. Como a direção será  disposta no mapa? Podemos utilizar uma imagem de uma seta sobre cada objeto e rotacioná-la de acordo com o ângulo calculado. Ou ainda ter vários desenhos de seta diferentes, que serão mostrados de acordo com uma faixa de ângulos.

De toda forma penso que esta é uma fórmula de extrema utilidade, que muitos procuram sem sucesso. E, por conseguinte, tomei a decisão de publicá-la aqui, acreditando que ajudará muita gente.

Ficamos por aqui. Um abraço. E fique ligado!

Nenhum comentário:

Postar um comentário