2010-04-16 190 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 

希望这会有所帮助。

相关问题