2013-08-03 58 views
3

如何計算PHP中兩個緯/長座標之間的每個緯/長座標?計算兩個緯/長座標之間的x個小數位的所有座標

可以說我有座標A:

(39.126331, -84.113288) 

和座標B:

(39.526331, -84.213288) 

我將如何計算這兩個緯度/經度座標之間的每一個可能的座標(在直接線)向上到小數點後五位(例如39.12633,-84.11328),並獲得兩者之間的座標列表?

另外,我還有一個組關閉,而不是稍微A和B.

座標之間的軌道上的座標(座標C)的我怎麼能計算距離座標C和最接近的座標之間A和B之間?

+0

你說的一個座標的「名單」的意思。你想要兩個人之間的每一個可能的協調,有6個有效數字?或者你想要兩點之間的線的方程?還是你想要完全的東西? –

+0

是的,兩者之間的每一個可能的座標,有5位有效數字就足夠了。我會澄清我的問題。謝謝。 –

+0

如果您包含最終用途以及您已經嘗試過的內容,它將有助於SO用戶。你的計算將產生一個非常大的排列列表。爲什麼你想在算法更好的時候將它們全部列出來? – nickhar

回答

0

以下是解決了這個對我來說,

function point_to_line_segment_distance($startX,$startY, $endX,$endY, $pointX,$pointY) 
{ 

     $r_numerator = ($pointX - $startX) * ($endX - $startX) + ($pointY - $startY) * ($endY - $startY); 
     $r_denominator = ($endX - $startX) * ($endX - $startX) + ($endY - $startY) * ($endY - $startY); 
     $r = $r_numerator/$r_denominator; 

     $px = $startX + $r * ($endX - $startX); 
     $py = $startY + $r * ($endY - $startY); 

     $closest_point_on_segment_X = $px; 
     $closest_point_on_segment_Y = $py; 

     $distance = user_bomb_distance_calc($closest_point_on_segment_X, $closest_point_on_segment_Y, $pointX, $pointY); 

     return array($distance, $closest_point_on_segment_X, $closest_point_on_segment_Y); 
} 

function user_bomb_distance_calc($uLat , $uLong , $bLat , $bLong) 
{ 
    $earthRadius = 6371; #km 
    $dLat = deg2rad((double)$bLat - (double) $uLat); 
    $dlong = deg2rad((double)$bLong - (double) $uLong); 

    $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad((double)$uLat)) * cos(deg2rad((double)$bLat)) * sin($dlong/2) * sin($dlong/2); 


    $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); 
    $distance = $earthRadius * $c; 

    $meter = 1000; //convert to meter 1KM = 1000M 

    return intval($distance * $meter) ; 
} 
0

您可以計算所有緯度對的voronoi圖,然後查找相鄰的單元。還要注意,緯度是角度而不是世界座標或笛卡爾座標。你可以下載我的PHP類voronoi圖@ phpclasses.org。

相關問題