纬度/经度之间的距离


10

我正在尝试计算两个纬度/经度点之间的距离。我有一段代码大部分都是我从这篇文章中摘录的,但是我不太了解它是如何工作的。

这是代码:

<?php
// POINT 1
$thisLat = deg2rad(44.638);
$thisLong = deg2rad(-63.587);

// POINT 2
$otherLat = deg2rad(44.644);
$otherLong = deg2rad(-63.911);

$MeanRadius = 6378 - 21 * sin($lat1);

$xa = (Cos($thisLat)) * (Cos($thisLong));
$ya = (Cos($thisLat)) * (Sin($thisLong));
$za = (Sin($thisLat));

$xb = (Cos($otherLat)) * (Cos($otherLong));
$yb = (Cos($otherLat)) * (Sin($otherLong));
$zb = (Sin($otherLat));

$distance = $MeanRadius * Acos($xa * $xb + $ya * $yb + $za * $zb);

echo $distance;
?>

我有几个问题:

  1. xa,ya,za是什么?我知道它们是3D笛卡尔平面上的点,但是它们相对于哪里?地球的中心?
  2. 这如何cos($xa * $xb + $ya * $yb + $za * $zb)计算点之间的距离?我知道在2D模式下我会这样做:

替代文字

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. 这将有多精确?在另一页上对此进行了一些讨论。但是我特别想使用距离来判断用户是否位于彼此之间10m,20m或50m之内。我可以做到这一点吗?
  2. 我应该做什么用$MeanRadius?这个值合理吗?我认为该值假定地球是椭圆形。

Answers:


17

这是通用的糟糕代码,因为它可能给出错误的结果,甚至在短距离内完全失败。请改用Haversine公式

(在其上的代码是基于转换上的两个点的式(未椭圆)插入在他们的三维笛卡尔坐标(XA,YA,ZA)和(XB,YB,ZB)单元球并形成其点积,该点积将等于它们之间的角度的余弦值。ACos函数返回该角度,当按地球半径缩放比例时,将估算距离。问题在于,小角度的余弦(以弧度表示大小“ e”)与1的差接近e ^ 2/2。当e小于浮点精度两倍的平方根时,这消失在浮点误差云中。如果您以单精度进行计算,这意味着e小于0.001(大约一公里)的值将与零混淆!在双精度模式下,截止值大约为e = 10 ^ -8,但是到e = 10 ^ -4左右(约10米)时,您可能会失去这么多精度,您需要担心,,内置了一些高精度的内部计算))。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.