2010-04-23 41 views
1

我有這個PHP函數,但它似乎給出了錯誤的結果。有沒有人知道它有什麼問題(尤其是公式)?地理目的地公式

/** 
* Finds a destination given a starting location, bearing and distance. 
* 
* @param array $startingCoordinates The starting coordinates, as non-directional floats in an array with lat and lon keys. 
* @param float $bearing The initial bearing in degrees. 
* @param float $distance The distance to travel in km. 
* 
* @return array The desitination coordinates, as non-directional floats in an array with lat and lon keys. 
*/ 
public static function findDestination(array $startingCoordinates, $bearing, $distance) { 
     $startingCoordinates['lat'] = (float)$startingCoordinates['lat']; 
     $startingCoordinates['lon'] = (float)$startingCoordinates['lon']; 
     $angularDistance = $distance/Maps_EARTH_RADIUS; 
     $lat = asin(
         sin($startingCoordinates['lat']) * cos($angularDistance) + 
         cos($startingCoordinates['lat']) * sin($angularDistance) * cos($bearing) 
     ); 
     return array(
       'lat' => $lat, 
       'lon' => $startingCoordinates['lon'] + atan2(
         sin($bearing) * sin($angularDistance) * cos($startingCoordinates['lat']), 
         cos($angularDistance) - sin($startingCoordinates['lat']) * sin($lat) 
       ) 
     ); 
} 
+0

你能詳細說明「錯誤的結果」是什麼樣的嗎?我不認爲有太多的人願意安裝它,獲得一些實際的座標,並計算錯誤描述。 – 2010-04-23 17:21:57

+0

你是否在尋找http://stackoverflow.com/questions/2548943/gps-format-in-php/2548996#2548996?不能告訴上述代碼失敗了30年代的規則。 – Gordon 2010-04-23 17:24:24

+0

當我用紐約的座標(40.7142691,-74.0059729)以及不同的距離和方向來運行時,我最終每次都得到相同的結果。 0度,10公里 - > 0.12643539666731,-74.0059729 0度,100公里 - > 0.12643539666731,-74.0059729 0度,100公里 - > 0.12643539666731,-74.0059729 90度,10公里 - > 0.12643539666731,-74.0059729 90度, 100km - > 0.12643539666731,-74.0059729 90度,100km - > 0.12643539666731,-74.0059729 似乎很不正確:) – 2010-04-24 11:12:15

回答

1

的弧度,所以你首先需要基於度值轉換爲,然後再回到一個有意義的價值給你的計算工作。例如:

public static function findDestination(array $startingCoordinates, $bearing, $distance) { 
     $startingCoordinates['lat'] = deg2rad((float)$startingCoordinates['lat']); 
     $startingCoordinates['lon'] = deg2rad((float)$startingCoordinates['lon']); 
     $bearing = deg2rad($bearing); 
     $angularDistance = $distance/Maps_EARTH_RADIUS; 
     $lat = asin(
      sin($startingCoordinates['lat']) * cos($angularDistance) + 
      cos($startingCoordinates['lat']) * sin($angularDistance) * cos($bearing) 
     ); 
     return array(
      'lat' => rad2deg($lat), 
      'lon' => rad2deg($startingCoordinates['lon'] + atan2(
        sin($bearing) * sin($angularDistance) * cos($startingCoordinates['lat']), 
        cos($angularDistance) - sin($startingCoordinates['lat']) * sin($lat) 
      )) 
     ); 
} 

測試與findDestination(array('lat' => 40.7142691, 'lon' => -74.0059729), 90, 1000)給出40.714268492616,-73.994108059287的結果,我覺得更像是你要尋找的。