O básico que ninguém explica direito
Distância de segmento é a menor distância entre um ponto e uma linha definida por dois extremos. Diferente da distância até uma reta infinita, o segmento tem começo e fim. Isso muda tudo no resultado final. Se o ponto projetado cair fora da linha, a distância passa a ser até o vértice mais próximo, não até a projeção. Isso parece óbvio, mas em produção as pessoas esquecem e começam a confundir com distância ponto-reta. O erro mais comum em datasets espaciais reais é esse. Você processa milhares de pontos e um erro de projeção em segmentos curtos distorce completamente os resultados.
O que é distância de segmento na prática
O cálculo envolve geometria analítica simples. Você projeta o ponto na linha, verifica se a projeção cai dentro do intervalo definido pelos dois vértices e decide qual usar. A matemática em si não é difícil. O problema é quando você lida com milhões de registros e a performance importa. Eu trabalhei num projeto de logística onde precisávamos calcular a distância de cada ponto de coleta até o segmento de rua mais próximo em um dataset com cerca de 800 mil coordenadas. Usar uma função ingênua de distância ponto-segmento em Python puro levou uns 47 minutos. Reescrevi usando Numba com JIT e c em 3 minutos. O ganho não foi mágica, foi só evitar o overhead do interpretador em cima de loops aninhados.
O detalhe que todo mundo perde: validar se o parâmetro t da projeção está entre 0 e 1. Se t for menor que zero, a projeção cai antes do início do segmento. Se maior que um, cai depois do fim. Em ambos os casos, a distância correta é a do ponto até o vértice mais próximo, não a projeção. Esse erro aparece constantemente em dados GPS ruins, onde a projeção escorrega para fora do segmento intencionalmente.
Implementação e armadilhas
Aqui vai um exemplo direto em Python. Sem bibliotecas pesadas, só numpy mesmo. Cálculo vetorial da projeção:
👉 Clique no botão abaixo para saber mais sobre o assunto!
Sean P o ponto, A e B os extremos do segmento. O vetor AB é B menos A. O vetor AP é P menos A. O parâmetro t é o produto interno de AP por AB dividido pelo quadrado da magnitude de AB. Se t cair entre 0 e 1, a projeção está dentro do segmento. Aí você calcula o ponto de projeção como A mais t vezes AB e mede a distância até P. Se t for fora desse intervalo, é só a distância mínima entre P-A e P-B. O problema que eu encontrei na prática foi com segmentos de comprimento extremamente pequeno. Quando a distância entre A e B é próxima de zero, o denominador tende a zero e a divisão explode numericamente. A solução foi adicionar um epsilon antes da divisão. Se o quadrado da magnitude de AB for menor que 1e-12, trata como um ponto único e calcula a distância direta. Isso evita NaN e inf que estragam todo o array depois.
Outro ponto que ninguém menciona: precisão de ponto flutuante. Com coordenadas geográficas em graus, a escala é tão pequena que erros de arredondamento aparecem. Use coordenadas projetadas em metros sempre que possível. Cálculos em graus crus dão discrepâncias de vários metros em distâncias longas. Eu vi cases onde a diferença entre usar WGS84 direto e projetar para UTM era de até 15 metros na média geral. Para análise de proximidade urbana isso é inaceitável.
Alternativas quando o cálculo direto não roda
Se você precisa de velocidade extrema e não quer implementar do zero, o Shapely resolve com distance() e project(). Mas Shapely é lento em batch grande. Para datasets acima de 500 mil pontos, vale a pena dar uma olhada no GDAL ou em soluções baseadas em rtree para indexação espacial primeiro. A abordagem híbrida de filtrar vizinhos com rtree e calcular distância de segmento só nos candidatos reduz o tempo de forma dramática. Em bancos de dados espaciais como PostGIS, a função st_dwithin faz uma aproximação útil para buscas de proximidade, mas ela calcula distância até a geometria completa, não especificamente segmento. Se o requisito é estritamente distância ponto-segmento, o cálculo manual ou uma UDF personalizada são mais confiáveis.
O que mais causa dor de cabeça em produção é a mistura de sistemas de referência. Segmentos definidos em um SR diferente dos pontos. O erro é silencioso e o resultado é nonsense. Sempre verifique o srid antes de qualquer operação. Um cast mal feito e sua distância de 50 metros vira 50 graus, o que em termos práticos é algo na casa dos quilômetros. Resumindo sem resumir: distância de segmento é um cálculo simples na teoria, trivial na prática até você encontrar os casos de borda. Vetor degenerado, projeção fora do intervalo, SR errado. São esses três que destroem os resultados. Trate eles primeiro, o resto é linha de código.