Как получить места с определенным радиусом - PullRequest
2 голосов
/ 12 августа 2011

У меня есть база данных мероприятий, каждая из которых может проводиться в течение 3 дней, каждый день содержит почтовый индекс.

Таким образом, база данных выглядит так (+ много других полей)

enter image description here

В другой базе данных у меня есть информация о географическом местоположении (почтовый индекс, лат, длинный)

enter image description here

Теперь пользователи могут вводить туда почтовый индекс ипоявится радиус и действия в этом радиусе.

Вопрос:

1 - Как лучше всего это сделать?

Решение на уме

Просмотрите все возможные почтовые индексы из действий и присоединитесь к ним на таблице Geo, чтобы получить их Lat / Lng

затем, когда пользователь ищет почтовый индекс, получи Lat / Lng и выполни математическое уравнение, чтобы получить все почтовые индексы рядом с этой точкой.

Но я не думаю, что с точки зрения производительности это хорошопуть, так как мне придется применить запрос на 3000+ действий

Коды, найденные для расстояния

  • Поиск местоположений поблизости с MySQL (формула Haversine)

    SELECT id, (3959 * acos (cos (радианы (37)) * cos (радианы (широта)) * cos (радианы (lng) - радианы (-122)) + sin (радианы (37)) * sin (радианы (широты)))) AS расстояние от маркеров HAVING расстояние <25 ORDER BY distance LIMIT 0, 20; </p>

Что вы, ребята, думаете?

Ответы [ 2 ]

0 голосов
/ 25 августа 2011

Я ошибся с точки зрения производительности, запросу потребовалось менее 0,5 секунды, чтобы вычислить расстояние для 3000+ действий.

0 голосов
/ 12 августа 2011

Для этого вам потребуется ГИС (и использовать пространственный индекс), но mysql на это не способен - функциональность mysql ГИС может обрабатывать только прямоугольники. PostreSQL поддерживает ГИС.

Самым простым будет математическое выражение. Было бы лучше, если бы вы могли использовать некоторые спроецированные координаты (широта и долгота - координаты сферы). Конвертируйте всю базу данных в этой спроектированной системе координации и просто используйте простое выражение (без необходимости использовать тригонометрические функции):

(активность_x - postal_code_x) ^ 2 + (активность_y - postal_code_y) ^ 2 <расстояние ^ 2 </p>

обратите внимание, что Земля является сферой, что означает, что она будет работать только на меньших расстояниях (скажем, <1000 км). Но в любом случае я думаю, что вам не нужен точный круг ... </p>

...