Encuentra la distancia entre dos puntos usando latitud y longitud en mysql

Hola, tengo la siguiente tabla

-------------------------------------------- | id | city | Latitude | Longitude | -------------------------------------------- | 1 | 3 | 34.44444 | 84.3434 | -------------------------------------------- | 2 | 4 | 42.4666667 | 1.4666667 | -------------------------------------------- | 3 | 5 | 32.534167 | 66.078056 | -------------------------------------------- | 4 | 6 | 36.948889 | 66.328611 | -------------------------------------------- | 5 | 7 | 35.088056 | 69.046389 | -------------------------------------------- | 6 | 8 | 36.083056 | 69.0525 | -------------------------------------------- | 7 | 9 | 31.015833 | 61.860278 | -------------------------------------------- 

Ahora quiero obtener distancia entre dos puntos. Supongamos que un usuario está teniendo una ciudad 3 y un usuario está teniendo una ciudad 7. Mi escenario es un usuario que tiene una ciudad y un latitud y Longtitude está buscando la distancia de otros usuarios de su ciudad. Por ejemplo, el usuario que tiene la ciudad 3 está buscando. Quiere obtener la distancia del usuario de cualquier otra ciudad, decir que es 7. He buscado y encontrado la siguiente consulta

 SELECT `locations`.`city`, ( 3959 * acos ( cos ( radians(31.589167) ) * cos( radians( Latitude ) ) * cos( radians( Longitude ) - radians(64.363333) ) + sin ( radians(31.589167) ) * sin( radians( Latitude ) ) ) ) AS `distance` FROM `locations` HAVING (distance < 50) 

En cuanto a lo que sé, esta consulta encuentra la distancia de un punto a todos los demás puntos. Ahora quiero obtener distancia de un punto a otro punto.

Cualquier línea de guía será muy apreciada.

Creo que tu pregunta dice que tienes los valores de la city para las dos ciudades entre las cuales deseas calcular la distancia.

Esta consulta hará el trabajo por usted, cediendo la distancia en km. Utiliza la fórmula de la ley del coseno esférico.

Observe que se une a la tabla para que pueda recuperar dos pares de coordenadas para el cálculo.

 SELECT a.city AS from_city, b.city AS to_city, 111.111 * DEGREES(ACOS(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 

Observe 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 de la distancia desde el ecuador hasta el polo. Esa definición es lo suficientemente cercana para el trabajo de localización y localización.

Si desea establecer millas en lugar de kilómetros, use 69.0 lugar.

http://sqlfiddle.com/#!2/abcc8/4/0

Si está buscando puntos cercanos, puede sentirse tentado 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 EE. UU.) Malvado lento.

En ese caso, debe usar un cálculo de cuadro delimitador. Vea esta reseña sobre cómo hacer eso. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

No estoy seguro de cómo se está realizando el cálculo de la distancia, pero debe self join la tabla y realizar el cálculo en consecuencia. Algo como esto probablemente

 select t1.id as userfrom, t2.id as userto, ( 3959 * acos ( cos ( radians(31.589167) ) * cos( radians( t1.Latitude ) ) * cos( radians( t1.Longitude ) - radians(64.363333) ) + sin ( radians(31.589167) ) * sin( radians( t2.Latitude ) ) ) ) AS `distance` from table1 t1 inner join table1 t2 on t2.city > t1.city 

Aquí hay una función MySQL que tomará dos pares de latitud / longitud y le dará la distancia en grados entre los dos puntos. Utiliza la fórmula de Haversine para calcular la distancia. Como la Tierra no es una esfera perfecta, hay un error cerca de los polos y el ecuador.

  • Para convertir a millas, multiplique por 3961.
  • Para convertir a kilómetros, multiplica por 6373.
  • Para convertir a metros, multiplica por 6373000.
  • Para convertir a pies, multiplique por (3961 * 5280) 20914080.

    DELIMITER $$

    CREAR FUNCIÓN `haversine` (

      lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT ) RETURNS float NO SQL DETERMINISTIC COMMENT 'Returns the distance in degrees on the Earth between two known points of latitude and longitude. To get miles, multiply by 3961, and km by 6373' 

    EMPEZAR

     RETURN DEGREES(ACOS( COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * COS(RADIANS(lon2) - RADIANS(lon1)) + SIN(RADIANS(lat1)) * SIN(RADIANS(lat2)) )); 

    FIN;

    DELIMITER;

Aquí está la consulta y la función MySQL que se utilizan para obtener la distancia entre dos latitudes y longitudes y la distancia regresará en KM.

Mysql Query: –

 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 tu código PHP

 SELECT getDistance(lat,lng,$lat,$lng) as distance FROM your_table. 

Aquí hay una fórmula que convertí de https://www.geodatasource.com/developers/javascript

Es una función limpia y agradable que calcula la distancia en KM

 DELIMITER $$ CREATE DEFINER=`root`@`localhost` FUNCTION `FN_GET_DISTANCE`( lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE ) RETURNS double BEGIN DECLARE radlat1 DOUBLE; DECLARE radlat2 DOUBLE; DECLARE theta DOUBLE; DECLARE radtheta DOUBLE; DECLARE dist DOUBLE; SET radlat1 = PI() * lat1 / 180; SET radlat2 = PI() * lat2 / 180; SET theta = lng1 - lng2; SET radtheta = PI() * theta / 180; SET dist = sin(radlat1) * sin(radlat2) + cos(radlat1) * cos(radlat2) * cos(radtheta); SET dist = acos(dist); SET dist = dist * 180 / PI(); SET dist = dist * 60 * 1.1515; SET dist = dist * 1.609344; RETURN dist; END$$ DELIMITER ; 

También encontrará la misma función en diferentes idiomas en el sitio;