Запросы в пределах долготы и широты в MySQL - PullRequest
23 голосов
/ 14 января 2011

Прежде чем запрашивать конкретные примеры кода, я просто хотел спросить, возможно ли сделать запрос примерно так: псевдокод:

выбор элементов из таблицы, где широта / долгота = - в x милях от определенной точки широты / долготы

Это выполнимо? Или я должен прыгать через некоторые обручи? Любые хорошие подходы, которые можно было бы рекомендовать, были бы великолепны!

Ответы [ 2 ]

54 голосов
/ 14 января 2011

Вы должны искать формулу Хаверсайна, но хорошее начало может быть:

Ссылаясь на первый URL:

Вот оператор SQL, который найдет ближайшие 20 мест в радиусе 25 миль от координаты 37, -122. Он вычисляет расстояние на основе широты / долготы этой строки и целевой широты / долготы, а затем запрашивает только те строки, в которых значение расстояния меньше 25, упорядочивает весь запрос по расстоянию и ограничивает его 20 результатами. Для поиска по километрам вместо миль замените 3959 на 6371.

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;
6 голосов
/ 14 января 2011

Я бы настоятельно рекомендовал использовать SpatiaLite или PostGIS для такого рода операций.Они встроили те функции, которые вы пытаетесь передать вручную.Они также имеют надлежащую поддержку пространственных данных, которых на самом деле нет в MySQL.

Не совсем решение в MySQL, но лучшее решение, если вы хотите продолжать выполнять пространственные запросы в будущем.

...