Hola, necesito calcular la distancia entre dos puntos que tienen el lat y el largo.
Me gustaría evitar cualquier llamada a API externa.
Intenté implementar la fórmula de Haversine en PHP:
Aquí está el código:
class CoordDistance
{
public $lat_a = 0;
public $lon_a = 0;
public $lat_b = 0;
public $lon_b = 0;
public $measure_unit = 'kilometers';
public $measure_state = false;
public $measure = 0;
public $error = '';
public function DistAB()
{
$delta_lat = $this->lat_b - $this->lat_a ;
$delta_lon = $this->lon_b - $this->lon_a ;
$earth_radius = 6372.795477598;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($this->lat_a)) * cos(deg2rad($this->lat_b)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$this->measure = $distance;
}
}
Al probarlo con algunos puntos dados que tienen distancias públicas, no obtengo un resultado confiable.
No entiendo si hay un error en la fórmula original o en mi implementación
php
coordinates
geocoding
haversine
maxdangelo
fuente
fuente
Respuestas:
No hace mucho escribí un ejemplo de la fórmula de Haversine y la publiqué en mi sitio web:
➽ Tenga en cuenta que obtiene la distancia de regreso en la misma unidad que pasa con el parámetro
$earthRadius
. El valor predeterminado es 6371000 metros, por lo que el resultado también estará en [m]. Para obtener el resultado en millas, podría pasar, por ejemplo, 3959 millas$earthRadius
y el resultado sería en [mi]. En mi opinión, es una buena costumbre quedarse con las unidades SI, si no hay una razón particular para hacerlo de otra manera.Editar:
Como TreyA señaló correctamente, la fórmula de Haversine tiene debilidades con puntos antipodales debido a errores de redondeo (aunque es estable para distancias pequeñas). Para evitarlos, puedes usar la fórmula de Vincenty en su lugar.
fuente
Encontré este código que me está dando resultados confiables.
resultados:
fuente
Es solo una adición a las respuestas de @martinstoeckli y @Janith Chinthana . Para aquellos que tienen curiosidad sobre qué algoritmo es más rápido, escribí la prueba de rendimiento . El mejor resultado de rendimiento muestra la función optimizada de codexworld.com :
Aquí están los resultados de la prueba:
fuente
1.1515 * 1.609344 = 1.853
. Gracias, arreglado a 1.853.Aquí el código simple y perfecto para calcular la distancia entre dos latitudes y longitudes. El siguiente código se ha encontrado desde aquí: http://www.codexworld.com/distance-between-two-addresses-google-maps-api-php/
fuente
Para los que les gusta más corto y más rápido (sin llamar a deg2rad ()).
fuente
Prueba esto da resultados asombrosos
fuente
Pregunta bastante antigua, pero para aquellos interesados en un código PHP que devuelva los mismos resultados que Google Maps, lo siguiente hace el trabajo:
He probado con varias coordenadas y funciona perfectamente.
Creo que debería ser más rápido que algunas alternativas también. Pero no probé eso.
Sugerencia: Google Maps utiliza 6378137 como radio de la Tierra. Por lo tanto, usarlo con otros algoritmos también podría funcionar.
fuente
Para valores exactos hazlo así:
Hmm, creo que debería hacerlo ...
Editar:
Para formuladores y al menos implementaciones JS intente: http://www.movable-type.co.uk/scripts/latlong.html
Atrévete ... Olvidé deg2rad todos los valores en las funciones de círculo ...
fuente
Hola aquí Código para obtener distancia y tiempo usando dos lat y long diferentes
Puede verificar el ejemplo debajo del enlace para obtener tiempo entre dos ubicaciones diferentes usando la latitud y la longitud en php
fuente
Pruebe esta función para calcular la distancia entre los puntos de latitud y longitud
Luego use la función como
Espero eso ayude
fuente
El multiplicador se cambia en cada coordenada debido a la teoría de la distancia del gran círculo como se escribe aquí:
http://en.wikipedia.org/wiki/Great-circle_distance
y puede calcular el valor más cercano utilizando esta fórmula que se describe aquí:
http://en.wikipedia.org/wiki/Great-circle_distance#Worked_example
la clave es convertir cada valor de grado - minuto - segundo a todo el valor de grado:
fuente
Una de las formas más fáciles es:
Redondeará hasta 2 puntos decimales.
fuente