GPS距离计算

GPS距离计算,gps,haversine,Gps,Haversine,我想计算两个GPS位置之间的距离,每个位置都有纬度值和经度值。对于短距离结果,计算应准确。例如小于300米。如果我使用谷歌地球(见我代码中的coord),距离约为136m。 如果我使用第条提供的解决方案:(哈弗森公式),结果与此毫不接近 使用的代码: public void GpsCalc(){ double d = getDistance(51.342299,4.371359, 51.342490,4.371997); Log.e("GpsCalc", String.valu

我想计算两个GPS位置之间的距离,每个位置都有纬度值和经度值。对于短距离结果,计算应准确。例如小于300米。如果我使用谷歌地球(见我代码中的coord),距离约为136m。 如果我使用第条提供的解决方案:(哈弗森公式),结果与此毫不接近

使用的代码:

public void GpsCalc(){
    double d = getDistance(51.342299,4.371359, 51.342490,4.371997); 
    Log.e("GpsCalc", String.valueOf(d));
}

public static double getDistance(double lat1, double lng1, double lat2, double lng2){
    double R = 6371; // earth’s radius (mean radius = 6,371km)
    double dLat =  Math.toRadians(lat2-lat1);

    double dLon =  Math.toRadians(lng2-lng1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
               Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
               Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    double dr1 = R * c;//in radians      

    Log.e("getDistance-dr1", String.valueOf(dr1));

    return dr1;
}

我确信这应该是一些小的改变,但我看不出来。

我在那一页上也遇到了哈弗森公式的问题。我知道这并不完全是对你问题的回答,但我在余弦定律公式方面取得了更大的成功,它给出了与谷歌地球相同的结果。如果有帮助,它看起来是这样的:

public double getDistance(double lat1, double lon1, double lat2, double lon2) {
    double latA = Math.toRadians(lat1);
    double lonA = Math.toRadians(lon1);
    double latB = Math.toRadians(lat2);
    double lonB = Math.toRadians(lon2);
    double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
                    (Math.sin(latA) * Math.sin(latB));
    double ang = Math.acos(cosAng);
    double dist = ang * EARTH_RADIUS;
    return dist;
}
编辑:

我在谷歌地图、谷歌地球和我的代码中尝试了你的坐标,我得到了49m。也许从来没有什么问题?
有点晚了,但还有两个选择

  • 使用Apple Corelocation(49.2733米)

  • 人工计算(49.1393米)

  • 包含数学库

    #include <math.h>
    
    // distance in Kilometers (Haversine)
    
    -(double)distanceFromGPSlat1:(double)tlat1 lon2:(double)tlon1 lat2:(double)tlat2 lon2:(double)tlon2
    {
    double distance = ((acos(sin(tlat1*M_PI/180)*sin(tlat2*M_PI/180)+cos(tlat1*M_PI/180)*cos(tlat2*M_PI/180)*cos((tlon1-tlon2)*M_PI/180))*180/M_PI)*60*1.1515*1.609344);
    
    return distance;
    }
    
    #包括
    //以公里为单位的距离(哈弗森线)
    -距离GPSLAT1:(双)tlat1 lon2:(双)tlon1 lat2:(双)tlat2 lon2:(双)tlon2:(双)tlon2
    {
    双距离=((acos(sin(tlat1*M_-PI/180)*sin(tlat2*M_-PI/180)+cos(tlat1*M_-PI/180)*cos(tlat2*M_-PI/180)*cos((tlon1-tlon2)*M_-PI/180))*180/M-PI)*60*1.1515*1.609344);
    返回距离;
    }
    

    也许我更喜欢第二种方法(手动计算)。

    谷歌为
    android gps距离提供了很多答案。例如:您提到您期望<3亿,但这正是您得到的。。。?当我把你的坐标输入到那个页面,或者运行你的代码,我得到的结果是0.049km=49m。你的问题是你期待的东西更接近谷歌地球吗?歌舞伎,这正是我的问题。谷歌地球返回136m,这更为现实。作为彼得,我不介意小偏差,谢谢。Peter,我已经实现了代码,但是当我使用代码中给出的gps坐标时,它返回的值为3108.398468379165m。所以我被困在这里了。无论如何,谢谢。史蒂夫,你的代码基本上返回了49m。你能用我用的坐标测试它吗?无法想象Google Earth是错误的。当我在计算中输入坐标值时是正确的。所以上面的函数和网站上的理论函数在细节上肯定有细微的区别。FWIW,我也在。嗨,史蒂夫,得到了49米的结果。这个截图对我帮助很大!我注意到我们的坐标符号不同。gps点的符号类似于用逗号分隔的浮点符号。当我输入坐标并添加一个地标时,我键入51°34'22.99“N和4°37'13.59”E。这将导致地球上的另一个地方。所以我认为这个函数计算的距离是正确的,但是我的坐标格式是错误的。
    
    #include <math.h>
    
    // distance in Kilometers (Haversine)
    
    -(double)distanceFromGPSlat1:(double)tlat1 lon2:(double)tlon1 lat2:(double)tlat2 lon2:(double)tlon2
    {
    double distance = ((acos(sin(tlat1*M_PI/180)*sin(tlat2*M_PI/180)+cos(tlat1*M_PI/180)*cos(tlat2*M_PI/180)*cos((tlon1-tlon2)*M_PI/180))*180/M_PI)*60*1.1515*1.609344);
    
    return distance;
    }