2011-07-09 141 views
0

我正在研究一個工具,它可以從列表中找到與用戶當前位置相比最接近的緯度/經度位置。該列表將會很長,並且會在智能手機上運行,​​因此我希望儘可能簡化和快速地進行計算。從我讀過的主題來看,計算兩個緯度/經度位置之間相當準確的距離有點複雜,我擔心速度。我的問題是,我可以使用類似於以下內容來獲得最接近列表位置的合理結果並使用它嗎?緯度/經度距離問題

$distance = sqrt((($firstLongitude-$secondLongitude)*($firstLongitude-$secondLongitude))+(($firstlLatitude-$secondLatitude)*($firstLatitude-$secondLatitude))); 

我知道這個例子是在PHP中,但邏輯應該是明顯的。所以我的問題是,將使用上述邏輯來確定從經緯度位置列表最接近的位置給我正確的結果,或者是否有我缺少的潛在問題?

這個應用程序只會運行在美國的地點,如果這有什麼區別。

注意: 我也想知道是否可以進一步簡化並刪除sqrt部分,因爲我只是想看看哪個更接近,而不是更接近它。

回答

1

不,計算結果不會顯示正確。結果假定這些緯度/經度是正常點,但實際上他們是度。所以你也需要在計算中考慮這一點。

使用下面的公式。作爲比較對某些網絡或UI活動

$1 = lat1 
$2 = long1 
$3 = lat2 
$4 = long2 

case when 
($1 = $3 and $2 = $4) then 0 
else 1609.344 * 60 * 1.1515 * (180/pi()) * acos(sin($1 * pi()/180) * sin($3 * pi()/180) + cos($1 * pi()/180) * cos($3 * pi()/180) * cos(($2 - $4) * pi()/180)) 
4

以下是準確如果點是其他各 10000公里之內,並且如果假設地球爲球形算術公式是不那麼重。如果您只想要比較距離 ,請使用d2。距離是以km爲單位的近似距離。

deg = pi/180; 
phi1 = lat1 * deg; 
phi2 = lat2 * deg; 
lam12 = (lon2 - lon1) * deg; 

d2 = (cos(phi1) * sin(phi2) - sin(phi1) * cos(phi2) * cos(lam12))^2 
+ (cos(phi2) * sin(lam12))^2; 

a = 6371.009; // kilometers 
distance = a * asin(sqrt(d2)); 

爲了更加準確,您需要將地球視爲一個橢球;請參閱我的在線測地計算器 http://geographiclib.sf.net/cgi-bin/Geodhttp://arxiv.org/abs/1102.1215的報價。

相關問題