1

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

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

4

3 回答 3

3

查看地理编码器gem。它支持 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)
于 2012-11-14T09:27:51.657 回答
0

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

于 2012-11-14T11:14:48.510 回答
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 回答