Location类的distanceTo()方法如何在内部工作?

时间:2015-06-05 10:16:44

标签: android gps android-location

我尝试在两个distanceTo()对象之间使用Location,但AFAIK在所有情况下都没有返回正确的值。相反,我编写了一个自定义方法,它返回我认为正确的值。

float distanceBetween(Location l1, Location l2)
{
    float lat1= (float)l1.getLatitude();
    float lon1=(float)l1.getLongitude();
    float lat2=(float)l2.getLatitude();
    float lon2=(float)l2.getLongitude();
    float R = 6371; // km
    float dLat = (float)((lat2-lat1)*Math.PI/180);
    float dLon = (float)((lon2-lon1)*Math.PI/180);
    lat1 = (float)(lat1*Math.PI/180);
    lat2 = (float)(lat2*Math.PI/180);

    float a = (float)(Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2));
    float c = (float)(2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)));
    float d = R * c * 1000;

    return d;
}

有人能告诉我我的实施与distanceTo()返回的内容有何不同?

2 个答案:

答案 0 :(得分:1)

我非常确定Location.distanceTo()设计正确。它采用WGS84方法,具有高度精确和准确的特点。我最近使用Location.distanceTo()来处理许多测试用例,但从来没有错。

您没有解释为什么您认为该方法无法正常工作。您可能会得到错误的值,因为您没有为Location对象设置正确的纬度和经度值。此外,您可以在IDE中设置Android的源代码并自行检查方法。这绝对是正确的。

修改

在你发布的那个链接上,有一个answer简明扼要地总结了这个问题:

  

distanceTo()正常工作。最可能的错误就在你身边   算法一,例如,如果没有可用的GPS修正,和手机   采用基于GSM小区的位置,这当然可以关闭1000米。

     

对于可能想要总结行进距离的应用,   只采取GPS修复,不要使用其他LocationProvider而不是GPS!

故事的寓意是确保你只使用GPS提供商进行距离计算。

编辑2:

Google建议在android.location API上使用Google Play Services Location API。新的API应该更准确。

<强>参考文献:

1。 Making Your App Location-Aware

答案 1 :(得分:0)

如上所述引用我的回答,distanceTo()正常工作。 我理解自我实现的distanceTo方法的优点。 这使得您的coode独立于库并且更易于移植,并且 在不同的平台上总会给出相同的距离。 (例如,在使用测试用例时)

但后来我建议使用另一个公式:
在您的代码中,地球半径不够精确,您应该采用WGS84地球半径(以米为单位),即GPS接收机在其地球模型中使用的地球半径。您可以通过搜索互联网轻松找到WGS84地球半径 然后你应该使用hasrsine公式:这对于小距离也是如此。