7

我正在使用 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 插件 ( 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 )

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

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

谢谢

4

2 回答 2

4

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

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

相反,试试这个:

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

在实践中,这意味着:

  1. 计算出多少度经度代表您在给定纬度的最大距离
  2. 计算出多少度的纬度代表您在给定经度处的最大距离(使用球形地球模型时,该乘数将是固定的)。
  3. SELECT * FROM places WHERE long > $westside AND long < $eastside AND lat < $northside and lat > $southside

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

于 2010-07-26T10:47:43.563 回答
1

有一个Grails Spatial 插件。看起来它的一些子插件确实支持搜索,比如HDB 插件

于 2012-08-02T07:32:30.613 回答