9 votos

Punto más cercano de una línea (/Esférica proyección de Mercator )

Tengo una línea (Ax,Ay - Bx,By) a través de una proyección de mercator (google maps) y un punto al azar (Cx,Cy) más cercano a la línea, me gustaría saber el punto más cercano (transparente de color azul en la imagen) a través de la línea de punto (azul en la imagen)

EDIT: aclarar que esto es en una proyección de Mercator (proyección esférica) enter image description here

4voto

texai Puntos 178

usted puede utilizar computeDistanceBetween() la función de google map api.

distance = google.maps.geometry.spherical.computeDistanceBetween(firstCoord, secondCoord);

La distancia entre dos puntos es la longitud de la ruta más corta entre ellos. Esta ruta más corta que se llama una geodésica. En una esfera todos geodesics son segmentos de un gran círculo. Para calcular esta distancia, llame computeDistanceBetween(), pasándole dos LatLng objetos.

En su lugar puede utilizar computeLength() para calcular la longitud de un determinado la ruta de acceso si usted tiene varias ubicaciones

espero te sirva de ayuda...

1voto

mcchots Puntos 329

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X