如何在Grails中实现空间(地理位置)搜索?

Him*_*shu 7 grails geospatial spatial-query spatial-index

我正在使用MySql处理Grails 1.3.2.我需要在数据库中存储某些位置的纬度和经度,然后根据用户的当前位置,我需要返回该位置特定半径范围内的项目.所以,我们基本上有以下要求:

  1. 搜索具有用户当前坐标的给定半径的位置
  2. 提供全文搜索.我们目前正在使用搜索功能
  3. 在用户当前坐标的给定半径内进行全文搜索的组合.

我一直在研究我们在这里的各种选项,并想知道您对此有何看法/建议.我们这里有各种选择:

  1. Lucene Spatial Search(http://wiki.apache.org/lucene-java/SpatialSearch)并研究如何使用它进行搜索

  2. Grails Solr插件(http://www.grails.org/plugin/solr).但是这不会返回域对象.

  3. Grails Stitches Plugin(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)

我相信这是与地图集成的任何应用程序中的一个非常基本的要求.

所以,我真的很想知道实现这个功能的最合适的方法.

谢谢

Emy*_*myr 4

(我使用经度/纬度制作了一个原型来查找半径内的行,但现在已放弃该原型,转而使用英国可用的 GridRef 系统)

第一步,不要使用基于计算字段的 WHERE 条件(例如,基于给定坐标和行坐标的实际距离)。

相反,试试这个:

  1. 想象一下半径 = 最大距离的圆
  2. 使用弯曲的经度线在其周围绘制一个框。
  3. 找到该盒子内的物品。

实际上这意味着:

  1. 计算出多少度的经度代表给定纬度处的最大距离
  2. 计算出多少纬度代表给定经度的最大距离(使用球形地球模型时此乘数将是固定的)。
  3. 从长 > $westside AND long < $eastside AND lat < $northside 和 lat > $southside 的地方选择 *

这意味着您只需进行非常简单的计算即可获得覆盖比实际圆大 30% 左右的区域的模糊子集。如果您也想添加文本搜索,请选择 SELECT FROM(子查询)或在上面的简单比较之后添加文本子句,因为文本搜索的计算成本很高。