2010-07-13 93 views
7

我正在使用MySql的Grails 1.3.2。我需要将某些位置的经度和纬度存储在数据库中,然后根据用户的当前位置,我需要返回位于该位置特定半径范围内的项目。 所以,我们基本上有以下要求:如何在Grails中实现空间(地理位置)搜索?

  1. 搜索与-用户的当前坐标的给定半径
  2. 提供全文检索的地方。我们正在使用此搜索功能
  3. 在用户当前坐标的给定半径范围内执行全文搜索的组合。

我一直在寻找我们在这里的各种选项,并希望知道您的意见/建议,以实现这一点。我们在这里的各种选项有:

  1. Lucene的空间搜索(http://wiki.apache.org/lucene-java/SpatialSearch),并研究如何与搜索

  2. Grails的Solr的插件(http://www.grails.org/plugin/solr)使用它。但是这不会返回域对象。 (http://www.grails.org/plugin/stitches)。除作者网站(http://www.philliprhodes.com/content/stitches-30-seconds)外,没有太多文档。

  3. MySql空间扩展以及域类的所有字段上的全文索引。如果我们走这条路线,那么我们将不会使用可搜索的。

  4. 的Postgres /使用Hibernate空间(http://blog.mollusca.ch/2008/10/4/grails-spatial-data-postgis)PostGIS的整合

我认为,这是在与地图集成任何应用程序中很基本的要求。

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

感谢

回答

4

(我做了使用经度/纬度找到一个半径内的行了一个原型,但现在已经放弃了赞成GridRef系统在英国上市)

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

相反,试试这个:

  1. 想象圆半径地方=最大距离
  2. 使用了弯曲经线周围画一个框。
  3. 查找该框中的项目。

实际上,这意味着:

  1. 工作了多少度经度在给定纬度代表你的最大距离
  2. 工作了多少度北纬代表在给定的经度的最大距离(这当使用球形地球模型时,乘数将是固定的)。
  3. SELECT * FROM地方长> $西区,长< $东侧和LAT < $北侧和LAT> $南边

这意味着你做的非常简单的计算来得到一个模糊子集,覆盖面积约30 %比你的实际圈子大。如果您还想添加文本搜索,请选择FROM(子查询)或在上述简单比较之后添加您的文本子句,因为文本搜索的计算量很大。