/** * 距離計算 6378137地球半徑 米 * @param unknown_type $lat1 * @param unknown_type $lng1 * @param unknown_type $lat2 * @param unknown_type $lng2 * @return number */ public static function getDistance($lat1, $lng1, $lat2, $lng2) { $radLat1 = self::rad($lat1); $radLat2 = self::rad($lat2); $a = $radLat1 - $radLat2; $b = self::rad($lng1) - self::rad($lng2); $s = 2 * Asin(Sqrt(Pow(Sin($a/2),2) + Cos($radLat1)*Cos($radLat2)*Pow(Sin($b/2),2))); $s = $s * 6378137; $s = Round($s * 1000) / 1000; return $s; }
public static function distanceSimplify($lat1, $lng1, $lat2, $lng2) { $dx = $lng1 - $lng2; // 經度差值 $dy = $lat1 - $lat2; // 緯度差值 $b = ($lat1 + $lat2) / 2.0; // 平均緯度 $Lx = deg2rad($dx) * 6378137 * cos(deg2rad($b)); // 東西距離 $Ly = 6378137 * deg2rad($dy); // 南北距離 return sqrt($Lx * $Lx + $Ly * $Ly); // 用平面的矩形對角距離公式計算總距離 }
distanceSimplifyMore這個未實現測試
public static double distanceSimplifyMore(double lat1, double lng1, double lat2, double lng2, double[] a) { //1) 計算三個參數 double dx = lng1 - lng2; // 經度差值 double dy = lat1 - lat2; // 緯度差值 double b = (lat1 + lat2) / 2.0; // 平均緯度 //2) 計算東西方向距離和南北方向距離(單位:米),東西距離採用三階多項式 double Lx = (a[3] * b*b*b + a[2]* b*b +a[1] * b + a[0] ) * toRadians(dx) * 6367000.0; // 東西距離 double Ly = 6367000.0 * toRadians(dy); // 南北距離 //3) 用平面的矩形對角距離公式計算總距離 return Math.sqrt(Lx * Lx + Ly * Ly); }
經我測試,double[] a即便模擬測試,假設a[3]=1,a[2]=1,a[1]=1,a[0]=1去執行 100W次this
$num = 1000000; G('begin'); for($i = 0; $i < $num; $i++){ $this->getDistance('38.016141','114.56136','36.137427','120.437623'); } G('end'); echo 'getDistance'.G('begin','end',6).'s'.PHP_EOL; G('begin'); for($i = 0; $i < $num; $i++){ $this->distanceSimplify('38.016141','114.56136','36.137427','120.437623'); } G('end'); echo 'distanceSimplify'.G('begin','end',6).'s'.PHP_EOL; G('begin'); for($i = 0; $i < $num; $i++){ $this->distanceSimplifyMore('38.016141','114.56136','36.137427','120.437623'); } G('end'); echo 'distanceSimplifyMore'.G('begin','end',6).'s'.PHP_EOL; die;
getDistance2.288000s
distanceSimplify1.308000s
distanceSimplifyMore1.187000scode
distanceSimplify與getDistance有明顯效果,而distanceSimplifyMore效果不明顯get