0

我在获取 Android 中的当前位置时遇到问题。

我正在使用android 的FusedLocationAPI。但是我得到的纬度和经度不准确。我将该凭据粘贴在谷歌地图上,它显示的位置与我的准确位置不同。

我还尝试获取位置更新并通过 验证准确度Location.getAccuracy(),这里我得到的最小准确度是 10 米。在这里,我使用Fine Location作为许可。所以在这里我的问题是,我怎样才能得到我的准确位置,换句话说,精度小于 5 米。?

我的代码是

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

    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setSmallestDisplacement(1);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,MainActivity.this);

 @Override
public void onLocationChanged(Location location) {
    Toast.makeText(MainActivity.this,";-"+location.getAccuracy(),Toast.LENGTH_LONG).show();
    if(location.hasAccuracy() && location.getAccuracy()<lastLocationAccuracy){ 
        latitude = location.getLatitude();
        longitude = location.getLongitude();
    }
}
4

2 回答 2

1

我进行了很多搜索,但使用融合位置 API 找不到任何低于 10 的准确度。

如果您看过Google IO演示文稿,则会显示一个图表,显示在 Galaxy Nexus 上多次测试的识别算法的不同优先级的效果。

谷歌 IO

如果你想获得低于 10 的准确度,那么你可以使用 GPS,但这也取决于设备、GPS、WiFi、蜂窝塔、蓝牙等......

如果 GPS 硬件可以接收WAAS校正它可以做得更好,大约 7.6m 最坏情况,1-2m 最好情况。

于 2016-06-20T06:38:37.543 回答
1

我怎样才能得到我的准确位置,换句话说,精度小于 5 米?

简短的回答

使用位置时,重要的是要了解您可能会要求一定的准确性,但不能保证您在实际位置更新中获得该准确性。


您通常不能期望以 < 5m 的精度获得位置更新。这取决于许多因素,最重要的是您的设备的功能和您的物理环境。


长答案

FusedLocationApi在幕后做了很多魔术。除其他外,它试图找出使用哪些提供商(GPS、WiFi、蜂窝塔、蓝牙等)。这些提供商中的每一个在准确性、更新频率和电池消耗方面都各有利弊。然后它融合来自不同提供商的信息,因此得名。

示例 1:如果您在纽约市的城市峡谷中,您将很难获得良好且准确的 GPS 定位。另一方面,周围将会有大量的 WiFi 网络,这些网络已经被谷歌映射和地理参考。因此,您可能会获得快速的位置修复。准确性将取决于 WiFi 网络的密度,更重要的是取决于墙壁/建筑物的密度。我不希望在这里得到比 15-30 米更准确的东西。

示例 2:如果您在某个地方的沙漠中,情况正好相反。最有可能的是,附近不会有任何 WiFi 网络,但您将获得清晰的 GPS 定位。在这里,您可以期望以 < 5m 的精度进行位置更新。

您的设置看起来正确。选择高更新率和高优先级将确保 GPS 用作提供程序(如果在设备上可用)。确保您在室外测试您的应用程序,并且可以清楚地看到天空。如果您不断收到非常遥远的位置,请使用另一台设备进行测试。如果它仍然不起作用,那么您的代码有问题。您可能希望使用诸如LocationAssistant之类的实用程序类(完全披露:我是该项目的作者),以确保您正确设置所有内容。

误解

最后,我想澄清一下我在其他评论中看到的两个常见误解:

  • 如文档中所述,Location.getAccuracy()将返回位置读数的估计精度。这是一个最好的猜测(通常基于高斯误差模型),可能还很遥远。我已经看到融合位置声称其精度为 的情况,3m而且它实际上不仅仅是100m关闭的。所以不要依赖它来实现关键功能。

  • ACCESS_FINE_LOCATION权限足以获得高精度更新。无需额外指定 ACCESS_COARSE_LOCATION

于 2016-06-20T12:39:14.733 回答