我有一个包含lat / lng信息的地方数据库,我想创建一个json feed,它返回用户当前lat / lng半径x英里范围内的地点列表。做这样的事情最好的方法是什么?
我的javascript可能会使用当前的lat / lng进行ajax调用,后端将处理返回的地方。然后我将使用js渲染这些地方。 (LMK如果您认为这是处理此问题的最佳方法,那么,后端逻辑如何工作?)
答案 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)作为源。