我有一个包含 lat/lng 信息的地点数据库,我想创建一个 json 提要,该提要返回用户当前 lat/lng 半径 x 英里内的地点列表。做这样的事情的最好方法是什么?
我的 javascript 可能会使用当前的 lat/lng 进行 ajax 调用,后端将处理返回的位置。然后我将使用 js 渲染这些地方。(LMK 如果您认为这是处理此问题的最佳方式,如果是,后端逻辑如何工作?)
我有一个包含 lat/lng 信息的地点数据库,我想创建一个 json 提要,该提要返回用户当前 lat/lng 半径 x 英里内的地点列表。做这样的事情的最好方法是什么?
我的 javascript 可能会使用当前的 lat/lng 进行 ajax 调用,后端将处理返回的位置。然后我将使用 js 渲染这些地方。(LMK 如果您认为这是处理此问题的最佳方式,如果是,后端逻辑如何工作?)
查看地理编码器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)
嗯,postgres 有一个名为 postgis 的地理空间扩展,值得研究。我实际上对 sphinx 有更好的体验,它可以使用任何 db 表(mysql、mongo、sqlite,甚至 csv 或 xml)作为源。
你可以这样做:
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。