Android GPS定位精度问题

Md.*_*rim 32 gps android tracking

我正在研究android中的gps跟踪应用程序.这是我的代码架构:

  1. BackgroundSyncService:用于获取位置更新的服务类.这里GoogleApiClient已初始化并实现了其他与位置相关的方法.
  2. AppRunCheckerReceiver:一个BroadcastReceiver类,它将BackgroundSyncService在一个时间间隔内检查我是否正在运行.如果它停止然后它开始.
  3. GpsEnableReceiver:如果gps状态改变,它将触发的BroadcastReceiver.它将BackgroundSyncService在一个时间间隔内检查我是否正在运行.如果它停止然后它开始.
  4. InternetConnectionStateReceiver:Internet状态更改时将触发的BroadcastReceiver.它将BackgroundSyncService在一个时间间隔内检查我是否正在运行.如果停止,则启动.

在我的BackgroundSyncService服务中,我使用以下方式初始化GoogleApiClient:

public void setLocationLocationRequest() {

        try {
            googleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).addApi(com.google.android.gms.location.LocationServices.API).build();

            locationRequest = new LocationRequest();
            locationRequest.setInterval(3000);
            locationRequest.setFastestInterval(3000);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            googleApiClient.connect();
        } catch (Exception e) {

    }
Run Code Online (Sandbox Code Playgroud)

这里是accuricy LocationRequest.PRIORITY_HIGH_ACCURACY和间隔

locationRequest.setInterval(3000)
Run Code Online (Sandbox Code Playgroud)

这是GoogleApiClient实现代码.

此应用程序GPS信息部分包含纬度经度和精度参数

我的发现:在onLocationChanged(Location location)方法中我用这种方式检查Location对象的准确性:location.getAccuracy().如果精度小于50米,那么我接受它.

在85%的情况下,它像魅力一样工作.它向我发送GPS的确切位置.但在15%的情况下,它给我发送了不准确的位置,如超过300米.

15%的设备是低成本的中国品牌手机.

我的问题:

  1. 如何使准确度达到99%左右.我的代码架构有什么问题吗?
  2. GPS精度是否取决于设备配置?如果是,那么我可以为低配置设备做什么?
  3. Uber,Go-JEK等车载共享应用程序如何适用于所有设备?他们是否只有GPS的额外编码?
  4. 我的申请是孟加拉国.互联网很慢.它对GPS精度有负面影响吗?

在此先感谢此主题.并且抱歉英语不好.

小智 21

位置更新可以通过以下方式完成:

  1. 从GPS获得的位置比从网络获得的位置更准确,因此如果您需要精确度使用GPS

  2. 不确定这一点,但我认为它的背景你想要什么类型的位置,如你想要的准确性或最快的,所以根据选择你的提供商

  3. FusedLocation提供程序是现在获取Android位置的最有效和最有效的解决方案,它收集来自不同来源的位置数据,并根据传递的参数,如您希望更新位置的时间,您想要高精度或不等它为您提供最佳位置.

  4. 是的你应该使用FusedLocationProvider来获取Android上的位置,因为谷歌也推荐这个,它是目前在Android上获取位置的最有效和最有效的方式.

在此输入图像描述

你为什么不尝试创造 Criteria.ACCURACY_HIGH

表示高精度要求的常数 - 可用于水平,高度,速度或轴承精度.对于水平和垂直位置,这大致相当于小于100米的精度.

Android试图掩盖我们硬件的现实,但实际上只有两个位置提供商:GPS和网络.GPS位置很慢,并非所有设备都有,但它是准确的.网络位置更快,几乎所有设备都支持,但准确性较低.

Google通过融合位置提供商改进了地图和位置管理.

与融合位置提供者交互的主要入口点.方法必须与GoogleApiClient结合使用.


码:

 new GoogleApiClient.Builder(context)
         .addApi(LocationServices.API)
         .addConnectionCallbacks(this)
         .addOnConnectionFailedListener(this)
         .build()
Run Code Online (Sandbox Code Playgroud)

gps - >(GPS,AGPS): GPS位置提供商的名称.该提供商使用卫星确定位置.根据条件,此提供程序可能需要一段时间才能返回位置修复程序.需要权限android.permission.ACCESS_FINE_LOCATION.

network - > (AGPS,CellID,WiFi MACID):网络位置提供商的名称.该提供商根据蜂窝塔和WiFi接入点的可用性确定位置.通过网络查找检索结果.需要权限android.permission.ACCESS_COARSE_LOCATION或android.permission.ACCESS_FINE_LOCATION.


