2010-07-13 84 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(子查詢)或在上述簡單比較之後添加您的文本子句,因爲文本搜索的計算量很大。