首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >难以置信的不准确的GPS点。原因何在?

难以置信的不准确的GPS点。原因何在?
EN

Stack Overflow用户
提问于 2016-11-06 07:23:54
回答 7查看 3.8K关注 0票数 17

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

我的一个顾客把他的设备给了我,我注意到,有时候这个设备的准确性很差,而且难以置信。有时,该设备返回距离实际位置约200公里的点。

您可以在该设备的以下GPS位置示例中看到这一点。你看,两个点离真正的位置大约200公里。

该设备是三星SM 111和安卓4.2.2,我只使用一个全球定位系统供应商获取位置(LocationManager.GPS_PROVIDER)。

我想知道是什么原因造成的问题,因为这种不准确?

我直接存储从提供者收到的点。这是我在onLocationChanged中的代码

更新

代码语言:javascript
运行
复制
        @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);
            }
        }

EN

回答 7

Stack Overflow用户

发布于 2016-11-14 13:57:58

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

很可能是硬件/固件。换句话说,应该归咎于三星。

这不太可能是你的应用。假设这些失败点的精度值在MAX_DISTANCE_TOLERANCE内,并且假定MAX_DISTANCE_TOLERANCE小于200公里,那么您将忠实地使用所获得的数据。如果这些数据有缺陷,那么这些缺陷来自于系统本身。

你可以创建一个更自适应的滤波器。除了测试MAX_DISTANCE_TOLERANCE的准确性之外,您还可以:

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

例如,您的第一次错误修复是在上一次修复20分钟之后进行的。除非你认为这个设备可以以每小时600公里的速度运行,否则你会拒绝错误的修复,因为这是不切实际的。

只有在得到一些一致的修正后,此算法才能工作。您可能要求快速更新几分钟的位置,检查这些数据,排除任何异常值,然后应用“设备真的能走那么远吗?”测试未来的修复。

票数 15
EN

Stack Overflow用户

发布于 2016-11-18 21:03:05

如果你不相信Google的融合API,或者任何其他算法,你对NMEA格式的原始GPS数据有一些了解,那么我建议你深入研究原始的GPS数据,看看到底发生了什么。

您可以从全球定位系统芯片组获取NMEA_0183全球定位系统信息,并分析卫星星座、信噪比、DOP、lat、lon等。

代码语言:javascript
运行
复制
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句子:

全球定位系统修复数据

GSA和主动卫星

GSV -在望卫星

ZDA -时间和日期-协调世界时,日、月、年和当地时区

票数 6
EN

Stack Overflow用户

发布于 2016-11-14 12:13:25

如果您使用的是Google融合定位提供商,那么这些错误肯定会发生,所以如果您希望获得最准确的结果并将其限制在GPS上,那么就使用Android定位框架而不是Google服务定位API。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40446956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档