O que é a Fórmula de Haversine?
A fórmula de haversine calcula a menor distância entre dois pontos sobre a superfície de uma esfera — para nós, a Terra — a partir da latitude e longitude. Ela retorna a distância de círculo máximo: o comprimento da curva mais curta que liga os dois pontos seguindo a superfície da esfera, também chamada de ortodromia.
É a fórmula que a navegação GPS, o planejamento de rotas aéreas, apps de carona, otimização de entregas, sobreposições de radar meteorológico e quase todas as APIs de mapas usam quando precisam responder rápido «quão longe estão estes dois pontos?». Ela leva em conta a curvatura da Terra, mantendo-se precisa mesmo em distâncias intercontinentais onde tratar o planeta como plano erraria por centenas de quilômetros.
A fórmula deriva da lei dos haversines em trigonometria esférica. A função haversine é definida como:
hav(θ) = sin²(θ/2) = (1 − cos(θ))/2
Propriedades e aplicações principais da fórmula de haversine:
- Geometria esférica: funciona na superfície curva da Terra, não em uma projeção plana que distorce distâncias
- Navegação: essencial para rotas aéreas, marítimas, planejamento de drones e direcionamento GPS
- Precisão: resultados com menos de 0,5 % de erro em relação ao modelo esférico — suficiente para quase toda aplicação de consumo
- Aritmética estável: a forma com seno ao quadrado evita a perda de precisão que a equivalente «lei dos cossenos esférica» sofre em distâncias pequenas
- Alcance universal: funciona para quaisquer dois pontos da Terra, incluindo pares antípodas (lados opostos do planeta)
Aplicações modernas incluem casamento em apps de carona, estimativa de tempo de entrega, publicidade hiperlocal, previsão do tempo e qualquer sistema que precise determinar proximidade ou calcular distâncias de viagem entre locais geográficos.
Como funciona a Fórmula de Haversine?
A fórmula de haversine calcula a distância de círculo máximo entre dois pontos sobre uma esfera a partir da latitude e longitude. Usa seno, cosseno e arcosseno, e assume que a esfera tem raio conhecido — normalmente o raio médio da Terra, 6.371 km.
A fórmula completa de haversine:
d = 2r · arcsin(√(sin²(Δφ/2) + cos(φ₁) · cos(φ₂) · sin²(Δλ/2)))
Onde:
- d = distância de círculo máximo entre os dois pontos
- r = raio da Terra (aprox. 6.371 km ou 3.959 milhas)
- φ₁, φ₂ = latitude do ponto 1 e 2 (em radianos)
- Δφ = φ₂ − φ₁ (diferença de latitude)
- Δλ = λ₂ − λ₁ (diferença de longitude)
- λ₁, λ₂ = longitude do ponto 1 e 2 (em radianos)
A fórmula funciona:
- Convertendo latitude e longitude de graus para radianos (multiplique por π/180)
- Calculando os haversines de meio ângulo das diferenças de latitude e longitude
- Combinando-os com cos(φ₁)·cos(φ₂) para projetar sobre a esfera
- Tomando o haversine inverso (arcosseno da raiz quadrada) para recuperar o ângulo central em radianos
- Multiplicando o ângulo central pelo raio para obter a distância real sobre a superfície
Como o cálculo usa senos de meio ângulo em vez de cossenos do ângulo completo, permanece numericamente estável mesmo quando os dois pontos estão muito próximos — propriedade que a antiga fórmula da lei dos cossenos esférica não possui.
Exemplos comuns de distância Haversine
Algumas distâncias de círculo máximo típicas calculadas com a fórmula de haversine:
- Nova York a Los Angeles: ~3.944 km (2.451 milhas)
- Londres a Tóquio: ~9.560 km (5.940 milhas) — e um voo real segue uma rota polar próxima a essa geodésica
- Sydney a Melbourne: ~713 km (443 milhas)
- Paris a Roma: ~1.103 km (685 milhas)
- Hanói a Ho Chi Minh: ~1.137 km (706 milhas)
Perguntas Frequentes
Porque a Terra é redonda, não plana. A distância pitagórica √((Δx)² + (Δy)²) serve em um plano, onde as coordenadas independem da posição. Latitude e longitude são ângulos sobre uma esfera, então 1° de longitude no equador cobre ~111 km de terreno real, mas só ~78 km a 45° de latitude e ~0 km nos polos. Se você tratar lat/lon como coordenadas planas (x, y) e aplicar Pitágoras, errará feio longe do equador. Para distâncias minúsculas (poucos km dentro de um país), a aproximação equirretangular d ≈ r·√(Δφ² + (cos(φ_média)·Δλ)²) basta; para qualquer distância continental, é preciso haversine ou uma fórmula elipsoidal completa como a de Vincenty. Haversine cuida da curvatura adequadamente: calcula o comprimento do arco entre os dois pontos sobre a superfície de uma esfera, que é o caminho real que você andaria (ou voaria) sobre uma Terra perfeitamente redonda. Sem ela, seu app de mapas diria que Londres está mais perto de Sydney via Singapura do que via Hong Kong, quando na verdade é o oposto.
Haversine assume que a Terra é uma esfera perfeita de raio 6.371 km. A Terra real é um esferoide oblato — mais larga no equador (6.378 km) do que entre os polos (6.357 km) — então a fórmula erra até ~0,5 % no pior caso. Para um voo de 10.000 km isso são cerca de 50 km de erro, mais que suficiente para importar a um piloto navegando com carta em papel, mas invisível para um motorista de Uber cruzando a cidade. Para tarefas que precisam de mais precisão — topografia, geodésia, orientação de mísseis, monitoramento de placas tectônicas — engenheiros usam as fórmulas de Vincenty, que tratam a Terra como elipsoide e convergem a precisão centimétrica. Para aplicações cotidianas (distância de entrega, casamento de carona, redes sociais «pessoas próximas») haversine sobra. Outra fonte de erro é a escolha do raio: 6.371 km é o raio médio (esfera de volume equivalente); se estiver navegando perto do equador, usar 6.378 km dá resultados ligeiramente melhores, e perto dos polos 6.357 km. A maioria do código apenas usa 6.371 km porque a diferença cai dentro do erro intrínseco do haversine.
Um círculo máximo é qualquer círculo na esfera cujo centro coincide com o centro da esfera — o equador é um, cada meridiano (par de longitudes opostas) é um, e a única geodésica entre quaisquer dois pontos não-antípodas está sobre um único círculo máximo. A distância de círculo máximo, calculada pela haversine, é o caminho mais curto entre dois pontos da esfera. Uma linha de rumo (loxodrômica) é um caminho que cruza cada meridiano com o mesmo ângulo constante — um «rumo de bússola fixo». Loxodromias parecem retas em uma projeção de Mercator, por isso os marinheiros antigos as adoravam: «proa nordeste» é fácil de seguir sem correções contínuas. Mas uma loxodromia é mais longa que a rota ortodrômica, às vezes de modo dramático. Nova York–Tóquio por loxodromia: cerca de 11.500 km; por círculo máximo: 10.800 km. Aviões modernos voam o círculo máximo embora exija ajustar continuamente a proa. Haversine devolve distância de círculo máximo; para loxodrômica usa-se outra fórmula baseada na diferença projetada de Mercator.
Porque ESSE é o caminho mais curto numa esfera. Nova York fica a cerca de 40° N, Tóquio a 35° N — ambas bem no hemisfério norte. Se você traçar uma reta entre elas no globo, ela varre para o norte sobre o Alasca, às vezes sobre a Rússia, nunca pelo Pacífico central. A projeção de Mercator — usada em quase todo mapa de parede — distorce radicalmente regiões polares: a Groenlândia parece maior que a África embora seja 14 vezes menor. Então uma linha «reta» em Mercator (a loxodromia) curva-se para baixo e a leste, abraçando o Pacífico. A verdadeira geodésica, que a haversine representa, curva-se sobre o polo. É por isso que as rotas aéreas intercontinentais parecem estranhamente curvas em mapas planos mas retas no globo. A mesma lógica vale para Sydney–Santiago (sobre a Antártida), Joanesburgo–Sydney (sobre o Oceano Antártico) e Londres–Auckland (sobre o Ártico). A fórmula da haversine não diz o caminho, só a distância, mas a distância só faz sentido no contexto desse círculo máximo.
A convenção padrão é 6.371.000 m (6.371 km, ou 3.959 milhas, ou 3.440 milhas náuticas). Esse é o raio médio volumétrico — o raio de uma esfera com o mesmo volume que a Terra. Há três valores mais precisos: o raio equatorial (6.378,137 km, usado no datum WGS84), o polar (6.356,752 km) e o médio (6.371,009 km, média geográfica). As diferenças são pequenas (~0,3 % pico a pico) mas importam ao comparar com dados de referência. Pilotos e navegadores marítimos costumam usar 6.371 km e aceitar o pequeno erro; levantamentos geodésicos usam o elipsoide WGS84. Para milhas, a fórmula de haversine permanece a mesma — basta entrar com r = 3.959 (milha estatutária) ou r = 3.440 (milha náutica) e a resposta sai nessa unidade. A escolha mais simples e popular é r = 6.371.008,8 m (raio médio IUGG), e quase toda implementação de haversine na internet usa esse valor ou um 6.371 km arredondado.
Haversine dá distância; o rumo é cálculo à parte. O rumo inicial do ponto 1 (φ₁, λ₁) ao ponto 2 (φ₂, λ₂) é θ = atan2(sin(Δλ)·cos(φ₂), cos(φ₁)·sin(φ₂) − sin(φ₁)·cos(φ₂)·cos(Δλ)), em radianos. Converta para graus e normalize para [0, 360) somando 360 e tirando o módulo. O resultado é a direção de bússola em que você começa a caminhar — 0° = norte, 90° = leste, 180° = sul, 270° = oeste. Em uma rota ortodrômica, o rumo de fato muda continuamente ao longo do trajeto (por isso o mapa de bordo mostra sua proa deslizando devagar), de modo que a fórmula dá o rumo inicial no ponto 1. Para o rumo final ao chegar no ponto 2, troque os dois pontos, calcule o rumo inicial e some 180° módulo 360°. Use atan2, não atan(y/x) — a versão de quatro quadrantes lida corretamente com toda combinação de sinais. Essa fórmula somada à haversine são os cavalos-de-trabalho de quase toda biblioteca geográfica: PostGIS, Turf.js, geopy, GeoTools.
JavaScript: function haversine(lat1, lon1, lat2, lon2) { const R = 6371; const toRad = d => d * Math.PI / 180; const dLat = toRad(lat2 - lat1); const dLon = toRad(lon2 - lon1); const a = Math.sin(dLat/2)**2 + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon/2)**2; return 2 * R * Math.asin(Math.sqrt(a)); }. Python é idêntico, troque Math.sin por math.sin. Armadilhas comuns: esquecer de converter graus para radianos (sin e cos esperam radianos, mas coordenadas vêm em graus); trocar a ordem de latitude e longitude (algumas bibliotecas usam (lon, lat), a maioria das APIs usa (lat, lon)); usar Math.asin em vez do mais numericamente estável atan2(sqrt(a), sqrt(1-a)) para distâncias próximas a antípodas; escolher R = 6378 (equatorial) quando 6371 (médio) é a convenção. Para produção, prefira uma biblioteca testada: em Python, scipy.spatial.distance, geopy.distance ou o pacote haversine; em JavaScript, Turf.js ou @turf/distance. Fazer na mão funciona, mas tem essas pegadinhas.
Três cenários. Primeiro, quando você precisa de alta precisão em distâncias curtas — para trabalho topográfico submilimétrico ou registro de terras, a suposição esférica do haversine traz erro demais, e melhor usar a fórmula inversa de Vincenty num elipsoide WGS84 ou um sistema de coordenadas projetado local (UTM, plano estadual). Segundo, quando você só precisa de uma distância aproximada numa área pequena — tipo «esses dois pontos estão dentro de 1 km um do outro numa cidade?». Aí a aproximação equirretangular d ≈ R·√(Δφ² + (cos(φ_média)·Δλ)²) usa duas chamadas trig em vez de seis, roda em 1/3 do tempo e tem precisão melhor que 0,1 % em algumas centenas de km. Para processamento em lote massivo (pense: parear todo motorista Uber com todo passageiro), a economia se acumula. Terceiro, quando os pontos estão muito próximos de antípodas (separação > 179,5°), a haversine ingênua perde precisão — formulações baseadas em atan2 são mais robustas ali. A maioria dos apps nunca toca esses casos extremos, então haversine continua sendo o padrão certo.