【问题标题】:Where did I go wrong with Haversine calculation in php?我在 php 中的 Haversine 计算哪里出错了?
【发布时间】:2013-10-07 09:47:54
【问题描述】:

我有 3 种方法,看起来几乎一样,但结果却不同...

class GeoCalculations {

    const EARTH_RADIUS = 6371000;

    public function degToRad($deg)
    {
        return $deg * pi() / 180;
    }

    public function haversineDistance($lat_long_1, $lat_long_2) {
        $lat_1 = $this->degToRad($lat_long_1->lat);
        $lng_1 = $this->degToRad($lat_long_1->lng);
        $lat_2 = $this->degToRad($lat_long_2->lat);
        $lng_2 = $this->degToRad($lat_long_2->lng);

        $d_lat = $lat_2 - $lat_1;
        $d_lng = $lng_2 - $lng_2;

        echo "-----------------\n";
        var_dump($lat_1);
        var_dump($lng_1);
        var_dump($lat_2);
        var_dump($lng_2);
        var_dump($d_lat);
        var_dump($d_lng);
        echo "-----------------\n";

        $cord_length = pow(sin($d_lat / 2), 2) + cos($lat_1) * cos($lat_2) * pow(sin($d_lng / 2), 2);
        $central_angle = 2 * atan2(sqrt($cord_length), sqrt(1 - $cord_length));

        return self::EARTH_RADIUS * $central_angle;
    }

    public function haversineDistance2($lat_long_1, $lat_long_2)
    {
        $lat_1 = deg2rad($lat_long_1->lat);
        $lng_1 = deg2rad($lat_long_1->lng);
        $lat_2 = deg2rad($lat_long_2->lat);
        $lng_2 = deg2rad($lat_long_2->lng);

        $d_lat = $lat_2 - $lat_1;
        $d_lng = $lng_2 - $lng_2;

        echo "-----------------\n";
        var_dump($lat_1);
        var_dump($lng_1);
        var_dump($lat_2);
        var_dump($lng_2);
        var_dump($d_lat);
        var_dump($d_lng);
        echo "-----------------\n";

        $angle = 2 * asin(sqrt(pow(sin($d_lat / 2), 2) + cos($lat_1) * cos($lat_2) * pow(sin($d_lng / 2), 2)));

        return $angle * self::EARTH_RADIUS;
    }

    public function haversineDistance3($lat_long_1, $lat_long_2)
    {
        $latFrom = deg2rad($lat_long_1->lat);
        $lonFrom = deg2rad($lat_long_1->lng);
        $latTo = deg2rad($lat_long_2->lat);
        $lonTo = deg2rad($lat_long_2->lng);

        $latDelta = $latTo - $latFrom;
        $lonDelta = $lonTo - $lonFrom;

        echo "-----------------\n";
        var_dump($latFrom);
        var_dump($lonFrom);
        var_dump($latTo);
        var_dump($lonTo);
        var_dump($latDelta);
        var_dump($lonDelta);
        echo "-----------------\n";

        $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
        return $angle * self::EARTH_RADIUS;
    }
}

$new = new GeoCalculations();

$circle_1 = (object) array('lat' => 36.06228, 'lng' => -79.60886);
$circle_2 = (object) array('lat' => 36.10926, 'lng' => -79.54423);

var_dump($new->haversineDistance($circle_1, $circle_2));
var_dump($new->haversineDistance2($circle_1, $circle_2));
var_dump($new->haversineDistance3($circle_1, $circle_2));

打印出来:

-----------------
浮点数(0.6294055217761)
浮点数(-1.3894367207592)
浮点数(0.63022547745869)
浮动(-1.3883087144636)
浮动(0.00081995568258686)
浮动(0)
-----------------
浮动(5223.9376537609)
-----------------
浮动(0.6294055217761)
浮动(-1.3894367207592)
浮动(0.63022547745869)
浮动(-1.3883087144636)
浮动(0.00081995568258697)
浮动(0)
-----------------
浮动(5223.9376537616)
-----------------
浮动(0.6294055217761)
浮动(-1.3894367207592)
浮动(0.63022547745869)
浮动(-1.3883087144636)
浮动(0.00081995568258697)
浮动(0.0011280062955641)
-----------------
浮动(7811.4545246093)

第三个结果是正确的,但我不明白前两个有什么问题?

【问题讨论】:

  • 不是解决方案,但可以使用内置的deg2rad()函数。

标签: php haversine


【解决方案1】:

前两个有:

$d_lng = $lng_2 - $lng_2;

而不是:

$d_lng = $lng_2 - $lng_1;

(相当于第三个例子中的这一行):

$lonDelta = $lonTo - $lonFrom;

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2013-12-25
    • 2016-08-02
    相关资源
    最近更新 更多