【发布时间】:2015-01-29 14:54:23
【问题描述】:
我正在尝试使用 PHP 中的 equirectangular 近似公式计算两个纬度/经度坐标之间的距离,但对于某些经度坐标,我得到的结果与半正弦公式(我知道这是正确的)不同。
define('EARTH_RADIUS', 6371);
function equirectangularRad($latFrom, $lngFrom, $latTo, $lngTo) {
$latDelta = $latTo - $latFrom;
$lngDelta = $lngTo - $lngFrom;
$x = $lngDelta * cos(($latFrom + $latTo) * .5);
$radius = sqrt(($x * $x) + ($latDelta * $latDelta));
return $radius * EARTH_RADIUS;
}
似乎总是计算穿过本初子午线而不是最短距离的距离。即沿赤道从坐标(lat=0,long=-180)到(lat=0,long=180),距离应该为零。相反,该函数返回地球沿赤道的周长;大约40030公里。
问题似乎源于$lngDelta 的计算,但对于任何编程语言,我能找到的所有实现都使用相同的公式。我是否遗漏了一些重要的细节,或者这个公式真的不能替代haversine(忽略明显的准确性差异)?
供参考;这是我使用的haversine实现:
function haversineRad($latFrom, $lngFrom, $latTo, $lngTo) {
$latDelta = $latTo - $latFrom;
$lngDelta = $lngTo - $lngFrom;
$latSin = sin($latDelta * .5);
$lngSin = sin($lngDelta * .5);
$radius = 2. * asin(sqrt(($latSin * $latSin) + cos($latFrom) * cos($latTo) * ($lngSin * $lngSin)));
return $radius * EARTH_RADIUS;
}
【问题讨论】:
-
$lngDelta = ($lngTo - $lngFrom) % 360;? -
@mudasobwa,模 360(或者更确切地说 2 * pi)不起作用。某处需要反转。我使用
$lngDelta = abs($lngTo - $lngFrom); $lngDelta = min($lngDelta, (2 * pi()) - $lngDelta);取得了一些有限的成功,但这仍然会在两极处产生相当大的误差(我可以忍受)并且几乎将其减慢到大致与半正弦的速度(这使得使用等矩形近似毫无意义)。跨度>
标签: php distance geo haversine