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 スティッチ プラグイン ( http://www.grails.org/plugin/stitches )。著者のサイト ( http://www.philliprhodes.com/content/stitches-30-seconds ) を除いて、多くのドキュメントはありません。

  4. ドメイン クラスのすべてのフィールドの全文インデックスに加えて、MySql 空間拡張。このルートに進むと、 searchable をまったく使用しなくなります。

  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% 大きい領域をカバーする漠然としたサブセットを取得することを意味します。テキスト検索も追加する場合は、SELECT FROM (サブクエリ) または上記の単純な比較の後にテキスト句を追加します。テキスト検索は計算コストがかかるためです。

于 2010-07-26T10:47:43.563 に答える
1

Grails Spatial プラグインがあります。HDB pluginのように、サブプラグインの一部が検索をサポートしているようです。

于 2012-08-02T07:32:30.613 に答える