我正在尝试创建一个adndroid应用程序,它将显示我启动该应用程序时的距离。我正在使用位置管理器,这是我的想法:
- 检查坐标
- (2秒延迟)
- Chceck坐标2
- 如果坐标2!=然后坐标计算它们之间的距离,并将其添加到两倍的距离中
-
重复
public void onLocationChanged(最终位置){
sz = location.getLatitude(); dl = location.getLongitude(); String dls = String.valueOf(dl); String szs = String.valueOf(sz); aktualna_dlg.setText(dls); aktualna_szg.setText(szs); lat1 = location.getLatitude(); lon1 = location.getLongitude(); int secs = 2; // Delay in seconds Utils.delay(secs, new Utils.DelayCallback() { @Override public void afterDelay() { lat2 = location.getLatitude(); lon2 = location.getLongitude(); } }); if (lat1!=lat2 || lon1!=lon2){ distance += DistanceCalculator.distance(lat1,lon1,lat2,lon2, "K"); } if(distance<1000){ String distance_s = String.valueOf(distance*1000); distance_tv.setText(distance_s + " m"); } else if(distance>=1000){ String distance_s = String.valueOf(distance/1000); distance_tv.setText(distance_s + " km"); } }
但当我编译应用程序并捕捉GPS时,我的距离约为6公里。我做错了什么?
我不确定utils.delay做什么,因为它不是框架的一部分。但假设它工作正常,它会延迟发生。这意味着lat2和lon2在调用之前不会更新。所有使用这些变量的代码都必须在afterDelay中发生,在那之前它们都是无效的。
消除延迟,只需将onLocationChanged
的参数与上次调用时的参数进行比较。至于你为什么要记录一段巨大的旅程。。。
使用高通滤波器
你希望在2秒内移动多远?可能低于GPS接收器的精度,除非你在飞机上。你的大部分"动作"实际上只是随机的噪音。
在我的一个应用程序中,我将起始GPS位置保存为参考点。每次调用onLocationChanged
时,我都会计算当前位置和参考点之间的距离。如果距离大于某个高通值,我会将距离添加到跑步总数中,并将新位置设置为参考点。我使用100米作为我的高通值,因为我在高层建筑周围看到过一些精度为100米或更差的设备。