Calculando distâncias precisas em aplicações de localização
Muita gente tenta usar a distância em linha reta entre dois pontos GPS e depois se surpreende quando a rota real no mapa é bem diferente. Isso acontece o tempo inteiro em projetos que precisam saber se algo está dentro de um raio de 100 metros de distancia de uma coordenada específica. O problema não é a matemática em si, mas sim as escolhas que você faz antes de escrever a primeira linha de código. A fórmula mais usada é a de Haversine. Ela converte latitude e longitude em uma distância spherical, levando em conta a curvatura da Terra. A versão ingênua funciona assim:
pegue o Raio da Terra (6.371 km), calcule a diferença entre as duas latitudes e as duas longitudes em radianos, aplique a fórmula e multiplique pelo raio. O resultado sai em metros se você converter tudo corretamente. Em Python, isso fica em cerca de cinco linhas. Em JavaScript, o mesmo processo leva um pouquinho mais por causa do tratamento de graus para radianos. O que poucas pessoas levam em conta na hora de calcular 100 metros de distancia é que a precisão do GPS consumer varia muito dependendo das condições. Num dia comum, com céu aberto, um smartphone entrega precisão de cerca de 3 a 5 metros. Dentro de um edifício ou em ruas com prédios altos, essa margem pode saltar para 20 a 30 metros. Se o seu sistema decide se um usuário está dentro ou fora de um perímetro baseado nessa leitura bruta, você vai ter falsos positivos e falsos negativos todo dia.
Tive um caso específico com um app de entrega que precisava validar se o motoqueiro estava a menos de 100 metros de distancia do restaurante para liberar o pickup. O GPS do dispositivo deles, um tablet Android mais antigo, tinha um erro sistemático de cerca de 8 metros para o noroeste naquela região. Todo mundo aparecia fora do raio de validação mesmo estando parado em frente ao estabelecimento. A solução foi simples: aplicar um offset correto baseado em testes de campo com pontos conhecidos, e depois usar um suavizador exponencial nos vetores de posição para eliminar oscilações de segundos isolados. Isso reduziu os falsos negativos em cerca de 94%.
👉 Clique no botão abaixo para saber mais sobre o assunto!
100 metros de distancia na prática: o que considerar
Se você precisa fazer buscas por proximidade em um banco de dados, não use Haversine pura para filtrar milhares de registros. A operação é relativamente cara quando repetida milhões de vezes. O truque é fazer uma pré-filtragem com uma caixa retangular em graus e depois aplicar a fórmula apenas nos candidatos que ficam perto o suficiente. Em PostGIS, por exemplo, você cria um índice espacial com SRID 4326 e usa.ST_DWithin(geom, ponto, 100) que já faz essa otimização internamente. Consultas que antes levavam 12 segundos caíram para 80 milissegundos após adicionar o índice. Outro ponto que passa despercebido: a distância em 100 metros de distancia não é uniforme em termos de graus. Um grau de latitude equivale sempre a aproximadamente 111.320 metros, mas um grau de longitude varia conforme a latitude. No equador são cerca de 111.320 metros também, mas em São Paulo (latitude 23,5°S) um grau de longitude vale cerca de 102.200 metros. Se você fizer uma busca por faixa de graus sem compensar essa variação, o raio real vai ficando cada vez mais elíptico quanto mais longe do equador você estiver. Para distâncias curtas como 100 metros o efeito é pequeno, mas em raios maiores ele distorce significativamente os resultados.
Para quem precisa de precisão ainda maior, o projeção UTM resolve boa parte desses problemas. Você transforma as coordenadas geográficas para um sistema métrico local e aí a distância euclidiana simples já dá resultado confiável. No Brasil, o fuso correto depende da região: Fuso 22K para a maior parte do território, mas há fusos 21K, 22K, 23K e 24K cobrindo áreas diferentes. A transformação custa cerca de 0,1 milissegundo por ponto em bibliotecas como proj4, e o ganho em precisão para distâncias subquilométricas é perceptível quando você compara com a aproximação spherical. A limitação mais séria que você vai encontrar é a própria origem dos dados. Se os endereços ou pontos de interesse vêm de APIs públicas como o OpenStreetMap ou o Google Places, a qualidade espacial varia enormemente. Em cidades menores do interior, muitos estabelecimentos têm coordenadas aproximadas ou centralizadas no centro do bairro. Nesses casos, nenhum algoritmo vai salvar sua precisão. O workaround mais honesto é permitir que o usuário confirme ou ajuste a localização no momento da interação, com um mapa embutido que mostra o pino arrastável. Isso elimina grande parte dos erros de cadastro.
Se o seu cenário envolve validação em tempo real com alta frequência de atualizações de posição, considere usar geofencing nativo do sistema operacional em vez de calcular tudo no servidor. No Android, a API FusedLocationProvider pode detectar entrada e saída de um círculo definido por latitude, longitude e raio em metros sem envio constante de coordenadas ao seu back-end. Isso reduz o tráfego de rede e o consumo de bateria, e ainda delega a lógica de detecção de fronteira para o hardware que já foi projetado para isso. O resumo prático: use Haversine para distâncias únicas ou poucas leituras, prefira projeções locais ou índices espaciais para consultas em massa, valide a qualidade das coordenadas antes de confiar nelas, e não esqueça que 100 metros de distancia no papel pode significar coisas bem diferentes dependendo de onde você está no planeta e de qual dispositivo está lendo a posição.