Por que não é só "Pitágoras"
A Terra é aproximadamente uma esfera (mais exatamente, um geoide achatado nos polos). Medir distância em linha reta no plano cartesiano (Pitágoras) introduz erros grandes em distâncias médias e longas.
Para distâncias pequenas (até ~1 km em latitudes médias), a aproximação plana é aceitável. Acima disso, usar Haversine ou Vincenty é necessário.
A fórmula de Haversine
A fórmula parte de dois pontos com coordenadas (lat₁, lon₁) e (lat₂, lon₂), ambas em radianos.
a = sin²(Δlat/2) + cos(lat₁) × cos(lat₂) × sin²(Δlon/2)
c = 2 × atan2(√a, √(1−a))
d = R × c — onde R é o raio médio da Terra (6.371 km).
Exemplo prático
São Paulo (−23,5505, −46,6333) → Rio de Janeiro (−22,9068, −43,1729):
1. Converter para radianos.
2. Aplicar a fórmula: a ≈ 0,00128, c ≈ 0,07155 rad, d = 6.371 × 0,07155 ≈ 456 km.
Distância real em linha reta: 456 km. Pela estrada (Dutra), são cerca de 430 km porque existem curvas e variações de altitude.
Limitações do Haversine
A fórmula é ótima para a maioria dos casos, mas tem imprecisões:
- Assume Terra esférica perfeita — real é elipsoidal (achatada nos polos)
- Erro máximo ≈ 0,5% (para o pior caso, na antípoda)
- Para distâncias < 10 km, o erro é normalmente inferior a 1 metro
- Para precisão sub-métrica, usar Vincenty (considera elipsoide WGS-84)
Aplicações práticas
Haversine aparece em quase todo sistema com geolocalização:
- Apps de delivery e mobilidade — distância entre passageiro e motorista
- Busca "perto de mim" — filtrar estabelecimentos dentro de raio X
- Monitoramento de frota — rotas, relatórios de quilometragem
- Aviação e navegação marítima — great-circle distance (mesmo princípio)
- Ciência e meteorologia — distância entre estações, vórtices, correntes
Implementação rápida
Na prática, bibliotecas fazem tudo: em JavaScript use Turf.js ou Leaflet; em Python, geopy; em SQL, PostGIS (ST_Distance_Sphere ou ST_Distance no geography type).
Para implementação manual, atenção a duas armadilhas: (1) converter graus para radianos antes, (2) usar atan2(√a, √(1−a)) — não asin(√a) — para estabilidade numérica.
Fundador da UtilizAí, formado em Blockchain, Criptomoedas e Finanças na Era Digital, com formações complementares em Teologia, Filosofia e em curso de Fonoaudiologia. Saiba mais.
Perguntas frequentes
Haversine funciona com altitude?
Não. Só considera superfície. Para rotas tridimensionais (aviação em voo), é necessário incluir altitudes e trajetória real.
E se os dois pontos são muito próximos?
Funciona, mas a diferença para distância plana é irrelevante. Para precisão < 1 metro em pontos próximos, fórmulas alternativas com ENU (East-North-Up) são melhores.
Qual raio da Terra usar?
O mais aceito é 6.371 km (raio médio). Para WGS-84 específico, 6.378,137 km no equador, 6.356,752 km nos polos. Usar 6.371 é bom para quase tudo.
Haversine retorna km ou metros?
Depende do R que você usar. Se R = 6.371 km → distância em km. Se R = 6.371.000 m → distância em m. Mantenha unidades consistentes.