Como calcular a distância entre dois pontos especificados por latitude e longitude?
Para esclarecimento, I'gostaria de conhecer a distância em quilômetros; os pontos utilizam o sistema WGS84 e I'gostaria de compreender a relativa precisão das abordagens disponíveis.
Este link pode ser útil para você, pois detalha o uso da fórmula Haversine para calcular a distância.
Excerto:
Este script [em Javascript] calcula as distâncias do círculo grande entre os dois pontos - ou seja, a distância mais curta sobre a superfície da terra - usando a fórmula 'Haversine'.
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2-lat1); // deg2rad below
var dLon = deg2rad(lon2-lon1);
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c; // Distance in km
return d;
}
function deg2rad(deg) {
return deg * (Math.PI/180)
}
Aqui está um C# Implementação:
static class DistanceAlgorithm
{
const double PIx = 3.141592653589793;
const double RADIUS = 6378.16;
/// <summary>
/// Convert degrees to Radians
/// </summary>
/// <param name="x">Degrees</param>
/// <returns>The equivalent in radians</returns>
public static double Radians(double x)
{
return x * PIx / 180;
}
/// <summary>
/// Calculate the distance between two places.
/// </summary>
/// <param name="lon1"></param>
/// <param name="lat1"></param>
/// <param name="lon2"></param>
/// <param name="lat2"></param>
/// <returns></returns>
public static double DistanceBetweenPlaces(
double lon1,
double lat1,
double lon2,
double lat2)
{
double dlon = Radians(lon2 - lon1);
double dlat = Radians(lat2 - lat1);
double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
return angle * RADIUS;
}
}
Para calcular a distância entre dois pontos em uma esfera você precisa fazer o Cálculo do Grande Círculo.
Existem várias bibliotecas C/C++ para ajudar na projeção de mapas em MapTools se você precisar reprojetar suas distâncias para uma superfície plana. Para fazer isso, você precisará da cadeia de projeção dos vários sistemas de coordenadas.
Você também pode encontrar MapWindow uma ferramenta útil para visualizar os pontos. Também como seu código aberto é um guia útil de como usar a biblioteca proj.dll, que parece ser o núcleo da biblioteca de projeção de código aberto.