5

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 

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

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

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

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

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

Fused Location API 也有以下问题,

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

请帮助我。提前致谢。

4

2 回答 2

0

您不会通过直接的位置提供商击败融合的提供商准确性或电力使用。

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

如何通过 GPS_PROVIDER 获得更高的准确性

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

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

Android 地图 GPS 异常值

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

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

于 2015-01-16T19:50:06.263 回答
0

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

如果您正在寻找能够为您提供道路位置数据的端到端解决方案,您还可以尝试使用适用于 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";
        }
    }
}
于 2017-09-01T10:38:22.733 回答