2013-02-22 61 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