1

緯度/経度情報を含む場所のデータベースがあり、ユーザーの現在の緯度/経度から半径 x マイル以内にある場所のリストを返す json フィードを作成したいと考えています。このようなことをする最善の方法は何ですか?

私の JavaScript は現在の緯度/経度で ajax 呼び出しを行う可能性が高く、バックエンドは返される場所を処理します。次に、js を使用してそれらの場所をレンダリングします。(LMK がこれを処理する最善の方法であると思われる場合、そうであれば、バックエンド ロジックはどのように機能しますか?)

4

3 に答える 3

3

Geocoder gemをチェックしてください。ActiveRecord と、PostgreSQL を含むいくつかの DB エンジンをサポートしています。

Venueモデルがある場合は、それにジオコーディングを追加して、次のようなことを行うことができます。

nearby_places = Venue.near([lat, long], distance)

このプロジェクトのGitHubには、高度なクエリの例もあり、以下に完全に引用されています。


オブジェクトをクエリする場合 (ActiveRecord を使用している場合)、 within_bounding_box スコープを使用して、半径 (円) ではなく正方形内を調べることもできます。

distance = 20
center_point = [40.71, 100.23]
box = Geocoder::Calculations.bounding_box(center_point, distance)
Venue.within_bounding_box(box)

これにより、特に緯度/経度列のインデックスと組み合わせて使用​​すると、クエリのパフォーマンスが大幅に向上します。ただし、返される結果には、距離と方位の属性が含まれないことに注意してください。パフォーマンスを向上させ、距離と方位情報にアクセスしたい場合は、両方のスコープを使用してください。

Venue.near(center_point, distance).within_bounding_box(box)
于 2012-11-14T09:27:51.657 に答える
0

次の方法で実行できます。

1) JavaScript ブロックから ajax 呼び出しを行います。

$.ajax({
  url: '<%= url_for :action => :find_places  %>', 
  data: {
    lat: $('#lat_field').val(),
    ing: $('#ing_field').val()
  },
  dataType: 'json',
  success: function( data ) {
    response( $.map( data, function( places ) {
      // do something with places
      // like places.name and so on
      // this function will be called for each item in json array
    }));
  }   
});

2)コントローラーでこのアクションをキャッチします

def find_places
  @places_array = Array.new
  @places_array[0] = {:name => ' ...', :others => '...'}
  respond_with @places_array.to_json
end

3)respond_to :jsonコントローラーの先頭とget 'find_places'routes.rb に追加することを忘れないでください。

実際には、コントローラーのインスタンス変数にアクセスできる find_places.js.erb ファイルで計算結果を進めるのがより「Ruby」スタイルになります。この場合、json を使用する必要はまったくありません。

于 2012-11-14T09:44:13.850 に答える
0

うーん、postgres には postgis と呼ばれる地理空間拡張機能があり、調べる価値があります。私は実際に、任意の db テーブル (mysql、mongo、sqlite、さらには csv または xml) をソースとして使用できる sphinx の経験が豊富です。

于 2012-11-14T11:14:48.510 に答える