如果给出两个地理点(两个纬度/经度对),我如何获得准确的距离(以米为单位)?
可能重复:
Distance Between Two GEO Locations
Calculating the distance of geo locations
Android calculate distance between two locations
How to find distance from the latitude and longitude of two locations?
答案 0 :(得分:3)
iPhone上没有距离测量,可以提供2米的分辨率。您可以使用Core Location的-[CLLocation distanceFromLocation: otherLocation]
方法获取两个位置之间的米位移,但请记住:
答案 1 :(得分:3)
如果您想从两个坐标获得距离,可以使用此代码段:
#include <math.h>
#define DEG2RAD(degrees) (degrees * 0.01745327)
#define RADIUS_OF_EARTH 6378.1
+ (float) getDistanceFromStartCoords:(CLLocationCoordinate2D)start andEndCoords:(CLLocationCoordinate2D)end
{
float dist = acos((cos(DEG2RAD(start.latitude))*
cos(DEG2RAD(end.latitude))*
cos((-1*DEG2RAD(end.longitude))-
(-1*DEG2RAD(start.longitude)))) +
(sin(DEG2RAD(start.latitude))*
sin(DEG2RAD(end.latitude)))) *
RADIUS_OF_EARTH;
return dist;
}
答案 2 :(得分:2)
这是对上述解决方案的“改进”。它增加了高度信息。似乎苹果返回的海拔高度以米为单位。不适用于飞行或轨道或类似的情况,但如果有人在另一个人的正上方15层,附近的山上等,则不适用。未经过广泛测试。它假设你不关心20公里以外的东西的高度。然后,当您离另一个人更近时,它会进行高度校正。因此对于距离彼此相距20米但距离高100米的两个人,你的距离约为102米。在最后,我切换到km返回。还在原始代码中发现了一个nan bug。
#define DEG2RAD(degrees) (degrees * 0.01745329251)
#define RADIUS_OF_EARTH 6371000.0
// km
+ (double)getDistanceFromStartCoords:(CLLocationCoordinate2D)start altStart:(double)altStart andEndCoords:(CLLocationCoordinate2D)end altEnd:(double)altEnd;
{
double argument = (cos(DEG2RAD(start.latitude))*
cos(DEG2RAD(end.latitude))*
cos((-1*DEG2RAD(end.longitude))-
(-1*DEG2RAD(start.longitude)))) +
(sin(DEG2RAD(start.latitude))*
sin(DEG2RAD(end.latitude)));
double dist = 0.0;
if (argument < 1.0 && argument > -1.0) // acos will return nan for very small (0) distance
dist = acos(argument)*RADIUS_OF_EARTH;
// else
// NSLog(@"found bug, %f", acos(argument));
// Altitude hack.
// blend in an altitude correction (blend for smoothness)
// add in altitude difference
double altDiff = fabs(altStart - altEnd); // altdiff
double factor = 1.0 - dist/20000.0;
if (factor < 0.0)
factor = 0.0;
dist += sqrt(dist*dist + factor*altDiff*altDiff);
//NSLog(@"distance found, %f", dist);
return dist/1000.0; // return km
}