用毕达哥拉斯定理计算两点之间的距离

cak*_*rus 6 algorithm math

我想创建一个函数,使用pythag定理而不是半正弦大圆公式来计算两对纬度/长度之间的距离.由于这将是相对较短的距离(3公里),我认为这个假定平坦地球的版本应该没问题.我怎样才能做到这一点?我问互联网并没有提出任何有用的东西.:)

谢谢.

编辑:

这是我想出来的(似乎工作):

def get_dist(lat0, lng0, lat1, lng1)
  begin
    d_ew = (lng1.to_f - lng0.to_f) * Math.cos(lat0.to_f)
    d_ns = (lat1.to_f - lat0.to_f)
    d_lu = Math.sqrt(d_ew.to_f * d_ew.to_f + d_ns.to_f * d_ns.to_f)
    d_mi = ((2*Math::PI*3961.3)/360)*d_lu
    return d_mi
  rescue Exception => ex
    logger.debug "[get_dist] An exception occurred: #{ex.message}"
    return -1
  end
end
Run Code Online (Sandbox Code Playgroud)

Ewa*_*odd 15

如果您希望所涉及的距离与地球的大小相比较小,则可以使用简单的毕达哥拉斯三角形.

假设您位于(lat0,long0)并且您想知道"纬度单位"中与点(lat1,long1)的距离.

水平(EW)距离大致为

d_ew = (long1 - long0) * cos(lat0)
Run Code Online (Sandbox Code Playgroud)

将其乘以cos(lat0)以说明经度线在高纬度处变得更近.

垂直(NS)距离更容易

d_ns = (lat1 - lat0)
Run Code Online (Sandbox Code Playgroud)

所以两点之间的距离是

d = sqrt(d_ew * d_ew + d_ns * d_ns)
Run Code Online (Sandbox Code Playgroud)

您可以针对更严格的任务优化此方法,但这应该足以比较距离.

事实上,为了比较距离,比较d平方就可以了,这意味着你可以省略sqrt操作.

  • 好.让我们在谷歌尝试这个:`2*pi*3959/360`看起来像是69.0975851英里.保留尽可能多的有效数字,直到最后一步.你不会在其他任何地方找到"纬度单位"这个词,我把这个词当作了.因此,如果您的纬度和长度都是度数,则将d乘以此数字乘以*近似*以英里为单位的距离.0.0023*69.0975851 miles = 0.158924445 miles.将其舍入到与0.0023相同的精度,它的距离为0.16英里.如果它与你的预期略有不同,请不要起诉我. (2认同)
  • 小调整:将`* cos(lat0)` 替换为`* cos(average(lat0, lat1))`。对距离有一个更好的近似。 (2认同)