FusedLocationProvider 有时会给出错误的位置
Posted
技术标签:
【中文标题】FusedLocationProvider 有时会给出错误的位置【英文标题】:FusedLocationProvider gives wrong location sometimes 【发布时间】:2019-08-20 03:49:17 【问题描述】:我正在使用FusedLocationProviderClient
在前台服务中获取位置更新。经过几天的测试和观察,我发现错误的位置与我的实际位置相距约 4 公里,类似于 this,但LocationResult
的精度为 24 米。这怎么可能?
如果精度在 4 公里左右,则可以消除。此行为不会经常发生,但在 10 个设备中至少有 4 个发生。当我计算行进距离时,这成为一个问题。
我可以判断它不是缓存位置,因为我过去每天都会关闭和打开位置服务。 (根据docs,关闭定位服务会清除缓存位置。)
知道为什么它给出错误的位置以及如何消除它吗?还要在不关闭定位服务的情况下清除缓存位置?
【问题讨论】:
请告诉我们您尝试了什么并最好用代码向我们展示 @kkarakk,我需要从设备获取连续的位置更新,以便计算行进距离并使用折线在 Google 地图中显示用户行进路径。一切正常。我面临的唯一问题是很少有位置是错误的,类似于这个 - user-images.githubusercontent.com/352175/… “知道为什么它给出了错误的位置......” 也许它们是基于网络的位置(?)如果 GPS 定位暂时丢失(?)那么你可以检查提供者并忽略它们。 “...以及如何消除它?” 只接受基于 GPS 的位置并实施某种过滤。在谈到 GPS 时,经常会提到“卡尔曼滤波”。我想固件已经做了一些。或者,“虚假”位置可能会根据与先前位置的距离以及用户可能实际行驶的合理预期最大速度而被拒绝。 4公里/秒不太可能发生。 :) @Joshua 看一眼您的内容,我可以判断那些不正确的位置是设备失去 gps 连接时的手机信号塔/wifi 位置。我认为您需要远离 fusedlocationproviderclient 并使用非 google play 位置解决方案(位置侦听器),这样您就可以仅请求 gps 位置并忽略不准确的 wifi/celltower 数据。 fusedlocationprovider 不提供精细粒度控制,您必须在后端进行卡尔曼过滤器 @kkarakk,是的,您的回答很有帮助。接受:) 【参考方案1】: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 没有接收到坐标时(例如在室内),您将丢失信息,但作为交换,您可以根据您的要求,从不正确的地图位置获得更少的“噪音”。
使用“snap to road”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 公里外的道路然后再回来不太可能。
【讨论】:
以上是关于FusedLocationProvider 有时会给出错误的位置的主要内容,如果未能解决你的问题,请参考以下文章
Android:FusedLocationProvider,每隔几秒获取一次位置
FusedLocationProvider - 如果位置模式为“仅设备”,任何获取位置的方法?
FusedLocationProvider 始终返回 null Location 对象
FusedLocationProvider 位置更新的单独类或服务?
无法使用 FusedLocationProvider 将 Gps 设置升级到高精度在某些设备中
使用 fusedLocationProvider.removeLocationUpdates (locationCallback) Android Studio 时出错