球面余弦定律在MySQL和PHP之间有不同的结果


Spherical Law of Cosines different results between MySQL and PHP

在我们的应用程序中,我们使用PHP使用余弦球面定律公式计算到坐标之间的距离。不过,这并没有很好地扩展,所以我重构了代码以计算 MySQL 中的距离。
当我比较PHP计算和MySQL计算之间的结果时,我看到了主要差异。

Lat       | Lng        | PHP     | MySQL
47.457131 | -10.615383 | 1112.8  | 7604.07
61.265367 | 19.939854  | 1508.5  | 6905.3
56.64524  | -21.312707 | 1745.6  | 8589.3
37.028064 | 18.732122  | 1957.5  | 4954.33
38.823754 | -17.029437 | 2112    | 7856.57
70.687405 | 11.08298   | 2217.1  | 7969.53

所有这些距离都是在这些坐标和(纬度:51.0363432,LN:3.7351858(之间计算的。

这是它在PHP中的计算方式

public function getDistance($longitude, $latitude)
{
    $pi = pi();
    $dist = (
            (
            acos(
                sin($latitude * $pi / 180)
                *
                sin($this->latitude * $pi / 180)
                +
                cos($latitude * $pi / 180)
                *
                cos($this->latitude * $pi / 180)
                *
                cos(($longitude - $this->longitude) * $pi / 180)
            )
            ) * 180 / $pi
        ) * 60 * 1.1515;
    $metric = $dist / 0.62137;
    return $metric;
}

这就是它在 SQL 中的计算方式

public static function getDistanceQuery($lat, $lng, $distance_name, $units)
{
    /*
     *  Allow for changing of units of measurement
     */
    switch ($units) {
        case 'mi':
            //radius of the great circle in miles
            $gr_circle_radius = 3959;
            break;
        default:
            //radius of the great circle in kilometers
            $gr_circle_radius = 6371;
            break;
    }
    /*
     *  Generate the select field for distance
     */
    $distance_select = sprintf(
        "ROUND(
            ( %d
                * acos(
                    cos( radians(%s) )
                    * cos( radians( latitude ) )
                    * cos( radians( longitude ) - radians(%s) )
                    + sin( radians(%s) )
                    * sin( radians( latitude ) )
                )
            )
        , 2 )
        AS %s ",
        $gr_circle_radius,
        $lat,
        $lng,
        $lat,
        $distance_name
    );
    return $distance_select;
}

这些巨大差异是由于SQL中的精度更高,还是其中一个代码有问题?

我发现了这个问题,我应该在假设之前手动完成数学。纬度和经度被翻转了调用MySQL代码的函数。
结果现在彼此非常接近,小数差异很小。