Mantén la atención ya que en esta división hallarás el arreglo que buscas.
Solución:
Creo que tu pregunta dice que tienes la city
valores para las dos ciudades entre las que desea calcular la distancia.
Esta consulta hará el trabajo por usted, arrojando la distancia en km. Utiliza la fórmula de la ley del coseno esférico.
Observe que une la tabla consigo misma para poder recuperar dos pares de coordenadas para el cálculo.
SELECT a.city AS from_city, b.city AS to_city,
111.111 *
DEGREES(ACOS(LEAST(1.0, COS(RADIANS(a.Latitude))
* COS(RADIANS(b.Latitude))
* COS(RADIANS(a.Longitude - b.Longitude))
+ SIN(RADIANS(a.Latitude))
* SIN(RADIANS(b.Latitude))))) AS distance_in_km
FROM city AS a
JOIN city AS b ON a.id <> b.id
WHERE a.city = 3 AND b.city = 7
Note que la constante 111.1111
es el número de kilómetros por grado de latitud, basado en la antigua definición napoleónica del metro como una diezmilésima parte de la distancia desde el ecuador hasta el polo. Esa definición es lo suficientemente cercana para el trabajo del buscador de ubicación.
Si desea millas terrestres en lugar de kilómetros, utilice 69.0
en lugar de.
http://sqlfiddle.com/#!9/21e06/412/0
Si está buscando puntos cercanos, puede tener la tentación de usar una cláusula como esta:
HAVING distance_in_km < 10.0 /* slow ! */
ORDER BY distance_in_km DESC
Eso es (como decimos cerca de Boston MA USA) tremendamente lento.
En ese caso, debe utilizar un cálculo de cuadro delimitador. Vea este artículo sobre cómo hacer eso. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
La fórmula contiene un LEAST()
función. ¿Por qué? Porque el ACOS()
La función arroja un error si su argumento es incluso ligeramente mayor que 1. Cuando los dos puntos en cuestión están muy juntos, la expresión con el COS()
y SIN()
Los cálculos a veces pueden producir un valor ligeramente mayor que 1 debido a épsilon de punto flotante (inexactitud). El LEAST(1.0, dirty-great-expression)
llamar hace frente a ese problema.
Hay una forma mejor, una fórmula de Thaddeus Vincenty. Usa ATAN2()
en vez de ACOS()
por lo que es menos susceptible a problemas de épsilon.
Aquí está la consulta y función MySQL que se usa para obtener la distancia entre dos latitud y longitud y la distancia regresará en KM.
Consulta Mysql: -
SELECT (6371 * acos(
cos( radians(lat2) )
* cos( radians( lat1 ) )
* cos( radians( lng1 ) - radians(lng2) )
+ sin( radians(lat2) )
* sin( radians( lat1 ) )
) ) as distance from your_table
Función Mysql: -
DELIMITER $$
CREATE FUNCTION `getDistance`(`lat1` VARCHAR(200), `lng1` VARCHAR(200), `lat2` VARCHAR(200), `lng2` VARCHAR(200)) RETURNS varchar(10) CHARSET utf8
begin
declare distance varchar(10);
set distance = (select (6371 * acos(
cos( radians(lat2) )
* cos( radians( lat1 ) )
* cos( radians( lng1 ) - radians(lng2) )
+ sin( radians(lat2) )
* sin( radians( lat1 ) )
) ) as distance);
if(distance is null)
then
return '';
else
return distance;
end if;
end$$
DELIMITER ;
Cómo usar en su código PHP
SELECT getDistance($lat1,$lng1,$lat2,$lng2) as distance
FROM your_table.
Puede utilizar la función incorporada ST_Distance_Sphere MySql. Calcula la distancia en metros de manera más eficiente.
Compatible desde la versión MySql 5.7 y superior.
select ST_Distance_Sphere(
point(-87.6770458, 41.9631174),
point(-73.9898293, 40.7628267))
Referido de Calcular la distancia usando MySQL
Te mostramos las comentarios y valoraciones de los usuarios
Acuérdate de que puedes reseñar si te ayudó.