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

时间:2009-11-03 02:05:46

标签: math algorithm

我想创建一个函数,使用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

3 个答案:

答案 0 :(得分:15)

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

假设您位于(lat0,long0)并且您想知道以“纬度单位”为单位的距离(lat1,long1)。

水平(EW)距离大致为

d_ew = (long1 - long0) * cos(lat0)

这乘以cos(lat0)来说明经度线在高纬度地区越来越靠近。

垂直(NS)距离更容易

d_ns = (lat1 - lat0)

所以两点之间的距离是

d = sqrt(d_ew * d_ew + d_ns * d_ns)

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

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

答案 1 :(得分:3)

好吧,既然你的点彼此靠近,那么球体的表面几乎是平的,所以只需找到三维空间中点的坐标,找到每个点的(x,y,z),其中

x = r*sin(lat)*cos(long)
y = r*sin(lat)*sin(long)
z = r*cos(lat)

其中r是球体的半径。 或类似的东西取决于你如何定义lat / long。一旦你有两个xyz坐标,只需使用sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2)。你真的不能只使用2D毕达哥拉斯理论,因为你需要得到合理的二维坐标,这很难。

答案 2 :(得分:1)

你会经常看到这个符号'dy,dx'代表差异y和差异x。你只需计算出两个轴上的差异,得到两个差异的平方根,根据理论得到平方。(炒作的总和等于另外两个边的平方)。

var dx:Number = x1-x2;
var dy:Number = y1-y2;
var distance:Number = Math.sqrt(dx*dx + dy*dy);

希望这很清楚