2010-07-13 22 views
7

Estoy trabajando en Grails 1.3.2 con MySql. Necesito almacenar la latitud y la longitud de ciertas ubicaciones en la base de datos y luego, en función de la ubicación actual del usuario, debo devolver los elementos que se encuentran dentro de un radio particular de esa ubicación. Así que básicamente tienen los siguientes requisitos:¿Cómo implementar la búsqueda espacial (Geo-Location) en Grails?

  1. Búsqueda de lugares con-en un radio determinado de los actuales coordenadas del usuario
  2. Proporcionar una búsqueda de texto completo. Actualmente estamos utilizando búsquedas para este
  3. Realice una combinación de búsqueda de texto completo dentro de un radio dado de las coordenadas actuales del usuario.

He estado buscando en las diversas opciones que tenemos aquí y quería saber cuáles son sus puntos de vista/sugerencias para implementar esto. Las distintas opciones que tenemos aquí son:

  1. Lucene espacial Búsqueda (http://wiki.apache.org/lucene-java/SpatialSearch) y examinar la manera de utilizarlo con búsquedas

  2. Grails Plugin Solr (http://www.grails.org/plugin/solr). Pero esto no devuelve objetos de dominio.

  3. Grails Stitches Plugin (http://www.grails.org/plugin/stitches). No hay mucha documentación, excepto en el sitio del autor (http://www.philliprhodes.com/content/stitches-30-seconds).

  4. extensión espacial MySql junto con un índice de texto completo en todos los campos de la clase de dominio. Si tomamos esta ruta, no utilizaremos búsquedas en absoluto.

  5. PostgreSQL/PostGIS integración con Hibernate-espacial (http://blog.mollusca.ch/2008/10/4/grails-spatial-data-postgis)

yo creo que esto es un requisito muy básico en cualquier aplicación que se integra con los mapas.

Por lo tanto, estoy realmente interesado en conocer la forma más adecuada de implementar esta funcionalidad.

Gracias

Respuesta

4

(hice un prototipo utilizando Lat/Long para encontrar filas dentro de un radio, pero ahora he abandonado que en favor del sistema GridRef disponible en el Reino Unido)

Como primer paso, no use una condición WHERE basada en un campo calculado (por ejemplo, la distancia real basada en la coord dada y la coord de la fila).

lugar, tratar esto:

  1. imaginar el círculo donde radio = distancia max
  2. dibujar una caja alrededor de ella utilizando las líneas de longitud curvas.
  3. Encuentra los artículos dentro de esa caja.

En la práctica esto significa:

  1. calcular cuántos grados de longitud representa la distancia máxima a la latitud dada
  2. calcular cuántos grados de latitud representar a su distancia máxima a la longitud dada (esto el multiplicador se fijará cuando se use un modelo esférico-terrestre).
  3. SELECT * FROM lugares donde a largo> $ Westside Y mucho < $ Eastside y LAT < $ Northside y lat> $ Southside

Esto significa que haces cálculos muy simples para conseguir un subconjunto vago que cubre un área de aproximadamente 30 % más grande que tu círculo real. Si también desea agregar una búsqueda de texto, SELECCIONE DE (subconsulta) o agregue su cláusula de texto DESPUÉS de la comparación simple anterior, ya que las búsquedas de texto son computacionalmente costosas.

Cuestiones relacionadas