Fused Location API 在地图中绘制时会给出不准确的纬度和长度,即使对于低准确度值,它也会稍微远离道路路径

Posted

技术标签:

【中文标题】Fused Location API 在地图中绘制时会给出不准确的纬度和长度,即使对于低准确度值,它也会稍微远离道路路径【英文标题】:Fused Location API gives Inaccurate Lat, Long when plotting in map it is slightly away from the road path even for low accuracy value 【发布时间】:2015-02-18 03:18:06 【问题描述】:

Google 提供融合位置提供程序 API 来获取位置坐标。根据文档,API 在内部轮询来自不同提供商(GPS、Wifi、蜂窝网络)的位置数据并提供最佳位置。但是,在高精度模式下,我收集了以下信息。在此测试中,GPS 始终处于开启状态。

Latitude: 12.8560136
Longitude: 80.1997696
User Activity: IN VEHICLE
Speed: 21.810165 mph
Altitude: -83.0 
Accuracy: 12.0 

当我在地图上看到这个点时,这些点不在路上。他们离马路稍远。 其他具有相同精度的点绘制在道路上。当我完全 zoom and see 时,一些点稍微远离行进的道路路径。

我想要准确的信息。它的点必须在道路路径中。

我已使用Fused Location API 获取位置信息。

mGoogleApiClient = new GoogleApiClient.Builder(mContext)
            .addApi(LocationServices.API).addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).build();

分享您的建议。如果我使用Location manager 会解决我的问题吗? 而且我只需要消耗更少的电池。 Fused API 保证它只消耗更少的功率和更高的效率。

Fused Location API 也存在以下问题,

    无法获取卫星计数。 总是返回 FUSED 提供程序。不完全给出哪个提供商(GPS 或网络)返回位置信息。 当这两个提供商都不可用时,您永远不会收到通知。当没有提供者可用时,它不会返回任何值。要检查提供商的可用性,我们需要单独向位置管理器注册。这会消耗更多的电量。

请帮助我。提前致谢。

【问题讨论】:

我使用 locationmager gpsstatus 监听器和 fused 提供者的位置来锁定。它工作得很好。我有代码github.com/danny117/MapMover。我只是在禁用 gps 时设置了一个按钮。 ***.com/questions/24804652/… 【参考方案1】:

使用直接的位置提供程序,您不会击败融合提供程序的准确性或功耗。

融合位置提供程序以米/秒报告速度,以米为单位报告准确度。您拥有的示例点精确到 12 米。美国车道定义为3.7m。凭借 12m 的精度,您可以在任何方向偏离 12/3.7=3.25 条车道。我不能这么说。 如果您想要准确,则必须检查位置的准确性。

How to get more accuracy by GPS_PROVIDER

LatLng and distance between returning incorrect values on newer phones

can't find the exact current location in android

Android Maps GPS outlier

Fused Location Provider unexpected behavior

调整您的程序以处理该点的准确性。例如,假设该点是正确的,围绕该点画一个圆,半径 = 位置精度。

【讨论】:

其实我认为这可能是 FusedLocationAPI 的问题。当我使用 Loaction Manager API 时,相同精度的位置数据被绘制在相同的道路路径中。但是在使用 Fused API 的时候就稍微有点远了。 你在路上做了两次传球,还是同时两次传球?我只是扔掉任何不符合我的准确性标准的东西,最终会出现另一个更准确的位置。 我还定义了小于 50 的准确度标准。两天同一时间相同的路径。第一天测试了融合的 api。第二天我测试了位置管理器。 我认为你说你不会打败它的准确性是错误的。我对fused location providerandroid location provider 的准确性进行了多次测试,可以说android location provider 给出了更准确的结果。 在我试驾汽车时,我有无数小时来测试这些。 ***.com/questions/23889834/…accuracy 你检查准确度。【参考方案2】:

无法保证来自 GPS 和其他提供商的位置数据位于道路上。这些传感器没有必要的映射上下文来将原始位置信号捕捉到道路。要使用原始数据实现此目的,您可以使用 snap to road API。 Google Maps 和 OSM 等地图提供商有办法做到这一点:

Google Maps snap to roads API OSRM match service

如果您正在寻找一种能够为您提供道路位置数据的端到端解决方案,您还可以尝试使用适用于 Android 的HyperTrack SDK,它会收集和处理位置数据以提高其准确性。 (免责声明:我在 HyperTrack 工作。)

另外,为了回答您的其他问题,FusedLocationProviderApi 不会公开卫星数量和提供商信息。要获取提供者信息,您可以设置 GpsStatus.Listener 类。这可以与应用程序中的融合提供程序并行使用,以检查设备是否具有 GPS 定位。您可以使用以下代码 sn-p 进行设置:

public class GPSStatusListener implements GpsStatus.Listener 

    private LocationManager locationManager;
    private boolean gpsFix;

    public GPSStatusListener(LocationManager locationManager) 
        this.locationManager = locationManager;
    

    @Override
    public void onGpsStatusChanged(int changeType) 
        if (locationManager != null) 
            try 
                GpsStatus status = locationManager.getGpsStatus(null);

                switch (changeType) 
                    case GpsStatus.GPS_EVENT_FIRST_FIX: // Received first fix
                        gpsFix = true;
                        break;

                    case GpsStatus.GPS_EVENT_SATELLITE_STATUS: // Check if satellites are in fix
                        for (GpsSatellite sat : status.getSatellites()) 
                            if (sat.usedInFix()) 
                                gpsFix = true;
                                break;
                             else 
                                gpsFix = false;
                            
                        

                        break;

                    case GpsStatus.GPS_EVENT_STARTED: // GPS turned on
                        gpsFix = false;
                        break;

                    case GpsStatus.GPS_EVENT_STOPPED: // GPS turned off
                        gpsFix = false;
                        break;

                    default:
                        gpsFix = false;
                        return;
                
             catch (Exception e)
                // Handle exception
            
        
    

    public String getProvider() 
        if (gpsFix) 
            return "gps";
         else 
            return "non_gps";
        
    

【讨论】:

以上是关于Fused Location API 在地图中绘制时会给出不准确的纬度和长度,即使对于低准确度值,它也会稍微远离道路路径的主要内容,如果未能解决你的问题,请参考以下文章

使用 android fused location api 在 MyLocation 上未显示蓝点

使用 Fused Location API,Marshmallow 不会使用 location.getSpeed()

Google Fused Location API 导致错误(Android)

如何使用 FUSED LOCATION API 优化电池 - Android

为 Fused location API 添加 addGpsStatusListener

Android - Google Maps V2 无法使用 Fused Location