数学相关的PHP问题+纬度

时间:2009-03-19 20:14:54

标签: php google-maps geolocation distance

我在PHP页面中找到了一个函数来计算2点之间的里程数,但是它有问题。它应该与谷歌地图一起使用,但距离的差异在谷歌地图中的范围是1.3到1.65倍(更准确)。

这是功能:

$M =  69.09 * rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));

我发现它有点复杂,我不太了解几何学,不知道这是不正确的。

有更多专业知识的人可以看看这个,看看它有什么问题吗?

7 个答案:

答案 0 :(得分:5)

也许你正在比较'距离像乌鸦一样'(两点之间的直线)与行驶距离?

另外,see this post用于计算PHP中两点之间的距离。

答案 1 :(得分:2)

您正在寻找Haversine formula来计算您拥有经度和纬度的两个点之间的距离。

在Javascript can be found here中直接实现它,应该很容易转换为PHP。

答案 2 :(得分:2)

至少有三种不同的计算地球表面距离的方法,这些方法的准确性和计算要求各不相同。

  1. Spherical Law of Cosines [不是很好 准确,非常简单的计算]
  2. Haversine Formula [准确,除了距离较远,计算起来相对简单]
  3. Vincenty Formula [非常准确,可以使用地球表面的几种不同的椭球模型,计算起来比较复杂]
  4. 您提供的示例似乎是余弦计算法则,而Google地图更准确,因为它使用了Vincenty公式。 (我发现Vincenty链接比维基百科页面更详细地解释了公式)

    编辑:我在上面看到一条评论,表明地球表面偏差引起的误差是微不足道的,不能构成你所看到的错误。我担心这只会在非常大的距离上实现。在几百公里或更短的距离,误差可能是非常重要的。

答案 3 :(得分:1)

这是一个更简单的版本,但对于非常遥远的位置不准确:

    const ONE_DEGREE = 111120;

public function distance( $point ) {
    $coef = cos( $this->getLatitude() / 180 * M_PI );
    $x = $this->getLatitude() - $point->getLatitude();
    $y = ( $this->getLongitude() - $point->getLongitude() ) * $coef;
    $result = sqrt( $x * $x + $y * $y ) * self::ONE_DEGREE;
    return $result;
}

$ point和$ this是带有getLatitude()和getLongitude()方法的Location类的实例。

答案 4 :(得分:0)

我对几何学一无所知,但google建议this page。也许你会发现它很有用

答案 5 :(得分:0)

看起来您正在引用的计算使用球面坐标系。公式几乎是正确的。可能导致计算失败的部分原因是您正在使用的半径。 69.09是球体的半径(在这种情况下是地球)。你可能知道,地球不是一个真正的球体,更像是一个椭圆体。我建议尝试下面的表述:

3963 * acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2)));

要获得更准确的结果,您需要使用Vincenty或Haversine计算。

编辑:为了澄清,我并不是要暗示您报告的大部分错误是由于使用球面坐标计算。这个错误比你看到的要小得多。我提供的公式调整旨在成为公式的更清晰版本,因为69.09是调整到度数系统的地球半径的值,这比简单地使用弧度更不直观。此外,值得注意的是,为了计算非常小的距离,只要进行计算的系统使用足够的小数位,使用上面的公式就是高度准确的(低至约1米距离)。在现代计算中使用浮点数可以提供这种准确性。

答案 6 :(得分:0)

看起来公式是准确的 - 例如,请参阅Wikipedia on "great circle distance"。我相信,前面69.09的因子是沿着一个大圆圈测量的一度的英里数(例如赤道1度经度的英里数),所以你的答案将以英里为单位。

jonstjohn认为你可能错误地将直线距离与驾驶距离进行比较似乎是对我最可能的解释。

编辑:或者它可能是维基百科提到的舍入错误,如果你正在处理小分离。但我会首先指出直接/驾驶距离差异。