其他选择:

getLastKnownLocation()

在getLastKnownLocation()此返回最后已知的位置......你以后重新安装应用程序不会有任何最后的已知位置...所以它会导致NPE ...而不是使用下面的代码

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            //here is the if-else change so code avoids falling into both loops
         // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            } else if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network Enabled");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}
Run Code Online (Sandbox Code Playgroud)

检查我找到的几个最好的例子:

它对我有用......也应该为你工作......


ugu*_*gur 6

  1. 如何使准确度达到99%左右.我的代码架构有什么问题吗?

这是现实生活中的情景.您无法确保所有位置提供程序都按预期工作.你应该要求最好的位置.

  1. a)GPS精度是否取决于设备配置?

是.一些设备可能具有旧的GPS芯片组,其只能跟踪GPS信号(美国),因为还有其他定位系统,如Galileo(欧洲),GLONASS(俄罗斯),QZSS(日本)和北斗(中国).芯片组对这些类型的支持越多,您就越有可能跟踪更多的卫星定位.此外,TTFF(首次定位的时间)取决于gps接收器有多少个通道.

b)如果是,那么我可以为低配置设备做些什么?

由于这是硬件问题,因此您无法在此处执行任何操作.但其他位置信号源可以弥补GPS数据的不足,例如AGPS(辅助gps),wifi和蜂窝定位.还有一些付费选项提供了一个数据库,使用wifi接入点和cellids定位您的设备(他们声称他们提供了wifi的最佳解决方案,但我不确定,因为我不使用它.你可以检查出来http:// combain .com).Wifi和cellid还取决于可用的无线接入点和小区塔的数量以及它们的距离(信号强度).如果你需要50米的精度,蜂窝定位无关,但wifi有机会接近这个值.

2009年的一些研究结果[3]

  • 3G iPhone带A-GPS~8米
  • 3G iPhone带wifi~74米
  • 3G iPhone带手机定位~600米
  1. Uber,Go-JEK等车载共享应用程序如何适用于所有设备?他们是否只有GPS的额外编码?

他们可能有特定的位置策略,但它将基于在GPS中断期间使用其他来源.

  1. 我的申请是孟加拉国.互联网很慢.它对GPS精度有负面影响吗?

其他答案声称互联网与GPS无关.是的,它与GPS无关,但与位置无关.AGPS使用互联网获取3种类型的数据(卫星信号,年历和星历),这有助于GPS更快地提供定位.如果星历和历书过时或者设备从先前的定位移动了几百公里那么它被称为冷启动并且在没有AGPS的情况下需要大约12-15分钟.

融合位置提供商已经知道如何使用这些配置提供最佳解决方案,因此您应该祝福它.

参考文献:


Par*_*rth 3

第一,(和第二)

  1. 我怎样才能使准确率接近99%。我的代码架构有问题吗?

  2. GPS 精度是否取决于设备配置?如果是,那么我能为低配置设备做什么?

设备配置和代码架构在这里都很重要。如果你已经达到 85% 的成功率,那么我认为代码架构就可以了。
就 GPS 而言,视线是设备配置和准确性的一个重要因素。尽管低成本手机可以返回视线清晰的准确位置。您可以尝试再运行 2 个周期/等待以获得更高的精度。

在最坏的情况下,无论其价值如何,您还可以尝试使用LocationManager和 GPS 提供商技术检索位置,该技术可作为 15% 的后备方案,只是为了进行比较并确保您使用的是可以获得的最准确的位置。 位置策略将其描述为

在大多数情况下,通过使用位置服务 API,您将获得更好的电池性能以及更合适的精度。

  1. Uber、Go-JEK 等乘车共享应用程序如何适用于所有设备?他们是否有仅针对 GPS 的额外编码?
    它们确实有效,但对于应用程序内收到的位置而言并不总是具有最高的准确性。如果对我们开发人员来说有任何位置黑客攻击,我们需要找到它们,可能是谷歌搜索结果的第 5 页:) 或从开源环境中受益。对我来说,最佳实践和 Android 存储库链接就足够了。您已经关注了“接收位置更新”等帖子

  2. 我的申请是针对孟加拉国的。这里的网速很慢。它对 GPS 精度有负面影响吗?互联网和LocationManager + GPS_PROVIDER
    之间没有关系