Encuentre puntos dentro de una distancia usando MySQL

15

Tengo una tabla mySQL con nombre de usuario, latitud y longitud del usuario. Me gustaría obtener una lista de usuarios que están dentro del círculo o cuadrado de una latitud y longitud dada con una distancia dada. Por ejemplo, mi entrada Lat = 78.3232 y Long = 65.3234 y distancia = 30 millas. Me gustaría obtener la lista de usuarios que se encuentran a una distancia de 30 millas del punto 78.3232 y 65.3234. ¿Es posible resolver esto con una sola consulta? ¿O puedes darme una pista para comenzar a resolver esta consulta? Soy nuevo en la información basada en información geográfica.

    
pregunta shihab K 16.08.2012 - 18:44

4 respuestas

20

La declaración SQL que encontrará las 20 ubicaciones más cercanas que se encuentran dentro de un radio de 30 millas a la coordenada 78.3232, 65.3234. Calcula la distancia en función de la latitud / longitud de esa fila y la latitud / longitud de destino, y luego solicita solo filas en las que el valor de la distancia sea inferior a 30 millas, ordena la consulta completa por distancia y la limita a 20 resultados. Para buscar por kilómetros en lugar de millas, reemplace 3959 con 6371.

SELECT
  id, (
    3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
  ) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;

Esto está usando la API de Google Maps v3 con un backend MySQL que ya tienes.

enlace

    
respondido por el Mapperz 16.08.2012 - 18:52
27

La respuesta de Mapperz no es válida. El seno debe calcularse a partir de la latitud y NO de la longitud. Así que la declaración SQL correcta es:

SELECT
    id, (
      3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;
    
respondido por el Marek Čačko 22.07.2013 - 15:51
1

Puede ser una base para crear una función ... para que pueda reutilizarla en otras áreas. También haría su consulta un poco más limpia ... Al menos eso es mi 2 centavos.

DELIMITER $$

create function calcDistance(lat float, lng float, pnt_lat float, pnt_lng float)

Returns float
BEGIN

Declare dist float;
SET dist =
  3959 * acos (
  cos ( radians(pnt_lat) )
  * cos( radians( lat ) )
  * cos( radians( lng ) - radians(pnt_lng) )
  + sin ( radians(pnt_lat) )
  * sin( radians( lat ) )
);

RETURN dist;

END
    
respondido por el eDriven_Levar 19.10.2016 - 00:55
0

Aquí está mi variante de consulta, parece un poco más fácil ( enlace )

SELECT 
    *
FROM 
    'locator'
WHERE
    SQRT(POW(X('center') - 49.843317 , 2) + POW(Y('center') - 24.026642, 2)) * 100 < 'radius'
    
respondido por el dexxtr 23.04.2014 - 07:18

Lea otras preguntas en las etiquetas