我尝试在两个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()
返回的内容有何不同?
答案 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 :(得分:0)
如上所述引用我的回答,distanceTo()正常工作。 我理解自我实现的distanceTo方法的优点。 这使得您的coode独立于库并且更易于移植,并且 在不同的平台上总会给出相同的距离。 (例如,在使用测试用例时)
但后来我建议使用另一个公式:
在您的代码中,地球半径不够精确,您应该采用WGS84地球半径(以米为单位),即GPS接收机在其地球模型中使用的地球半径。您可以通过搜索互联网轻松找到WGS84地球半径
然后你应该使用hasrsine公式:这对于小距离也是如此。