我使用以下代码检查GPS坐标,但问题是如果我站在同一个地方,坐标会发生变化,距离会在4到20 mts之间。 我想改变它只有当我移动了10分钟。
locationManager_gps = (LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
locationManager_gps.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0,
new MyLocationListener_gps());
class MyLocationListener_gps implements LocationListener {
public void onLocationChanged(Location location) {
clat = location.getLatitude();
clon = location.getLongitude();
if (clat != plat || clon != plon) {
float[] results = new float[3];
Location.distanceBetween(plat, plon, clat, clon, results);
if (flag_gps == 0) {
flag_gps = 1;
} else {
GeoPoint geoPoint = new GeoPoint((int) (clat * 1E6),
(int) (clon * 1E6));
mapView.getController().animateTo(geoPoint);
draw = new MyOverLay(geoPoint);
mapView.getOverlays().add(draw);
dist_mtr += results[0];
}
plat = clat;
plon = clon;
}
}
如果我使用50作为更新之间的最小距离,那么它工作正常。我也试过制作它30但在乘车旅行的4公里时间内数据也是错误的。
请建议我应该做些什么。
答案 0 :(得分:0)
我也看过这个,当我拿几个位置读数时我没有动过。您可以获得具有不同精度的可变结果。 你可以试着拿10个位置读数,拿一个最准确的,并忽略其余的。然后在进行下一次读数时,确保它位于前一位置精度的两倍。例如,如果您的第一个位置具有16米的精度,请确保下一个读数距离前一个位置至少32米并且精度优于32米。
答案 1 :(得分:0)
您需要组合使用minTime和minDistance。您为两者传递零和零,因此更新之间的最小时间将至少为零秒,最小距离将为零。因此,将minTime设置为合理的时间,将minDistance设置为10,持续10米。
locationManager_gps.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0,
new MyLocationListener_gps());
答案 2 :(得分:0)
没有灵丹妙药可以解决这个问题...... gps不是100%准确,每次获得新的位置更新时,你都会有不同的读数。
您可以使用位置值的低通滤波器来最小化问题:
clat = plat + (clat-plat) * 0.2; // you should adjust the 0.2 value to the best results
clon = plon + (clon-plon) * 0.2;
....
//your code
....
plat = clat;
plon = clon;
通过这种方式,值的突然变化的影响将被最小化,这有利于虚假的位置变化,但它也会延迟对设备移动时位置的实际变化的响应。你应该谨慎选择常数乘以(0.2以上)的值,以获得最佳结果。
你甚至可以做得更好,使用变量而不是常数,并根据更新的准确性调整它的值(使变量接近1的精度很高,使变量准确接近的精度) 0)
祝你好运