2010-04-16 192 views
16

我有特定地點的經度和緯度,我想計算距離,所以我怎麼計算它?如何計算經度和緯度兩點之間的距離?

+3

你不能從經度和緯度獲得距離。距離需要兩個緯度和經度。 – 2010-04-16 10:34:00

+1

這已經是幾個最近的SO問題的主題,看看周圍。 – 2010-04-16 10:34:11

+0

我有2緯度和經度... – 2010-04-16 10:39:44

回答

32
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1]; 
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:lat2 longitude:long2]; 
NSLog(@"Distance i meters: %f", [location1 distanceFromLocation:location2]); 
[location1 release]; 
[location2 release]; 

您還需要添加CoreLocation.framework到您的項目,並添加import語句:

#import <CoreLocation/CoreLocation.h> 
5

這可能不是這樣做的最有效的方法,但它會奏效。

您可以將經緯度指定的兩個位置視爲向量。假定座標已被轉換成cartesion座標,計算兩個向量的點積。

由於V1 =(X1,Y1,Z1)和V2 =(X2,Y2,Z2),然後...

v1 dot v2 = magnitude(v1) * magnitude(v2) * cos (theta) 

便利,V1和V2的幅度是一樣的..地球的半徑(R)。

x1*x2 + y1*y2 + z1*z2 = R*R*cos(theta) 

解決θ。

theta = acos ((x1*x2 + y1*y2 + z1*z2)/(R * R)); 

現在你有兩個向量之間的角度弧度。愨當旅行橫跨地球的表面是這樣的兩個點的距離...

distance = theta * R. 

有可能是一個更簡單的方法完全球面座標的範圍內做到這一點,但我在這方面的數學太模糊 - 因此轉換爲笛卡爾座標。

要轉換成直角座標系...

讓阿爾法是緯度,和β是經度。

x = R * cos (alpha) * cos (beta) 
y = R * sin (alpha) 
z = R * cos (alpha) * sin (beta) 

不要忘記,數學函數通常以弧度爲單位,緯度/經度以度爲單位。

+3

請注意,這是一個近似值,因爲地球更像是一個扁球體(它變成梨形,更準確),其表面不平整。 – outis 2010-04-16 18:32:35

+1

請參閱'proj.4'網站,以瞭解地球使用球形模型的錯誤(http://trac.osgeo.org/proj/wiki/GeodesicCalculations)。底線,他們說,如果你爲R選擇一個好的價值,你可以用這種方法在1%以內。 – mtrw 2010-04-17 00:00:35

+0

+1。據推測,這個答案可能是「如何計算一個大圓路線」(航海導航術語)。 UPVOTE免責聲明:我沒有能力驗證這個數學。我只是羨慕製作它的能力,我推崇清晰的表述。 – Smandoli 2010-04-19 15:49:16

1

我已經完成了數學計算,現在可以大大簡化解決方案。

想象一下,如果我們旋轉地球,使我們的第一個矢量在0度和0度的經度。第二個矢量將位於(alpha2 - alpha1)緯度和(beta2 - beta1)緯度。

由於...

sin(0) = 0 and cos(0) = 1 

我們的點積simplies到...

cos(delta_alpha) * cos(delta_beta) = cos(theta) 

數學的其餘部分保持不變。

theta = acos (cos(delta_alpha) * cos(delta_beta)) 
distance = radius * theta 

希望這會有所幫助。

相關問題