MySQL долгота и широта запроса для других строк в радиусе х миль - PullRequest
34 голосов
/ 25 января 2012

У меня есть база данных, заполненная примерно 10 тысячами строк. У всех них есть долгота / широта, основанная на центре почтового индекса. Я нашел запрос, который сейчас пытаюсь расширить, но в целом он работает хорошо до определенного момента. Тем не менее, в моем примере ниже я пытаюсь найти вещи в радиусе 25 миль, что в целом, похоже, работает по большей части. Большинство моих результатов дают результаты в рамках критерия 25 миль, однако я получаю горстку, которые находятся далеко от 86 до 800 миль от отметки.

Пример: Это мой центр широта / долгота: 37.2790669, -121.874722 = Сан-Хосе, Калифорния Я получаю такие результаты, как: 33.016928, -116.846046 = Сан-Диего, Калифорния, что примерно в 355 милях от Сан-Хосе.

мой текущий запрос выглядит так:

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"

1 Ответ

94 голосов
/ 25 января 2012

Вот запрос, который я использую в локаторе магазина, с которым я работаю:

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 и :long - это точки, пройденные пользователем, где lat и longточки, хранящиеся в базе данных.

: Расстояние измеряется в милях, в рабочей версии кода: расстояние фактически определяется из выпадающего списка в диапазоне 10-50 миль

Изменить код для работы с километрами можно, изменив 3959 (расстояние от центра Земли до ее поверхности в милях) на 6371 (3959 миль в километрах) благодаря Джошендо за это решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...