Lat / Lon + Distância + ponto -> Lat / Lon
-
22-08-2019 - |
Pergunta
Assim: Eu tenho a função a seguir, adaptado de uma fórmula encontrados on-line, que leva lat / lon coordenadas dois e encontra a distância entre eles em milhas (ao longo de uma Terra esférica):
public static double distance (double lat1, double lon1, double lat2, double lon2) {
double theta = toRadians(lon1-lon2);
lat1 = toRadians(lat1);
lon1 = toRadians(lon1);
lat2 = toRadians(lat2);
lon2 = toRadians(lon2);
double dist = sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(theta);
dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;
return dist;
}
Tanto quanto eu posso dizer isso funciona muito bem.
O que eu preciso é de uma segunda função que, usando exatamente o mesmo modelo da geometria da Terra, toma um único par latitude / longitude [A], um título e uma distância, e gera um novo par / lon lat [B ] de tal forma que se você começou no ponto [a], e viajou a distância dada no título dado, você ia acabar no ponto [B].
Este é o local onde o fato de que minhas habilidades de geometria ter me deixado inteiramente entra em jogo:)
Qualquer ajuda seria muito apreciada!
Obrigado, -Dan
Solução
Eu recebo a maioria desses tipos de fórmulas de O Aviation Formulary .
A fórmula que ele dá é:
Lat / lon dada radial e distância
Um ponto de {lat, lon} é uma distância d para fora em o radial tc do ponto 1 se:
lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc)) IF (cos(lat)=0) lon=lon1 // endpoint a pole ELSE lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi ENDIF
Este algoritmo é limitado a distâncias tais que dlon
lat =asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc)) dlon=atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(lat)) lon=mod( lon1-dlon +pi,2*pi )-pi
Note que ele está usando "tc" para representar verdadeiro curso (em radianos no sentido horário a partir do Norte) e as distâncias que ele dá são em radianos de arco ao longo da superfície da terra. Isto é explicado (juntamente com as fórmulas para converter para trás e para a frente a partir de milhas náuticas) na primeira secção do Formulary. Além disso, confira as "Notas de Implementação" e "exemplos trabalhados" na página.