Использовать пространственную способность MySQL или поиск по широте для функциональности Rails 3 «Store Locator»? - PullRequest
1 голос
/ 20 ноября 2010

У меня есть приложение на Rails 3, и у меня есть пара вариантов поддержки для поддержки.

  • Store Locator с указанием адреса или почтового индекса.

  • Графическое отображение того, откуда происходят пользователи.

В первом случае мне нужна скорость и точность для функции типа "Где купить".

Во втором случае мне не нужны супер точные данные, достаточно взять все, что возвращает IP-сервис.Я в основном хочу создать карту Google с застрявшей в ней связкой.

У меня сейчас нет опыта в этом.Я счастлив написать Javascript, и я установил GeoKit для геокодирования (слово, которое я могу написать по буквам, но которое пока не совсем понятно).Я ценю любую помощь, которую вы можете предложить.

Я знаю, что MySQL имеет пространственные расширения, и обновления выглядят так, как будто они будут действительно простыми.Возможно, это раздельное решение, когда я использую пространственную информацию для хранения местоположений магазина, а затем просто получаю местоположение пользователя по его IP-адресу.

Для случая использования сайта имеет ли смыслсканировать файл журнала в реальном времени или хранить обращения в базе данных?

1 Ответ

3 голосов
/ 22 ноября 2010

Геокодирование - это преобразование чего-то вроде адреса или почтового индекса в координаты широты и долготы.

Я использую API геокодирования Google , хотя ограничение на количество запросов в день составляет 2500, еслиВы являетесь пользователем Google Maps API Premier.Это очень быстро (почти каждый запрос моего приложения на Rails занимает менее 0,1 секунды) и точно.Однако прочитайте, поскольку есть больше информации о том, что такое геокодирование.

Я использую широту / долготу, возвращенную из геокодирования, для запроса к моей базе данных MySQL, что является довольно дорогим запросом, но все же выполняется очень быстроменее 0,1 секунды) над моей достаточно маленькой таблицей (около 10000 объектов с широтой / долготой).Вот запрос, который я использую (замените {LAT} и {LNG} вашими значениями lat и long):

SELECT
whatever, 3963.191 * ACOS((SIN(RADIANS({LAT}))*SIN(RADIANS(lat))) +(COS(RADIANS({LAT}))*cos(RADIANS(lat))*COS(RADIANS(lng)-RADIANS({LNG})))) AS distance
FROM things
HAVING distance < 30
ORDER BY distance;
...