我一直在使用Rails的GeoKit,它工作得很好。然而,我注意到,当拉动大量的清单,它是非常缓慢的加载。
我想知道这是因为它在返回结果之前查询谷歌或一些外部来源。如果是这样的话,有没有一种方法可以使用原始的后期lng坐标(我有)来简单地计算内部距离?
或者一个简单的ruby公式来为我做这些?
距离:
Geokit-gem提供了一个计算两点之间距离的方法:
# model has acts_as_mappable
Model.distance_between obj1, obj2, :units => :kms, :formula => :sphere
Finder-wise:
Geokit-rails(一个插件)有一个查找器,生成SQL (mysql, postgres和SQL server)来计算距离,让您找到在一定距离内的行:
Model.find_within(100, :units => :kms)
计算所有行的距离,但不需要查询外部资源。如果你的表真的很大,它可能会有所帮助(但我不确定它会)通过预先计算lat/lng范围来缩小它:
Model.where(:lat => (x-0.05)..(x+0.05), :lng => (y-0.05)..(y+0.05)).find_within(z, :units => :kms)
如果这仍然没有帮助,你将不得不写一些定制的SQL。sql距离计算geokit-rails在这里:https://github.com/andre/geokit-rails/tree/master/lib/geokit-rails/adapters
可以用球面的公式来计算球面上两点的距离。
下面是计算经纬度之间距离的JavaScript实现(以及其他一些有用的东西)。翻译成ruby应该不需要太多的脑力劳动;-)
http://www.movable-type.co.uk/scripts/latlong.html