2

我正在使用FusedLocationProviderClient在前台服务中获取位置更新。经过几天的测试和观察,我发现错误的位置与我的实际位置相距大约 4 公里,与此类似图片,但LocationResult精度为 24 米。这怎么可能?

如果精度在 4 公里左右,则可以消除它。此行为不会经常发生,但在 10 个设备中至少有 4 个发生。当我计算行进距离时,这成为一个问题。

我可以说它不是缓存位置,因为我以前每天都会关闭和打开位置服务。(根据docs,关闭位置服务会清除缓存位置。)

知道为什么它给出错误的位置以及如何消除它吗?还要在不关闭定位服务的情况下清除缓存位置?

4

1 回答 1

8

FusedLocationProvider 可能会给出不正确的结果,例如当设备的 gps 连接中断(或“视图”中没有足够的卫星以提供准确的数据)时。它将使用 wifi 路由器提供的最近的手机信号塔/位置数据(谷歌会自动跟踪)在谷歌没有强大的位置映射存在的地方(即城市中心以外的任何地方)给出错误的结果。

你有两个选择:

  1. 使用基于位置服务的非基于 googleplay 的解决方案 - 这具有忽略非 gps 位置数据(wifi/蜂窝)的选项。

    LocationManager locationManager = (LocationManager)
    getApplicationContext().getSystemService(LOCATION_SERVICE);  
    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_Provider);
    

    您甚至可以指定可接受数据所需的卫星数量,以便获得真正准确的位置数据。当 gps 没有接收到坐标(如室内)时,您将丢失信息,但作为交换,根据您的要求,来自错误映射位置的“噪音”会减少。

  2. 使用“snap to road”API。有一个使用开放街道地图数据的免费版本,称为Project OSRM(开源路由机),它在使用 docker 托管(本地或云中)或自己构建源(链接中的详细信息)时提供后端。

    curl "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true"

此请求将返回一个“捕捉”到最近道路的位置。有多种选择,例如优先考虑高速公路等。然后,您可以丢弃不在用户先前所在“路径”上的点,因为快速转移到 4 公里外的道路然后再返回的可能性不大。

于 2019-03-29T12:01:22.067 回答