我正在开发一个Android应用程序,用于获取用户的位置并计算他与其他位置之间的距离。
问题是,每次按下按钮时,DistanceTo功能都会给我不同的测量值,尽管我不会移动设备。
有时它给我完美的测量(给我18米),有时它给我太糟糕的测量(53米)而实际距离15米! 提示:我需要非常精确的测量精度< 4M
这是获取位置的代码
LM = (LocationManager) getApplicationContext().getSystemService(
LOCATION_SERVICE);
Criteria criteria = new Criteria();
provider = LM.getBestProvider(criteria, false);
try {
LM.requestLocationUpdates(provider, 100000, 1, this);
if (LM != null) {
Loc = LM.getLastKnownLocation(provider);
LM.removeUpdates(this);
if (Loc != null) {
//set the location
}
}
} catch (Exception e) {
e.printStackTrace();
}
和克拉距离的代码很容易 Location1.distanceTo(LOCATION2);
答案 0 :(得分:0)
distanceTo功能有效,但您的应用没有过滤器来检测您不移动时的情况。 一些像iphone这样的智能手机内置了仅在移动时才能提供GPS位置。 你所看到的是所谓的静态运动。
(几乎所有GPS接收器都可以选择配置为在不移动时抑制不同位置的传送。但作为App开发者,您无法更改该固定配置。)
您必须编写这样的过滤器,以避免在同一位置采取不同的措施。
答案 1 :(得分:0)
我有完全相同的问题。 在我的应用程序中,我从任何提供程序获取当前位置,然后计算一组LatLng的距离。这是在10秒的定时器循环中完成的。
lat01,lng01,lat02和lng02已修复,我已确认它们没有更改。 但是在每个定时器循环中,我得到不同的值。
grep "in for" mymap.log | sort | uniq
in for loop dist 18.917835 <lat01> <lng01> <lat02> <lng02>
in for loop dist 324.48648 <lat01> <lng01> <lat02> <lng02>
in for loop dist 325.92554 <lat01> <lng01> <lat02> <lng02>
逻辑是这样的:
if(testtimer==null)
{
testtimer = new Timer();
testtimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Location loc1 = new Location("test");
loc1.setLatitude(lat01);
loc1.setLatitude(lng01);
Location loc2 = new Location("test");
loc2.setLatitude(lat02);
loc2.setLatitude(lng02);
for(int i=0;i<30;i++)
{
log_write("distance loc1 to loc2 "+loc1.distanceTo(loc2));
}
}
},1000,10000);
}
更新/修复: 停止使用google的Location.distance介于&amp; location.distanceto函数。它们不起作用。
而是使用直接公式来计算距离:
double distance_between(Location l1, Location l2)
{
//float results[] = new float[1];
/* Doesn't work. returns inconsistent results
Location.distanceBetween(
l1.getLatitude(),
l1.getLongitude(),
l2.getLatitude(),
l2.getLongitude(),
results);
*/
double lat1=l1.getLatitude();
double lon1=l1.getLongitude();
double lat2=l2.getLatitude();
double lon2=l2.getLongitude();
double R = 6371; // km
double dLat = (lat2-lat1)*Math.PI/180;
double dLon = (lon2-lon1)*Math.PI/180;
lat1 = lat1*Math.PI/180;
lat2 = lat2*Math.PI/180;
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double d = R * c * 1000;
log_write("dist betn "+
d + " " +
l1.getLatitude()+ " " +
l1.getLongitude() + " " +
l2.getLatitude() + " " +
l2.getLongitude()
);
return d;
}
答案 2 :(得分:-1)
据我所知,“gps在撒谎”关于“费用”米的确切位置。需要更高精度的商业应用程序在已知的确切位置处具有gps接收器,并将差异传递到单独通道上的“躺着的gps”,因此可以相应地校正移动设备上的gps位置。