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

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

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

您可以在以下GPS设备的GPS位置样本中看到。 你看到两点距离真实位置约200公里。

该设备是Android 4.2.2的三星SM-T111,我只使用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); } } 

在这里输入图像说明

在这里输入图像说明

Solutions Collecting From Web of "令人难以置信的不准确的GPS点。 是什么原因?"

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

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

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

你可以创build一个更适应的filter。 除了testingMAX_DISTANCE_TOLERANCE的准确性MAX_DISTANCE_TOLERANCE ,您还可以:

  • 计算最后一个地点和现在正在处理的新地点之间的时间
  • 根据您期望设备的最高速度,计算当时可以覆盖的最大距离
  • 计算这两个位置之间报告的距离(在这个位置有一个静态方法)
  • 报告的距离远远超过您认为设备在此期间可能移动的位置

例如,您的第一个错误修复程序在前一个20分钟之后。 除非您认为设备可能以600公里/小时的速度行驶,否则您会拒绝这种不合理的修复措施,因为这是不现实的。

这个algorithm只有在你有一些一致的修正之后才能工作。 你可能会要求快速的位置更新几分钟,检查数据,抛出任何exception值,然后应用“该设备真的走了那么远? testing未来的修补程序。

如果您不信任Google的Fused API或任何其他algorithm,并且您对NMEA格式化的原始GPS数据有一些了解,那么我build议您深入了解原始GPS数据,并查看实际发生的情况。

您可以从GPS芯片组获取NMEA_0183 GPS信息,并分析卫星星座,信噪比,DOP,经纬度,等等。

 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 – 全球定位系统修复数据

GSA – GPS DOP和主动卫星

GSV – 卫星

ZDA – 时间和date – UTC,日,月,年和当地时区

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

 (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开始performance有线。 在创build基于驾驶室的应用程序时,我也面临这个问题。

CommonsWare的解决scheme几乎是解决您的问题。 在那里你可能会想出一些更具体的algorithm来完成这个任务。

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

解决scheme :您应该检查用户在您的时间范围内可以行驶的最大距离。 这里的时间框架是更新您的GPS位置的时间。 这个距离应该代表您以前的有效经度和纬度来计算您当前的纬度和经度。

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

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

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

我希望留下的最重要的东西是花时间来了解您的准确性要求和您的用户的基本地理行为模式。 我试图大胆地使用示例用例来帮助说明一些概念。

这是使用重载的LocationManager.requestLocationUpdates()方法完成的。 这些属性会调整设备以最短的时间和最短距离来请求位置更新。

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

这个方法将解决你的问题一个非常基本的dynamic改变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小时。 closures位置侦听器并通知用户。

  • 电池电量不足。 closures位置侦听器并通知用户。

您可以selectFused Location Api的技术以获得更好的结果,

现在通常用于位置更新,它总是给几乎精确或近似的结果在一些米而不是千米。

你可以按照这个链接

如何通过GPS_PROVIDER获得更高的精度

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

祝你好运。