FusedLocationProvider 有时会给出错误的位置

FusedLocationProvider gives wrong location sometimes

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

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

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

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

FusedLocationProvider 可能会给出不正确的结果,例如当设备的 gps 连接中断时(或者 "view" 中的卫星数量不足以提供准确的数据)。它将使用 wifi 路由器提供的最近小区 tower/location 数据(google 自动跟踪此数据)在 google 没有强大位置映射存在的地方给出错误的结果 - 这位于城市中心以外的任何地方。

恕我直言,您有两个选择:

  1. 使用基于位置服务的非 google 播放解决方案 - 这有一个选项可以忽略非 gps 位置数据 (wifi/cellular)。

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

    您甚至可以指定 number of satellites required for acceptable data 以便获得真正准确的位置数据。当 gps 不接收坐标时(例如在室内),您将丢失信息,但作为交换,根据您的要求,来自错误映射位置的信息会更少 "noise"。

  2. 使用一个"snap to roads"API。有一个使用名为 Project OSRM(Open Source Routing Machine) 的开放街道地图数据的免费版本,它在使用 docker 或您自己构建源代码(详情见 link)托管(本地或云端)时提供后端。

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

此请求将 return 一个位置 "snapped" 到最近的道路。有多种选择,例如优先考虑高速公路等。然后您可以丢弃不在用户之前所在的 "path" 上的点,因为快速转移到 4 公里外的道路然后再回来是不可能的.