如何计算两个纬度和经度点之间的距离?

时间:2010-04-16 10:29:51

标签: iphone math map coordinates latitude-longitude

我有特定地方的纬度和经度,我想计算距离,所以我该如何计算呢?

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:5)

这可能不是最有效的方法,但它会起作用。

您可以将纬度和经度指定的两个位置视为向量。假设坐标已转换为caresion坐标,请计算两个向量的点积。

鉴于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。

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

现在你以弧度为单位的两个向量之间的角度。因此,当穿越地球表面时两点之间的距离是......

distance = theta * R.

在球面坐标的上下文中可能有一种更简单的方法可以做到这一点,但我在该区域的数学太模糊 - 因此转换为笛卡尔坐标。

转换为笛卡儿坐标...

设alpha为纬度,beta为经度。

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

不要忘记数学函数通常以弧度为单位,纬度/经度以度为单位。

答案 2 :(得分:1)

我已经完成了数学计算,现在可以大大简化解决方案。

想象一下,如果我们旋转地球,使我们的第一个矢量位于纬度0度和经度0度。第二个矢量位于(alpha2 - alpha1)度纬度和(beta2 - beta1)度纬度。

自......

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

我们的dot产品简化为......

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

剩下的数学保持不变。

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

希望这有帮助。