Android GPS定位准确性问题

时间:2017-02-21 07:56:01

标签: android gps tracking

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

  1. BackgroundSyncService :用于获取位置更新的服务类。这里GoogleApiClient已初始化并实现了其他与位置相关的方法。
  2. AppRunCheckerReceiver :一个BroadcastReceiver类,用于检查我的BackgroundSyncService是否在某个时间间隔内正在运行。如果它停止则开始。
  3. GpsEnableReceiver :如果gps状态发生变化,它将触发一个BroadcastReceiver。它将在一个时间间隔内检查我的BackgroundSyncService是否正在运行。如果它停止则开始。
  4. InternetConnectionStateReceiver :互联网状态发生变化时会触发的BroadcastReceiver。它将在一个时间间隔内检查我的BackgroundSyncService是否正在运行。如果停止,则启动。
  5. 在我的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) {
    
        }
    

    此处,accuricy为LocationRequest.PRIORITY_HIGH_ACCURACY,间隔为

    locationRequest.setInterval(3000)
    

    here是GoogleApiClient实施代码。

    This应用 GPS信息部分包含纬度经度和准确度参数

    我的调查结果onLocationChanged(Location location)方法我以这种方式检查位置对象的准确性:location.getAccuracy()。如果精度小于50米,那么我接受它。

    在85%的案例中,它像魅力一样工作。它向我发送GPS的确切位置。但在15%的情况下,它向我发送了不准确的位置,例如更多> 300米。

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

    我的问题:

    1. 如何使准确度接近99%。我的代码架构有问题吗?
    2. GPS准确度取决于设备配置吗?如果是,那么我可以为低配置设备做些什么?
    3. Uber,Go-JEK等车载共享应用程序如何适用于所有设备?他们是否只有GPS的额外编码?
    4. 我的申请是针对孟加拉国的。互联网很慢。它对GPS精度有负面影响吗?
    5. 提前感谢此主题。并且抱歉英语不好。

2 个答案:

答案 0 :(得分:20)

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

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

  2. 不确定这一点,但我认为关于您想要的准确性或最快的位置的背景,根据选择您的提供者

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

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

  5. enter image description here

    为什么不尝试创建Criteria.ACCURACY_HIGH

      

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

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

    Google使用fused location provider.

    改进了地图和位置管理

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

    代码:

     new GoogleApiClient.Builder(context)
             .addApi(LocationServices.API)
             .addConnectionCallbacks(this)
             .addOnConnectionFailedListener(this)
             .build()
    
      

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

         

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

    其他选项:

    getLastKnownLocation()

    getLastKnownLocation()这将返回最后一个已知位置...重新安装应用程序后,它将没有任何最后已知位置...因此它将导致NPE ...而是使用下面的代码< / p>

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

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

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

答案 1 :(得分:5)

  
      
  1. 如何使准确度接近99%。我的代码架构有问题吗?
  2.   

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

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

YES。一些设备可能具有旧的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 w / wifi~74米
  • 3G iPhone带手机定位~600米
  
      
  1. Uber,Go-JEK等车载共享应用程序如何适用于所有设备?他们是否只有GPS的额外编码?
  2.   

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

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

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

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

参考文献: