Запрашиваемая информация о геолокации? - PullRequest
6 голосов
/ 15 января 2011

У меня есть запрос, который пытается найти вещи в определенной геолокации, но результаты, которые он возвращает, немного ... странны.

Ранее я писал эту ветку, и сообщество помогло мне найти нужную формулу: Запросы по долготе и широте в MySQL , но запрос теперь дает действительно странные результаты.

Мои данные окружают город Сан-Франциско, который имеет широту / долготу 37.780182 , -122.517349

Запрос:

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

Итак, как вы видите - даже если я сделаю радиус 10000, он все равно не найдет много, поэтому мне интересно, выключен ли мой запрос. Некоторые из результатов, которые он возвращает, даже имеют 0,0 для широты / долготы, что является моим способом обозначить отсутствие широты / долготы для этой записи.

Вот как должна выглядеть формула:

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;

Спасибо и извините за мучительно длинный вопрос! Кстати, я использую MySQL.


Хм,

Я только что попытался выполнить точный запрос, и он работал с точностью до 50%. Вот пример набора данных:

    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 |

Итак, теперь запрос вернул все предметы, которые были за много миль, но не предметы, которые были за 100 миль. Как этот пункт (37.787144, -122.493263) никогда не возвращался, даже если он находится всего в 50 милях от исходной точки. Вы случайно не знаете почему?

1 Ответ

12 голосов
/ 15 января 2011

Я думаю, что вы изменили широту (37.780182) и долготу (-122.517349) своей центральной точки, попробуйте:

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
...