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

Bob*_*obs 15 gps android location

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

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

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

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

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

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

UPDATE

        @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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

Com*_*are 12

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

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

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

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

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

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

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


ugu*_*gur 6

如果您不信任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");
        }});
Run Code Online (Sandbox Code Playgroud)

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

GGA - 全球定位系统修复数据

GSA - GPS DOP和有源卫星

GSV - 视野中的卫星

ZDA - 时间和日期 - UTC,日,月,年和当地时区


小智 3

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

如果您想继续使用 Google 的位置 API,您还可以过滤主要距离变化。