Iphone 两个地理点之间的距离?

Iphone 两个地理点之间的距离?,iphone,latitude-longitude,Iphone,Latitude Longitude,在给定两个地理点(两个纬度/经度对)的情况下,如何获得准确的距离(以米为单位) 可能的重复项: iPhone上没有距离测量功能,可以提供2米的分辨率。可以使用岩芯位置法获得两个位置之间的位移(以米为单位),但请记住: 在我所见过的任何地方,苹果公司都没有解释什么样的大地坐标用于它们的坐标,事实上,对于不同的位置计算,它是否是同一个大地坐标 他们使用的模型没有考虑海拔高度,这对于计算野外大小区域中人类大小物体之间的距离来说是非常糟糕的。不过,计算伦敦和莫斯科之间的距离也不错——误差很小

在给定两个地理点(两个纬度/经度对)的情况下,如何获得准确的距离(以米为单位)

可能的重复项:


iPhone上没有距离测量功能,可以提供2米的分辨率。可以使用岩芯位置法获得两个位置之间的位移(以米为单位),但请记住:

  • 在我所见过的任何地方,苹果公司都没有解释什么样的大地坐标用于它们的坐标,事实上,对于不同的位置计算,它是否是同一个大地坐标
  • 他们使用的模型没有考虑海拔高度,这对于计算野外大小区域中人类大小物体之间的距离来说是非常糟糕的。不过,计算伦敦和莫斯科之间的距离也不错——误差很小
  • 当你的设备没有插上电源时,使用真正高精度的位置数据和运动检测将完全耗尽电池
  • 在不使用运动检测的情况下,您只能知道设备的位置

如果您想获得两个坐标的距离,可以使用以下代码段:

#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;
}
#包括
#定义DEG2RAD(度)(度*0.01745327)
#定义地球的半径为6378.1
+(float)GetDistancefromStartWord:(CLLocationCoordinate2D)start和AndCoords:(CLLocationCoordinate2D)end
{
浮动距离=acos((cos(DEG2RAD(起始纬度))*
cos(DEG2RAD(纬度终点))*
cos((-1*DEG2RAD(经度终点))-
(-1*DEG2RAD(起始经度)))+
(sin(DEG2RAD(起始纬度))*
sin(DEG2RAD(纬度终点))*
地球的半径;
返回距离;
}

这是对上述解决方案的“改进”。它添加了高度信息。苹果返回的高度似乎是米。不适合飞行或绕轨道飞行或类似情况,但如果有人在另一个人正上方15层,在附近的山上等未经广泛测试的情况下,则可以工作。它假设您不关心20公里以外的高度。当你离另一个人更近时,它会输入一个高度修正。两个人相距20米,但高出100米,距离大约为102米。在右端,我切换到km返回。在原始代码中还发现了一个nan错误

#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
}
定义DEG2RAD(度)(度*0.01745329251) #定义地球的半径6371000.0 //公里 +(double)GetDistancefromStartTords:(CLLocationCoordinate2D)start altStart:(double)altStart和AndCoords:(CLLocationCoordinate2D)end altEnd:(double)altEnd; { 双参数=(cos(DEG2RAD(start.latitude))* cos(DEG2RAD(纬度终点))* cos((-1*DEG2RAD(经度终点))- (-1*DEG2RAD(起始经度)))+ (sin(DEG2RAD(起始纬度))* sin(DEG2RAD(纬度终点)); 双距离=0.0; if(argument<1.0&&argument>-1.0)//acos将返回非常小(0)距离的nan 距离=acos(参数)*地球半径; //否则 //NSLog(@“发现错误,%f”,acos(参数)); //高空黑客。 //混合高度校正(混合以获得平滑度) //加上高差 双altDiff=fabs(altStart-altEnd);//altDiff 双因子=1.0-距离/20000.0; 如果(系数<0.0) 系数=0.0; dist+=sqrt(dist*dist+因子*altDiff*altDiff); //NSLog(@“找到的距离,%f”,距离); 返回距离/1000.0;//返回公里数 }
我无法解析您的问题。你能添加一些标点符号吗?世界的可能副本不是球形的。您计算相对于大地水准面的位置的误差高达21公里。@Graham更正。。。但是曼尼什·詹不会在两米的距离上检查点!!!再过两米,世界保险丝就不会变了!但我在CLLocation变量中的距离不在CLLOCATIONCoordinate2DCLOCATIONCoordination2D启动中;起始纬度=28.5344643;起始经度=77.2778694;CLLocationCoordinated2D最终版;最终纬度=27.5344643;最终经度=76.2778694;我使用了这个函数并传入了函数,但显示了不可压缩的指针错误