令人难以置信的GPS点数不准确。是什么原因?

时间:2016-11-06 07:23:55

标签: android gps location

我开发了Android应用程序,用于存储用户的GPS位置。

我的一位顾客给了我他的设备,我注意到有时设备的准确性非常糟糕且令人难以置信。有时,设备会返回距离实际位置约200公里的点。

您可以在该设备的以下GPS位置示例中看到此信息。你看到两点距离真实位置约200公里。

该设备是带有Android 4.2.2的三星SM-T111,我只使用GPS提供商获取位置(LocationManager.GPS_PROVIDER)。

我想知道导致问题的原因是什么?这种不准确?

我直接存储从提供商处收到的积分。这是我在onLocationChanged中的代码:

更新

        @Override
        public void onLocationChanged(Location location) {
            try {

                    if (location.getAccuracy() <= MAX_DISTANCE_TOLERANCE) {

                        gotLocation(new GPSLocation(location.getLatitude(),
                                location.getLongitude(), location.getTime(),
                                location.getAccuracy(),
                                location.getProvider(), location.getSpeed()));
                    }               

            } catch (Exception e) {
                MessageBox.showExceptionToast(_context, e);
            }
        }

enter image description here

enter image description here

7 个答案:

答案 0 :(得分:12)

  

我想知道这种不准确的问题是什么?

最有可能的硬件/固件。换句话说,怪三星。

它不太可能是你的应用程序。假设您为这些失败点获得的准确度值在MAX_DISTANCE_TOLERANCE之内,并且假设MAX_DISTANCE_TOLERANCE小于200km,则您忠实地使用所获得的数据。如果这些数据有缺陷,那些缺陷就来自系统本身。

您可以创建更具适应性的过滤器。除了测试MAX_DISTANCE_TOLERANCE的准确性之外,您还可以:

  • 计算您获得的最后一个位置与您现在正在处理的新位置之间的时间
  • 根据您期望设备运行的最大速度计算当时可以覆盖的最大距离
  • 计算这两个位置之间报告的距离(Location上有静态方法)
  • 拒绝报告的距离超出您认为设备在此时间段内可能移动的位置

例如,您的第一个错误修复程序在前一个修复程序发布后20分钟。除非您认为该设备可能以600公里/小时的速度行驶,否则您将拒绝该错误修复是不切实际的。

此算法仅在您进行一些一致的修复后才能运行。您可能会要求快速的位置更新几分钟,检查数据,抛弃任何异常值,然后应用“设备真的可以走得那么远吗?”测试未来的修复。

答案 1 :(得分:5)

如果您不信任Google的Fused API或任何其他算法,并且您对NMEA格式化的原始GPS数据有所了解,那么我建议您深入了解原始GPS数据,并查看实际情况继续。

您可以从GPS芯片组获取NMEA_0183 GPS消息,并分析卫星星座,SNR,DOP,lat,lon等。

LocationManager LM = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        ((LocationManager)getSystemService(Context.LOCATION_SERVICE)).requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,new LocationListener(){
            @Override
            public void onLocationChanged(Location loc) {}
            @Override
            public void onProviderDisabled(String provider) {}
            @Override
            public void onProviderEnabled(String provider) {}
            @Override
            public void onStatusChanged(String provider, int status,Bundle extras) {} });

        //for API23 and below
        LM.addNmeaListener(new GpsStatus.NmeaListener() {
        public void onNmeaReceived(long timestamp, String nmea) {
            Log.d(TAG, nmea+"\n");
        }});

       //for API24 and above
       LM.addNmeaListener(new OnNmeaMessageListener() {
        public void onNmeaMessage(String nmea, long timestamp) {
            Log.d(TAG, nmea+"\n");
        }});

以下是一些有用的NMEA句子:

GGA - Global Positioning System Fix Data

GSA - GPS DOP and active satellites

GSV - Satellites in view

ZDA - Time & Date - UTC, day, month, year and local time zone

答案 2 :(得分:3)

如果您使用的是Google融合位置提供商,那么这些错误肯定会发生,因此如果您想获得最准确的结果并将其限制为仅限GPS,请使用Android位置框架代替Google Play服务位置API。

如果您想继续使用Google的位置API,也可以过滤主要距离更改。

答案 3 :(得分:3)

这可能有很多原因。列出其中一些。

(1) GPS hardware used with in device.
(2) Weather condition( This will not generate much difference in distance. This may make a difference of about 20-30 KM as per my testing )
(3) Nearby location. This includes buildings and all other.

有些时候Android GPS开始表现有线。在创建基于cab的应用程序时,我也遇到了这个问题。

CommonsWare解决方案几乎可以解决您的问题。在那里你可以拿出一些更具体的算法来完成任务。

在测试这种情况时,我发现One-Plus-One设备存在此问题,而One-Plus-Two设备没有问题。

解决方案:您应该检查用户在您的时间范围内可以行驶的最大距离。这里的时间范围是更新GPS位置的时间。此距离应代表您之前有效的纬度和经度相对于您当前的纬度和经度计算。

根据您的日志,我会看到您的位置更新之间的时差。确保您有更新的修复时间间隔。

答案 4 :(得分:1)

  

最重要的收获我希望离开你是需要时间   了解您的准确度要求和用户的基本地理位置   行为模式。我试图大量使用示例用例   帮助说明一些概念。

     

这是使用重载完成的   LocationManager.requestLocationUpdates()方法。这些属性   调整设备请求位置更新的积极程度   经过的最短时间和最小行程距离。

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,listener);

此方法可以解决您的问题 动态更改requestLocationUpdates()设置的一组非常基本的技术要求:

public void onLocationChanged(Location location) {
     if(location.getAccuracy() < 100.0 && location.getSpeed() < 6.95){
          //Do something
     }
     else{
          //Continue listening for a more accurate location
     }
}
  • 使用minTime = 0和minDistance = 0启动应用程序 积极的设置,以尽快获得准确的位置。

  • 一旦精度小于50米且速度小于45英里/小时,设定minTime = 5000和minDistance = 25.

  • 速度等于0超过1小时。关闭位置监听器并通知用户。

  • 电池电量不足。关闭位置监听器并通知用户。

答案 5 :(得分:1)

您可以选择融合位置Api 技术以获得更好的效果,

现在通常用于位置更新,它总是在几米而非千米的范围内提供几乎准确或近似的结果。

您可以按照Link

进行操作

答案 6 :(得分:1)

How to get more accuracy by GPS_PROVIDER

在使用准确性之前,您必须检查位置是否准确。

祝你好运。