Как реализовать пространственный (гео-локационный) поиск в Grails? - PullRequest
7 голосов
/ 13 июля 2010

Я работаю над Grails 1.3.2 с MySql. Мне нужно сохранить широту и долготу определенных местоположений в базе данных, а затем на основе текущего местоположения пользователя мне нужно вернуть элементы, которые находятся в пределах определенного радиуса этого местоположения. Итак, в основном у нас есть следующие требования:

  1. Поиск мест с заданным радиусом текущих координат пользователя
  2. Обеспечить полнотекстовый поиск. В настоящее время мы используем поиск для этого
  3. Выполнить комбинацию полнотекстового поиска с заданным радиусом текущих координат пользователя.

Я изучал различные варианты, которые у нас есть, и хотел знать, каковы ваши взгляды / предложения по реализации этого. Различные варианты, которые мы имеем здесь:

  1. Пространственный поиск Lucene (http://wiki.apache.org/lucene-java/SpatialSearch) и узнайте, как использовать его с возможностью поиска

  2. Плагин Grails Solr (http://www.grails.org/plugin/solr). Но это не возвращает доменные объекты.

  3. Плагин Grails Stitches (http://www.grails.org/plugin/stitches). Не так много документации, кроме как на сайте автора (http://www.philliprhodes.com/content/stitches-30-seconds).

  4. Пространственное расширение MySql вместе с полнотекстовым индексом для всех полей класса домена. Если мы пойдем по этому пути, то мы вообще не будем использовать поиск.

  5. Интеграция Postgres / PostGIS с Hibernate-Spatial (http://blog.mollusca.ch/2008/10/4/grails-spatial-data-postgis)

Я считаю, что это очень основное требование в любом приложении, которое интегрируется с картами.

Итак, я действительно заинтересован в том, чтобы узнать наиболее подходящий способ реализации этой функции.

Спасибо

Ответы [ 2 ]

4 голосов
/ 26 июля 2010

(я создал прототип, используя Long / Lat для нахождения строк в радиусе, но теперь отказался от этого в пользу системы GridRef, доступной в Великобритании)

В качестве первого шага не используйте условие WHERE на основе вычисляемого поля (например, фактическое расстояние на основе заданной координаты и координаты строки).

Вместо этого попробуйте это:

  1. Представьте себе круг, где радиус = максимальное расстояние
  2. Нарисуйте рамку вокруг нее, используя кривые линии долготы.
  3. Найти предметы в этом ящике.

На практике это означает:

  1. определите, сколько градусов долготы соответствует вашему максимальному расстоянию на данной широте
  2. определите, сколько градусов широты представляет ваше максимальное расстояние на данной долготе (этот множитель будет фиксированным при использовании модели сферической земли).
  3. ВЫБРАТЬ * ОТ мест ГДЕ long> $ westside AND long <$ eastside AND lat <$ northside and lat> $ southside

Это означает, что вы делаете очень простые вычисления, чтобы получить неопределенное подмножество, покрывающее область примерно на 30% больше, чем ваш фактический круг. Если вы также хотите добавить текстовый поиск, либо ВЫБЕРИТЕ ОТ (подзапрос), либо добавьте текстовое предложение ПОСЛЕ простого сравнения выше, так как текстовый поиск требует больших вычислительных ресурсов.

1 голос
/ 02 августа 2012

Существует Grails Spatial плагин .Похоже, что некоторые из его подплагинов поддерживают поиск, например HDB плагин .

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