【问题标题】:geokit -- using raw lat lng in railsgeokit -- 在 rails 中使用原始 lat lng
【发布时间】:2011-07-28 13:41:01
【问题描述】:

我一直在使用 GeoKit for Rails,效果很好。但是,我注意到当拉出很多列表时,加载速度非常慢。

我想知道是不是因为它在返回结果之前正在查询谷歌或一些外部来源。如果是这样,有没有办法使用原始 lat lng 坐标(我有)在内部简单地计算距离?

或者一个简单的红宝石公式可以为我做到这一点?

【问题讨论】:

  • “拉货”是什么意思?您是否尝试在某个点的特定距离内查找模型的所有实例?

标签: ruby-on-rails ruby ruby-on-rails-3 geolocation geokit


【解决方案1】:

距离方面:

Geokit-gem 提供了一种计算两点距离的方法:

# model has acts_as_mappable
Model.distance_between obj1, obj2, :units => :kms, :formula => :sphere

查找器方面:

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。 geokit-rails 的 sql 距离计算在这里: https://github.com/andre/geokit-rails/tree/master/lib/geokit-rails/adapters

【讨论】:

  • 谢谢——还有其他不太准确的论坛吗(当然更便宜)
  • 我很困惑——如果我已经在模型中调用了 obj1 和 obj2 代表什么?
  • 你在类上调用它(它是一个类方法),obj1obj2 是实例。
【解决方案2】:

您可以使用球体的公式来计算表面上两点的距离。

这是一些用于计算纬度/经度之间距离的 JavaScript 实现(以及其他一些有用的东西)。翻译成红宝石不应该是太多的脑力劳动;-)

http://www.movable-type.co.uk/scripts/latlong.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    相关资源
    最近更新 更多