两个地理点之间的距离?

时间:2011-02-03 12:40:08

标签: iphone latitude-longitude

如果给出两个地理点(两个纬度/经度对),我如何获得准确的距离(以米为单位)?

  

可能重复:

     

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?

3 个答案:

答案 0 :(得分:3)

iPhone上没有距离测量,可以提供2米的分辨率。您可以使用Core Location的-[CLLocation distanceFromLocation: otherLocation]方法获取两个位置之间的米位移,但请记住:

  • 无处可见,我已经看到Apple解释了geode用于坐标的方式,以及它是否与位置的不同计算相同的geode
  • 他们使用的模型没有考虑高度,这对于计算场地大小区域中人类大小的物体之间的距离非常糟糕。虽然估计伦敦和莫斯科之间的距离很好 - 错误很小。
  • 当您的设备未插入时,使用真正高精度的位置数据并结合运动检测将完全耗尽电池
  • 不使用动作检测,您只能告诉设备到within tens of metres的位置。

答案 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
}