echa un vistazo a este enlace , me hizo uso de la siguiente función para calcular las distancias de los segmentos de línea.
En PHP:
function point_to_line_segment_distance($startX,$startY, $endX,$endY, $pointX,$pointY) {
// list($distanceSegment, $x, $y) = point_to_line_segment_distance($startX,$startY, $endX,$endY, $pointX,$pointY);
// Adapted from Philip Nicoletti's function, found here: http://www.codeguru.com/forum/printthread.php?t=194400
$r_numerator = ($pointX - $startX) * ($endX - $startX) + ($pointY - $startY) * ($endY - $startY);
$r_denominator = ($endX - $startX) * ($endX - $startX) + ($endY - $startY) * ($endY - $startY);
$r = $r_numerator / $r_denominator;
$px = $startX + $r * ($endX - $startX);
$py = $startY + $r * ($endY - $startY);
$s = (($startY-$pointY) * ($endX - $startX) - ($startX - $pointX) * ($endY - $startY) ) / $r_denominator;
$distanceLine = abs($s) * sqrt($r_denominator);
$closest_point_on_segment_X = $px;
$closest_point_on_segment_Y = $py;
if ( ($r >= 0) && ($r <= 1) ) {
$distanceSegment = $distanceLine;
}
else {
$dist1 = ($pointX - $startX) * ($pointX - $startX) + ($pointY - $startY) * ($pointY - $startY);
$dist2 = ($pointX - $endX) * ($pointX - $endX) + ($pointY - $endY) * ($pointY - $endY);
if ($dist1 < $dist2) {
$closest_point_on_segment_X = $startX;
$closest_point_on_segment_Y = $startY;
$distanceSegment = sqrt($dist1);
}
else {
$closest_point_on_segment_X = $endX;
$closest_point_on_segment_Y = $endY;
$distanceSegment = sqrt($dist2);
}
}
return array($distanceSegment, $closest_point_on_segment_X, $closest_point_on_segment_Y);
}
Usted puede utilizar la proyección funciones para calcular distancias, yo estoy usando la fórmula anterior para calcular el tiempo en ese punto que da un promedio de velocidad y funciona realmente bien.
Si quieres una buena biblioteca de PHP para calcular las distancias entre las coordenadas en PHP, echa un vistazo GeoCalc clase