返回当前位置x英里半径内的地点列表

时间:2012-11-14 06:48:36

标签: javascript ruby-on-rails ruby google-maps

我有一个包含lat / lng信息的地方数据库,我想创建一个json feed,它返回用户当前lat / lng半径x英里范围内的地点列表。做这样的事情最好的方法是什么?

我的javascript可能会使用当前的lat / lng进行ajax调用,后端将处理返回的地方。然后我将使用js渲染这些地方。 (LMK如果您认为这是处理此问题的最佳方法,那么,后端逻辑如何工作?)

3 个答案:

答案 0 :(得分:3)

查看Geocoder宝石。它支持ActiveRecord和几个数据库引擎,包括PostgreSQL。

如果您拥有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)

答案 1 :(得分: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并在routes.rb中添加get 'find_places'

实际上,在find_places.js.erb文件中进行计算的结果会更加“Ruby”风格,该文件可以访问您的控制器实例变量。在这种情况下,您根本不需要使用json。

答案 2 :(得分:0)

嗯,postgres有一个名为postgis的地理空间扩展,值得研究。我实际上有更好的sphinx经验,它可以使用任何db表(mysql,mongo,sqlite,甚至csv或xml)作为源。