2011-01-15 16 views
6

Tengo una consulta que intenta encontrar cosas dentro de una cierta geolocalización, pero los resultados que trae consigo son un poco ... extraños.¿Está buscando cosas cerca de una geolocalización?

Anteriormente había publicado este hilo y la comunidad me ayudó a encontrar una fórmula que necesitaba: Querying within longitude and latitude in MySQL pero la consulta ahora da resultados realmente extravagantes.

Mis datos es que rodea la ciudad de San Francisco, que tiene el lat/lng 37.780182 , -122.517349

Consulta:

SELECT 
    id, 
    hike_title, 
    lat, 
    lng, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(37.780182)) 
        + sin(radians(-122.517349)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    my_awesome_table 
HAVING 
    distance < 10000 
ORDER BY 
    distance 
LIMIT 
    0 , 50 

Así que como ves - incluso si hago radio de 10.000 todavía doesn' No encuentro mucho, así que me pregunto si mi consulta está desactivada. Algunos de los resultados que trae incluso tienen 0,0 para lat/lng, que es mi manera de indicar que no hay lat/lng para ese registro.

Aquí es cómo se supone que la fórmula para parecerse a:

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

Gracias y lo siento por el largo y doloroso pregunta! Por cierto, estoy usando MySQL.


Hmmm,

he intentado con la consulta exacta que diste y funcionó con 50% de precisión. Aquí está una muestra del conjunto de datos:

lat   lng  
| 37.223465 | -122.090363 | 
| 39.320980 | -111.093735 | 
| 38.031715 | -84.495132 | 
| 37.787144 | -122.493263 | 
| 52.975361 | -1.458620 | 
| 40.848557 | -111.906883 | 
| 40.572498 | -111.859718 | 

Así que ahora la consulta devuelve todos los elementos que se encontraban muchas millas de distancia, pero no los artículos que estaban debajo de 100 millas de distancia. Al igual que este elemento (37.787144, -122.493263) nunca fue devuelto, aunque está a solo 50 millas del punto de origen. ¿Sabrías por qué?

+3

Por qué no está usando extensiones espaciales de MySQL que proporcionan funciones para este tipo de cosas? http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html –

+1

Acabo de leer algunos de los temas allí. No estoy seguro de entenderlo demasiado bien todavía, pero posiblemente parezca excesivo para mis necesidades. ¿Hace las cosas mucho más rápidas para consultar? ¿Crees que es una solución mucho mejor que la que estamos discutiendo en este hilo? ¡Gracias! – Genadinik

Respuesta

12

Creo que revirtió la latitud (37.780182) y longitud (-122,517349) de su punto central, Proveedores:

select 
    id, 
    hike_title, 
    lat, 
    lng, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(-122.517349)) 
        + sin(radians(37.780182)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    my_awesome_table 
HAVING 
    distance < 10000 
ORDER BY 
    distance 
LIMIT 
    0 , 50 
+0

Cómo convertir 'distancia' a metros? –

Cuestiones relacionadas