2012-01-24 15 views
23

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.mySQL consulta de longitud y latitud para otras filas dentro del radio x milla

Ejemplo: Esta es mi centro de latitud/longitud: 37.2790669, -121,874722 = San Jose, CA Im consiguiendo resultados como: 33.016928, -116.846046 = San Diego, CA, que es de 355 millas de San José.

mi consulta actual se parece a:

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" 

Respuesta

72

Ésta es la consulta que uso en el localizador de tiendas 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 del pasado por parte del usuario, donde lat y long son los puntos almacenados en la base de datos.

El: La distancia se mide en millas, en la versión de trabajo del código del: distancia es en realidad sacó de una gota que van desde 10-50 millas

Cambiar el código para trabajar con kilómetros se puede lograr mediante 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.

+1

contento de que funcionó para usted – Gordnfreeman

+3

Gordnfreeman, ¿puede decirme qué significa "<25"? ¿Eso es 25 millas o kilómetros? ¿Y tengo otra pregunta para ti si no te importa entrar en una conversación rápida conmigo? – dcolumbus

+0

¿Hay alguna manera en que podamos convertir esto fácilmente para usar KM's? Supongo que tiene algo que ver con el 3935 al comienzo de la consulta, pero no estoy seguro de qué hace. – joshhendo

Cuestiones relacionadas