我为 Android 开发了一个应用程序,用于存储用户的 GPS 位置。
我的一位客户将他的设备送给了我,我注意到有时设备的准确度真的很差,令人难以置信。有时设备会返回距离实际位置约 200 公里的点。
您可以在该设备的以下 GPS 位置示例中看到这一点。你看到两个点距离真实位置大约 200 公里。
设备是 Samsung SM-T111 和 Android 4.2.2,我只使用 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);
}
}
最佳答案
I want to know what can be the problem for this kind of inaccuracy?
硬件/固件,很有可能。换句话说,责怪三星。
它不太可能是您的应用。假设您为这些失败点获得的精度值在 MAX_DISTANCE_TOLERANCE
范围内,并且假设 MAX_DISTANCE_TOLERANCE
小于 200 公里,那么您将忠实地使用您获得的数据。如果该数据存在缺陷,则这些缺陷来自系统本身。
您可以创建一个更具适应性的过滤器。除了测试 MAX_DISTANCE_TOLERANCE
的准确性外,您还可以:
- 计算您获得的最后一个位置与您现在正在处理的新位置之间的时间
- 根据您预计设备行驶的最大速度,计算该时间内可以行驶的最大距离
- 计算这两个位置之间报告的距离(
Location
上有一个静态方法用于此) - 如果报告的距离比您认为设备在这段时间内可能移动的距离更远,则拒绝位置
例如,您的第一个错误修复比上一个修复晚了 20 分钟。除非您认为该设备可能以 600 公里/小时的速度行驶,否则您会拒绝该错误修复,因为它不切实际。
此算法只有在您进行了一些一致的修复后才会起作用。您可能会请求几分钟的快速位置更新,检查该数据,排除任何异常值,然后应用“设备真的可以行驶那么远吗?”测试 future 的修复。
关于android - 令人难以置信的不准确的 GPS 点。是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40446956/