安卓GPS定位精度问题

35

我正在开发Android的GPS追踪应用程序,以下是我的代码架构:

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

    }

这里的准确性是 LocationRequest.PRIORITY_HIGH_ACCURACY,间隔时间是

locationRequest.setInterval(3000)

这里是GoogleApiClient实现代码。

这个应用程序的GPS信息部分包含经度、纬度和精度参数。

我的发现:onLocationChanged(Location location)方法中,我通过location.getAccuracy()检查位置对象的精度。如果精度小于50米,则接受它。

在85%的情况下,它像魔术一样正常工作。它从GPS发送给我精确的位置。但在15%的情况下,它会向我发送不准确的位置,例如>300米。

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

我的问题:

  1. 如何使精度接近99%?我的代码架构有问题吗?
  2. GPS精度是否取决于设备配置?如果是,那么我可以为低配置设备做些什么?
  3. Uber、Go-JEK等共享出行应用程序如何适用于所有设备?它们是否对GPS进行了额外的编码?
  4. 我的应用程序面向孟加拉国。这里的互联网速度很慢。这会对GPS精度产生负面影响吗?

感谢您提供的帮助。同时,也对我的糟糕英语表示抱歉。


2
你尝试过使用 FusedLocationProviderAPI 吗? - Piyush
谢谢 @Piyush,我使用了它,但没有改善。 - Md. Sajedul Karim
当你说它在85%的情况下工作正常 - 你是指你得到的位置中的85%,还是设备的85%?关于问题4 - 网络速度与GPS无关。这是两个不同的系统。 - TDG
1
你的问题很好,但我怀疑开发者会重新设计他们所做的所有艰苦努力来实现这个东西,以制作你的应用程序,当然也没有竞争。是的,GPS精度与设备有关,请查看设备规格中的网络部分,可以了解他们使用哪些卫星系统来获取GPS。网络速度与GPS无关,甚至可以关闭互联网并工作。这是主线程,请阅读所有内容,它一定会对你有所帮助:https://dev59.com/QnA75IYBdhLWcg3wuLjD - Charuක
他们没有什么特别的,只是https://developer.android.com/training/location/retrieve-current.html。 - Siddharth
2个回答

7
  1. 如何让准确度达到99%左右?我的代码结构有问题吗?

这是真实场景。无法保证所有位置提供者都能按预期工作。您应该请求最佳可用位置。

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

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

b)如果是,则我对于配置较低的设备能做什么?

由于这是硬件问题,在此您无能为力。但是,其他位置源可以弥补GPS数据的缺乏,例如AGPS(辅助gps),wifi和蜂窝定位。此外,还有一些付费选项,它们提供使用wifi接入点和cellids来定位设备的数据库(他们声称他们在wifi上提供最佳解决方案,但我不确定,因为我没有使用过。您可以查看一下http://combain.com)。 Wifi和cellid还取决于周围有多少wifi接入点和基站以及它们有多远(信号强度)。如果您需要50m的精度,则蜂窝定位无关紧要,但wifi有可能更接近这个值。

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

  • 3G iPhone w/ A-GPS ~ 8 米
  • 3G iPhone w/ wifi ~ 74 米
  • 3G iPhone w/ Cellular positioning ~ 600 米
  1. Uber,Go-JEK等共乘应用程序如何适用于所有设备?它们是否具有GPS专用的额外编码?

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

  1. 我的应用程序面向孟加拉国。这里的互联网速度很慢。是否会对GPS精度产生负面影响?

其他答案声称互联网与GPS无关。是的,它与GPS无关,但与位置有关。 AGPS使用互联网获取3种类型的数据(卫星信号,星历和星历),以帮助GPS更快地提供位置修复。如果星历和星历过时或设备从上个位置修复移动了几百公里,则称为冷启动,并且需要大约12-15分钟才能完成而没有AGPS。

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

参考资料:


3

首先,(第一和第二)

  1. 我该如何让准确率接近99%?我的代码架构有什么问题吗?

  2. GPS的精度是否取决于设备配置?如果是,则对于低配置设备,我该怎么办?

在这里,设备配置和代码架构都很重要。如果您已经达到85%的成功率,我认为代码架构没问题。
就GPS而言,视线是设备配置和精度方面的重要因素。 虽然低成本手机可以通过清晰的视线返回准确的位置。您可以尝试运行2个周期或等待以获得更高的准确性。

在最坏的情况下,您还可以尝试使用LocationManager和GPS提供程序技术检索位置,作为15%的后备,只是为了比较并确保您正在使用最准确的位置。 位置策略将其放置为

在大多数情况下,通过使用位置服务API,您可以获得更好的电池续航时间以及更适当的准确性。

  1. Uber,Go-JEK等共享乘车应用程序如何适用于所有设备?它们是否有专门的GPS编码?
    它们确实可以工作,但并非始终具有应用程序内接收到的最高精度。如果对我们开发人员来说有任何位置黑客技巧,我们需要找到它们,也许是第五页的谷歌搜索结果 :) 或从开放源代码环境中受益。对我而言,最佳实践和Android repo链接就足够了。您已经遵循了像接收位置更新之类的帖子。

  2. 我的应用程序面向孟加拉国。这里的互联网速度很慢。它会对GPS精度产生负面影响吗?
    互联网和LocationManager + GPS_PROVIDER之间没有关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接