經緯度計算距離

@link http://www.cnblogs.com/ycsfwhh/archive/2010/12/20/1911232.htmlphp

@link http://blog.csdn.net/b_h_l/article/details/8657040html

這裏講的很具體,說實話菜鳥沒看到。git

下面只是我用php抄的,本身作下筆記。.net

class LantitudeLongitudeDist{
    const EARTH_RADIUS = 6378137;//赤道半徑(單位m)

    /**
     * 轉化爲弧度(rad)
     * */
    private static function rad($d)
    {
       return (float)($d * pi() / 180.0);
    }

    /**
     * 基於餘弦定理求兩經緯度距離
     * @param lon1 第一點的經度
     * @param lat1 第一點的緯度
     * @param lon2 第二點的經度
     * @param lat3 第二點的緯度
     * @return 返回的距離,單位m
     * */
    public static function dist($lon1, $lat1, $lon2, $lat2) {
        $radLat1 = self::rad($lat1);
        $radLat2 = self::rad($lat2);

        $radLon1 = self::rad($lon1);
        $radLon2 = self::rad($lon2);

        if ($radLat1 < 0)
            $radLat1 = pi() / 2 + abs($radLat1);// south
        if ($radLat1 > 0)
            $radLat1 = pi() / 2 - abs($radLat1);// north
        if ($radLon1 < 0)
            $radLon1 = pi() * 2 - abs($radLon1);// west
        if ($radLat2 < 0)
            $radLat2 = pi() / 2 + abs($radLat2);// south
        if ($radLat2 > 0)
            $radLat2 = pi() / 2 - abs($radLat2);// north
        if ($radLon2 < 0)
            $radLon2 = pi() * 2 - abs($radLon2);// west
        $x1 = self::EARTH_RADIUS * cos($radLon1) * sin($radLat1);
        $y1 = self::EARTH_RADIUS * sin($radLon1) * sin($radLat1);
        $z1 = self::EARTH_RADIUS * cos($radLat1);

        $x2 = self::EARTH_RADIUS * cos($radLon2) * sin($radLat2);
        $y2 = self::EARTH_RADIUS * sin($radLon2) * sin($radLat2);
        $z2 = self::EARTH_RADIUS * cos($radLat2);

        $d = sqrt(($x1 - $x2) * ($x1 - $x2) + ($y1 - $y2) * ($y1 - $y2)+ ($z1 - $z2) * ($z1 - $z2));
        //餘弦定理求夾角
        $theta = acos((self::EARTH_RADIUS * self::EARTH_RADIUS + self::EARTH_RADIUS * self::EARTH_RADIUS - $d * $d) / (2 * self::EARTH_RADIUS * self::EARTH_RADIUS));
        $dist = $theta * self::EARTH_RADIUS;
        return $dist;
    }


}
$r = LantitudeLongitudeDist::dist('116.4609990000', '39.9272240000', '116.4685450000', '39.9278320000');
echo $r;
exit();
相關文章
相關標籤/搜索