我正在使用FusedLocationProviderClient
来获取前台服务中的位置更新。经过几天的测试和观察,我发现错误的位置与我的实际位置相距约4公里,但LocationResult
的准确度却达到了24米。怎么可能呢?
如果精度在4 kms左右,则可以将其消除。此行为不是很经常发生,但在10个设备中,至少有4个发生一次。当我计算行进距离时,这成为一个问题。
我可以说它不是缓存的位置,因为我以前每天都关闭和打开位置服务。 (根据docs,关闭位置服务会清除缓存位置。)
有人知道为什么它给出了错误的位置以及如何消除它吗?还要在不关闭定位服务的情况下清除缓存位置?
答案 0 :(得分:3)
FusedLocationProvider可能会给出错误的结果,例如设备的gps连接断开(或“查看”中的卫星不足以提供准确的数据)。它将使用wifi路由器提供的最接近的基站信号/位置数据(谷歌会自动跟踪),在谷歌没有强大的位置映射功能的地方(城市中心以外的任何地方)会产生非常错误的结果。
您有两种选择:
使用基于位置服务的非基于Googleplay的解决方案-该选项可忽略非GPS位置数据(WiFi /蜂窝网络)。
LocationManager locationManager = (LocationManager)
getApplicationContext().getSystemService(LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_Provider);
您甚至可以指定number of satellites required for acceptable data,以便获得真正准确的位置数据。当GPS不接收坐标时(例如在室内),您将丢失信息,但作为交换,根据您的要求,来自错误映射位置的“噪音”将减少。
使用“贴紧道路” API。有一个免费版本使用称为Project OSRM(Open Source Routing Machine)的开放式街道地图数据,当使用docker托管或自己构建源代码时(在链接中提供详细信息),可以提供后端。
curl "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true
“
此请求将返回“被捕捉”到最近道路的位置。有多种选择,例如优先设置高速公路等。然后,您可以丢弃不在用户先前所在的“路径”上的点,因为快速转移到4公里以外的道路上然后不太可能再回来。 / p>