lugares longitud latitud guardar google geograficas entre encontrar distancia coordenadas con cercanos calcular mysql latitude-longitude

google - guardar latitud y longitud en mysql



consulta mySQL de longitud y latitud para otras filas dentro del radio de x millas (1)

Aquí está la consulta que uso en el localizador de tiendas con el que trabajo:

SELECT `id`, ( 6371 * acos( cos( radians( :lat ) ) * cos( radians( `lat` ) ) * cos( radians( `long` ) - radians( :long ) ) + sin(radians(:lat)) * sin(radians(`lat`)) ) ) `distance` FROM `location` HAVING `distance` < :distance ORDER BY `distance` LIMIT 25

:lat y :long son los puntos pasados ​​por el usuario donde lat y long son los puntos almacenados en la base de datos.

La distancia: se mide en millas, en la versión de trabajo del código, la distancia se extrae de un menú desplegable de 10 a 50 millas.

Cambiar el código para trabajar con kilómetros se puede lograr cambiando 3959 (la distancia desde el centro de la tierra a su superficie en millas) a 6371 (3959 millas convertidas a kilómetros) gracias a joshhendo para esa solución.

Tengo una base de datos poblada con aproximadamente 10k filas actualmente. Todos ellos tienen una longitud / latitud basada en el centro de un código postal. Encontré una consulta que ahora intento expandir, pero en general funciona bien hasta cierto punto. Sin embargo, en mi ejemplo a continuación, estoy tratando de encontrar cosas dentro de un radio de 25 millas, que en general parece funcionar en su mayor parte. La mayoría de mis resultados rinden dentro de los criterios de 25 millas, sin embargo, estoy recibiendo un puñado que están lejos de cualquier cosa desde 86 millas a 800 millas fuera de la marca.

Ejemplo: Este es mi centro lat / lon: 37.2790669, -121.874722 = San José, CA Obtuve resultados como: 33.016928, -116.846046 = San Diego, CA que está a unos 355 millas de San José.

mi consulta actual se ve así:

SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) * cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC"