16

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

4

3 回答 3

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 <CoreLocation/CoreLocation.h>
于 2010-04-16T10:53:10.453 回答
5

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

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

给定 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.

可能有一种更简单的方法可以完全在球坐标的范围内完成此操作,但我在该领域的数学太模糊了——因此转换为笛卡尔坐标。

转换为笛卡尔坐标...

设 alpha 为纬度, beta 为经度。

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

不要忘记数学函数通常处理弧度,而纬度/经度处理度数。

于 2010-04-16T15:25:26.547 回答
1

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

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

自从 ...

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

我们的点积很简单...

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

其余的数学保持不变。

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

希望这可以帮助。

于 2010-04-16T18:09:28.633 回答