Pregunta

Encontré una función en una página PHP que calcula la cantidad de millas entre 2 puntos, pero es defectuosa. Se supone que funciona con los mapas de Google, pero la diferencia en las distancias varía de 1.3 a 1.65 veces más en los mapas de Google (que es más preciso).

Aquí está la función:

$M =  69.09 * rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));

Me parece un poco complicado y no sé mucho sobre geometría para saber si esto es correcto o no.

¿Puede alguien con un poco más de conocimiento echar un vistazo a esto y ver qué le pasa?

¿Fue útil?

Solución

¿Quizás esté comparando la "distancia en línea recta" (línea directa entre dos puntos) con la distancia de conducción?

Además, vea esta publicación para calcular la distancia entre dos puntos en PHP.

Otros consejos

Está buscando la fórmula de Haversine para calcular la distancia entre dos puntos que tiene longitud y latitud para.

Se puede encontrar una implementación sencilla en Javascript aquí , que debería ser fácil de convertir a PHP.

Existen al menos tres métodos diferentes de cálculo de la distancia en la superficie de la Tierra, que varían en precisión y cómputo requerido.

  1. Ley esférica del coseno [no muy precisa, muy simple de calcular]
  2. Haversine Formula [precisa excepto a distancias más pequeñas, aún relativamente simple de calcular]
  3. Vincenty Formula [altamente preciso y puede usar varios diferentes modelos de elipsoides de la superficie de la Tierra, más complicados de calcular]

El ejemplo que proporcionó parece ser la ley del cálculo de cosenos, mientras que Google Maps es más preciso ya que utiliza la fórmula Vincenty. (Encuentro que el enlace de Vincenty explica la fórmula con más detalle que su página de Wikipedia)

Editar: Vi un comentario arriba que dice que el error introducido por la desviación en la superficie de la Tierra es trivial y no puede componer el error que está viendo. Me temo que esto solo es cierto en distancias muy grandes. A distancias de unos cientos de kilómetros o menos, los errores pueden ser decididamente no triviales.

Aquí hay una versión más simple, pero no precisa para ubicaciones muy distantes:

    const ONE_DEGREE = 111120;

public function distance( $point ) {
    $coef = cos( $this->getLatitude() / 180 * M_PI );
    $x = $this->getLatitude() - $point->getLatitude();
    $y = ( $this->getLongitude() - $point->getLongitude() ) * $coef;
    $result = sqrt( $x * $x + $y * $y ) * self::ONE_DEGREE;
    return $result;
}

$ point y $ this son instancias de la clase Location con los métodos getLatitude () y getLongitude ().

Tampoco sé nada sobre geometría, pero Google sugirió esta página .Tal vez lo encuentres útil

Parece que la fórmula es precisa; consulte, por ejemplo, Wikipedia en " ; gran distancia del círculo " . El factor de 69.09 en frente es, creo, el número de millas en un grado medido a lo largo de un gran círculo (por ejemplo, millas en 1 grado de longitud en el ecuador), por lo que su respuesta será en millas.

La idea de jonstjohn de que podría estar comparando incorrectamente la distancia en línea recta con la distancia de conducción me parece la explicación más probable.

EDIT : o podría ser el error de redondeo que Wikipedia menciona, si está trabajando con pequeñas separaciones. Pero primero señalaría con el dedo la diferencia de distancia directa / conducción.

Parece que el cálculo al que hace referencia utiliza un sistema de coordenadas esféricas. La fórmula es casi correcta. Parte de lo que podría estar descartando tu cálculo es el radio que estás usando. El 69.09 es el radio de la esfera (tierra en este caso). Como sabrán, la Tierra no es realmente una esfera, más bien un elipsoide. Sugeriría probar la formulación a continuación:

3963 * acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2)));

Para obtener resultados más precisos, querrás usar los cálculos de Vincenty o Haversine.

EDITAR: para aclarar, no estoy tratando de implicar que la mayor parte del error que está informando se deba al uso de un cálculo de coordenadas esféricas. Ese error es mucho más pequeño que lo que estás viendo. El ajuste de fórmula que proporcioné tenía la intención de ser una versión más clara de la fórmula, ya que el 69.09 era un valor del radio de la tierra ajustado a un sistema de grados, que es menos intuitivo que simplemente usar radianes. Además, vale la pena señalar que para calcular distancias muy pequeñas, el uso de la fórmula anterior es muy preciso (hasta aproximadamente 1 m de distancia) siempre que el sistema que realiza el cálculo esté trabajando con suficientes decimales. El uso de un flotador en la informática moderna le brinda esta precisión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top