如何计算经度和纬度两点之间的距离?
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>
这可能不是这样做的最有效的方法,但它会奏效。
您可以将经纬度指定的两个位置视为向量。假定坐标已被转换成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)
不要忘记,数学函数通常以弧度为单位,纬度/经度以度为单位。
请注意,这是一个近似值,因为地球更像是一个扁球体(它变成梨形,更准确),其表面不平整。 – outis 2010-04-16 18:32:35
请参阅'proj.4'网站,以了解地球使用球形模型的错误(http://trac.osgeo.org/proj/wiki/GeodesicCalculations)。底线,他们说,如果你为R选择一个好的价值,你可以用这种方法在1%以内。 – mtrw 2010-04-17 00:00:35
+1。据推测,这个答案可能是“如何计算一个大圆路线”(航海导航术语)。 UPVOTE免责声明:我没有能力验证这个数学。我只是羡慕制作它的能力,我推崇清晰的表述。 – Smandoli 2010-04-19 15:49:16
我已经完成了数学计算,现在可以大大简化解决方案。
想象一下,如果我们旋转地球,使我们的第一个矢量在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
希望这会有所帮助。
你不能从经度和纬度获得距离。距离需要两个纬度和经度。 – 2010-04-16 10:34:00
这已经是几个最近的SO问题的主题,看看周围。 – 2010-04-16 10:34:11
我有2纬度和经度... – 2010-04-16 10:39:44