Como funciona a busca por posto de combustível mais próximo dentro de 400 m
A busca por posto de combustível mais próximo dentro de 400 m parece simples, mas a implementação correta envolve algumas camadas que a maioria dos desenvolvedores ignora até cometer o mesmo erro três vezes. O primeiro problema é que "400 metros" soa como uma distância fixa, mas em geolocalização você precisa decidir se vai calcular em retas no plano ou seguindo a curvatura da Terra. A diferença entre usar a fórmula de Haversine e simplesmente subtrair coordenadas em graus pode gerar um desvio de 5 a 12 metros em latitudes médias, o que significa que postos que estão efetivamente a 398 metros podem ser descartados, enquanto alguns a 415 metros acabam aparecendo nos resultados. Eu já perdi uma manhã inteira porque um cliente reclamou que o sistema mostrava postos a mais de 500 metros quando o filtro dizia 400. O problema não estava na query — estava no cache do GPS do dispositivo dele. O celular havia travado numa posição estimada com erro de aproximadamente 80 metros. A query funcionava perfeitamente, mas a entrada era errada. A solução foi forçar uma refetch da localização com alta precisão antes de disparar a busca, e ainda assim validar se a acurácia reportada pelo sensor estava abaixo de 50 metros. Se estiver acima disso, você simplesmente não executa a consulta e pede para o usuário se mover para um local com melhor recepção.
O que considerar na implementação prática de posto de combustível mais próximo dentro de 400 m
A abordagem mais eficiente que eu uso atualmente combina dois estágios. No primeiro, você faz uma pré-filtragem usando bounding boxes com índices geoespaciais. No segundo, aplica o cálculo preciso só nos candidatos que sobraram. Isso corta drasticamente o tempo de resposta em comparação com calcular a distância exata para cada posto no banco de dados. Com um índice adequado, a pré-filtragem leva cerca de 3 a 8 milissegundos em tabelas com milhares de registros. O cálculo posterior, aplicado talvez a uma dezena de candidatos, é praticamente desprezível. Um detalhe que pouca gente menciona: postos de combustível muitas vezes têm coordenadas registradas na entrada do estacionamento, não no ponto real de abastecimento. O raio de 400 metros pode acabar englobando um posto cuja bomba mais próxima está a 600 metros da entrada registrada. A correção que eu adoto é agregar um offset ao raio dependendo do tipo de estabelecimento, ou melhor ainda, usar o point-of-interest mais recente atualizado manualmente quando disponível. Dados abertos como OpenStreetMap frequentemente têm essa correção já aplicada, enquanto APIs comerciais nem sempre divulgaram a granularidade necessária.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Outro problema prático é a atualização dos horários e status dos postos. Um posto pode estar listado como aberto dentro dos 400 metros, mas fechou para reforma sem atualizar o cadastro. Eu recomendo fortemente que, se o seu sistema for usado por motoristas, você inclua um campo de dado com timestamp da última atualização e filtre os resultados que tiverem dados com mais de 30 dias sem refresh. Isso elimina uma fonte enorme de frustração. O custo computacional adicional é mínimo.
Limitações que ninguém conta
A busca por posto de combustível mais próximo dentro de 400 m falha completamente quando o usuário está em áreas com cobertura GPS intermitente, como túneis, cânions urbanos ou rodovias com muita vegetação. Nessas situações, o sistema pode retornar um posto que está tecnicamente dentro do raio mas é irrelevante porque o usuário não consegue atingir aquele ponto no trânsito atual. Uma alternativa que funciona melhor nesses casos é combinar a busca por proximidade com dados de tráfego em tempo real e calcular tempo de chegada estimado em vez de distância pura. A diferença é que isso exige integração com APIs de routing, o que aumenta a complexidade, mas o ganho em precisão contextual costuma valer o esforço. Se você está construindo algo do zero e não quer depender de serviços pagos, o conjunto de dados do OpenStreetMap combinado com uma base PostgreSQL e a extensão PostGIS resolve o problema principal. A configuração básica de um índice GiST em uma coluna geometric point, seguida de uma query com ST_DWithin, entrega resultados consistentes em menos de 10 ms para bases de até 50 mil postos. A partir daí, o gargalo passa a ser a qualidade dos dados, não a performance da consulta.