Найти записи с X Милями известной точки в рельсах - PullRequest
1 голос
/ 10 июля 2010

У меня есть таблица, содержащая несколько записей с их координатами long / lat. Я пытаюсь выполнить обычный поиск типа «Показать все в пределах X миль», где моя точка отправления - это текущая длина / широта пользователя с использованием геолокации в браузере.

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

Если есть решение для рубина / рельса, это здорово, в противном случае любые предложения будут оценены.

Ответы [ 4 ]

2 голосов
/ 10 июля 2010

Если ваша база данных поддерживает пространственные данные, обязательно используйте их. Мне нравится геокит, но мне нужно было делать запросы на основе пространственных данных, а не выбирать все и фильтровать через ГИС. Мы работаем с SQL Server 2005, который не поддерживает пространственные данные (2008 поддерживает). Вот что я должен был сделать:

  def self.within_distance(miles, from_longitude, from_latitude)
    self.scoped(:conditions => ["((DEGREES(ACOS(SIN(RADIANS(:from_latitude)) *
                                SIN(RADIANS(latitude)) + 
                                COS(RADIANS(:from_latitude)) *
                                COS(RADIANS(latitude)) * 
                                COS(RADIANS(:from_longitude - longitude))))) * 69.09) < :miles", 
                                {:from_longitude => from_longitude, :from_latitude => from_latitude, :miles => miles}])
  end

Я надеюсь, что вам удастся избавиться от боли, когда вы помещаете это или что-то подобное, но пока это сработало как шарм.

1 голос
/ 11 июля 2010

проверьте поисковый плагин Thinking sphinx для рельсов: http://freelancing -god.github.com / ts / en / geosearching.html

1 голос
/ 10 июля 2010

Вы должны взглянуть на пространственные расширения для выбранной вами базы данных, Postres и Mysql оба поддерживают эти расширения.

Затем вы можете посмотреть некоторые доступные гемы, чтобы добавить поддержку ГИС в Rails. Geokit является одним примером.

0 голосов
/ 10 июля 2010

Если ваша база данных не поддерживает пространственные данные, одной простой возможностью оптимизировать поиск будет вычисление таблицы с координатами «квадрата сетки» - установите произвольное разрешение сетки, скажем, 10 миль, определите, какой квадрат сетки каждая запись находится, и хранить эту информацию. Тогда запрос может сказать что-то вроде «где grid_x> = 5 и grid_x <= 7 и grid_y> = 13 и grid_y <= 15», чтобы сервер выполнял грубую фильтрацию, а затем вычисляет фактические расстояния на стороне клиента. </p>

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