2013-02-22 171 views
0

我在這裏發現了一些代碼,用數學方法找到兩個郵編碼之間的距離。我使用Google地理編碼api來獲取每個郵政編碼的長和寬。一切工作正常,但我不知道如何將$distance返回到英里轉換:當我測試使用PHP - 郵編距離函數轉換距離到英里

function calc_distance($zip1, $zip2) 
{ 
    $geo = new GoogleGeocode($apiKey); 
    $point1 = $geo->geocode($zip1); 
    $point1 = $point1['Placemarks'][0]; 
    echo "P1:"; print_r($zip1); 
    $point2 = $geo->geocode($zip2); 
    $point2 = $point2['Placemarks'][0]; 
    echo "<br>P2: "; print_r($zip2); echo "<br>"; 

    var_dump($point1); 
    echo "<br><br>"; 
    var_dump($point2); 
    echo "<br>"; 
    $radius  = 3958;  // Earth's radius (miles) 
    $deg_per_rad = 57.29578; // Number of degrees/radian (for conversion) 

    $distance = ($radius * pi() * sqrt(
       ($point1['Latitude'] - $point2['Latitude']) 
       * ($point1['Latitude'] - $point2['Latitude']) 
       + cos($point1['Latitude']/$deg_per_rad) // Convert these to 
       * cos($point2['Latitude']/$deg_per_rad) // radians for cos() 
       * ($point1['Longitude'] - $point2['Longitude']) 
       * ($point1['Longitude'] - $point2['Longitude']) 
     )/180); 

    echo $distance; 
    return $distance; // Returned using the units used for $radius. 
} 

calc_distance(28025, 22044);它返回:

P1:28025 
P2: 22044 
array(7) { ["Accuracy"]=> int(5) ["Country"]=> string(2) "US" ["AdministrativeArea"]=> string(2) "NC" ["Locality"]=> string(7) "Concord" ["PostalCode"]=> int(28025) ["Latitude"]=> float(35.3898417) ["Longitude"]=> float(-80.5216184) } 

array(7) { ["Accuracy"]=> int(5) ["Country"]=> string(2) "US" ["AdministrativeArea"]=> string(2) "VA" ["Locality"]=> string(12) "Falls Church" ["PostalCode"]=> int(22044) ["Latitude"]=> float(38.8607388) ["Longitude"]=> float(-77.1571443) } 
302.952750233 
+0

是不是已經有302英里的距離了?根據谷歌地圖的行程,這是有道理的。 – Tchoupi 2013-02-22 23:13:33

回答

2

用英里,因此返回的半徑距離以英里爲單位。您可能遇到的問題是您看到返回距離302與谷歌地圖370返回的距離之間的差異。這是因爲你的函數返回的距離返回了一個精確的點到點的距離......就像一架飛機從一個點飛到另一個點一樣。駕駛方向包括轉彎,因此距離將大於直線距離。我發現乘以1.25的直線距離通常會返回正確的結果。

+0

哦,當然。那麼我想它會做的是返回最接近的郵政編碼在半徑,這是我真的需要反正。謝謝你指出。 – iRector 2013-02-23 00:58:34