Android 距离()不';不要给我稳定的测量
我正在开发一个android应用程序,它可以获取用户的位置,并计算他和另一个位置之间的距离 问题是,尽管我没有移动设备,但每次按下按钮时,DistanceTo功能会给我不同的测量值 有时它给我完美的测量(给我18米),有时它给我太差的测量(53米),而实际距离15米! 提示:我需要非常精确的测量精度<4M 这是获取位置的代码Android 距离()不';不要给我稳定的测量,android,gps,distance,latitude-longitude,Android,Gps,Distance,Latitude Longitude,我正在开发一个android应用程序,它可以获取用户的位置,并计算他和另一个位置之间的距离 问题是,尽管我没有移动设备,但每次按下按钮时,DistanceTo功能会给我不同的测量值 有时它给我完美的测量(给我18米),有时它给我太差的测量(53米),而实际距离15米! 提示:我需要非常精确的测量精度
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();
}
而且计算距离的代码很容易
位置1.距离(位置2) 据我所知,“全球定位系统”在“英尺”米的确切位置上撒谎。需要更高精度的商业应用程序在已知的精确位置有一个gps接收器,并通过一个单独的通道将差异传输给“躺着的gps”,以便移动设备上的gps位置可以得到相应的校正 distanceTo功能可以正常工作,但你的应用程序没有过滤器来检测你不移动时的情况。 一些智能手机(如iPhone)内置了GPS定位功能,只有在移动时才能提供GPS定位。 你们看到的是,所谓的静态运动 (几乎所有GPS接收器都可以选择性地配置为在不移动的情况下抑制不同位置的传送。但作为应用程序开发人员,您不能更改固定配置。)
您必须编写这样一个过滤器,以避免在同一位置使用不同的措施 我也有同样的问题。 在我的应用程序中,我从任何提供商处获取当前位置,然后计算一组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>
GPS测量本身就是不精确的。哦,那么使用GPS的上百种应用程序又能给我们提供精确的结果呢?!。。。随着时间的推移,他们将位置平均化。任何同时进行的测量都可能相差一米甚至几十米。有许多变量会影响GPS的精度。@DaveNewton不,它们不会随时间平均。(不幸的是,这是不可能的,至少在iphone上是不可能的,因为GPS位置在移动之前是不会更新的)在这些应用程序中做得不同。@AlexWien这不是iphone;我真的不明白这有什么关系。请你解释一下“一个gps接收器在一个已知的准确位置,并将差异传输到另一个频道上的“躺着的gps”?不,商业android应用程序中没有DGP。(尽管Waas和EGNOS)已经在他的手机上启用。他的应用程序不够智能,无法进行适当的过滤。你说的过滤是什么意思?!一个过滤器保持良好,并删除坏的或不相关的(位置),如何实现这个过滤器?!你能再给我解释一下计时器吗?
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);
}
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;
}