@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();