计算坐标之间的距离 - 硬编码值会产生不同的结果

时间:2012-04-26 16:59:59

标签: php

我正在尝试计算PHP中两个地理坐标之间的距离(我知道之前已经覆盖了很多次,请耐心等待)。距离通常在100米到50公里之间,我想要的精确度可能是1米。我正在使用的坐标从数据库中检索为精确到15个小数位的字符串(例如"48.862815856933594, 2.344875574111938")。

我尝试了常见的Haversine算法,它似乎有效,并且还尝试了这里描述的Vincenty算法:https://stackoverflow.com/a/10054282/1239254它似乎再次起作用。

然而,结果与使用相同算法的基于Web的计算器有点不同,所以我挖得更深一些。事实证明,如果我将纬度和经度值硬编码为浮点数,我的结果与预期的距离相匹配,但如果我使用从数据库中检索到的字符串值,我只有几个百分点。

我已经回应了这些值,以检查它们是否没有被截断或者像这样的任何愚蠢,它们看起来很好。还有什么其他建议可能是我的问题吗?

编辑: 这是我目前使用的基于Vincenty的代码

public function calculate_distance(){
    $this->treasures = $this->get_treasures();

    $step = $this->treasures[5];                    //48.862815856933594, 2.344875574111938
    $nextStep = $this->treasures[6];                //48.853218078613281, 2.348813056945801

    $latFrom = deg2rad(floatval($step['lat']));
    $lonFrom = deg2rad(floatval($step['lon']));
    $latTo = deg2rad(floatval($nextStep['lat']));
    $lonTo = deg2rad(floatval($nextStep['lon']));

    $earthRadius = 6371000;

    $lonDelta = $lonTo - $lonFrom;
    $a = pow(cos($latTo) * sin($lonDelta), 2) + pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
    $b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);

    $angle = atan2(sqrt($a), $b);
    $this->distance = $angle * $earthRadius;

    return $this->distance;
}

使用此代码我得到的返回值为1067.2242562782,但是对注释中的数字进行硬编码会得到值1105.4164933704

0 个答案:

没有答案