提问者:小点点

当在地图中绘制时,融合位置API给出的Lat、Long不准确,即使精度值较低,也会稍微远离道路路径


谷歌提供了融合的位置提供商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 

当我在地图上看到这个点时,这些点不在路上。他们离马路稍微远一点。具有相同精度的其他点绘制在道路上。当我完全变焦并查看时,一些点与行驶的道路路径略有距离。

我想要准确的信息。它指向的一定是道路路径。

我使用了融合位置API来获取位置信息。

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

分享你的建议。如果我使用位置管理器,它将解决我的问题。而且我只需要消耗更少的电池。Fused API保证它只消耗更少的功率和更高的效率。

此外,融合位置API还存在以下问题,

    < li >无法获得卫星计数。 < li >始终返回融合的提供商。没有确切地给出哪个提供商(GPS或网络)返回位置信息。 < li >当两个供应商都不可用时,您不会得到通知。当没有提供程序可用时,它不会返回任何值。要检查提供商的可用性,我们需要单独向Location manager注册。这消耗更多的功率。

请帮我解决这个问题。提前谢谢。


共2个答案

匿名用户

您无法击败融合式提供商的准确度或直接定位提供商的功耗。

融合的位置提供者以米每秒报告速度,以米报告精度。你手上的例子精确到12米。美国车道被定义为3.7米。对于12米的精度,您可以在任何方向上偏离12/3.7=3.25条车道。这话我怎么说都不为过。如果你想要准确,你必须检查位置的准确性。

GPS_PROVIDER如何提高精度

更新手机上的LatLng和返回错误值之间的距离

在android中找不到准确的当前位置

Android地图GPS异常值

融合位置提供程序意外行为

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

匿名用户

来自GPS和其他提供商的位置数据不能保证在路上。这些传感器不具备将原始位置信号捕捉到道路上所需的绘图环境。要使用原始数据实现这一点,可以使用捕捉到道路API。像谷歌地图和OSM这样的地图提供商有办法做到这一点:

  • 谷歌地图捕捉道路API
  • OSRM匹配服务

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

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

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";
        }
    }
}