我想创建一个函数,使用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
答案 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);
希望这很清楚