Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GPS坐标分散_Android_Geolocation_Gps - Fatal编程技术网

Android GPS坐标分散

Android GPS坐标分散,android,geolocation,gps,Android,Geolocation,Gps,我有以下代码,似乎工作正常: 然而,当我在谷歌地图上绘制我收集的数据时,GPS坐标在某些情况下非常分散,或者它将沿着我刚刚找到的路径行进,然后突然跳到一英里外的一个点,然后再返回。有办法解决这个问题吗?我想是某种精度检查吧 更新: 基本上我的问题就是这样一个例子- 更新2: 我考虑过不把这当作赏金,但我想我还是完全了解这里发生了什么,看看我的方法是否过火了。我仍然有同样的问题,我的坐标有抖动,尽管事实上我的精度是3米,等等。现在这可能是可用的卫星,等等。我不知道,但基本上我试图了解所有其他应用程

我有以下代码,似乎工作正常:

然而,当我在谷歌地图上绘制我收集的数据时,GPS坐标在某些情况下非常分散,或者它将沿着我刚刚找到的路径行进,然后突然跳到一英里外的一个点,然后再返回。有办法解决这个问题吗?我想是某种精度检查吧

更新

基本上我的问题就是这样一个例子-

更新2

我考虑过不把这当作赏金,但我想我还是完全了解这里发生了什么,看看我的方法是否过火了。我仍然有同样的问题,我的坐标有抖动,尽管事实上我的精度是3米,等等。现在这可能是可用的卫星,等等。我不知道,但基本上我试图了解所有其他应用程序,特别是锻炼应用程序,能够在同样的情况下获得如此平滑的读数

我在Quora上发现了这一点,但不幸的是,它并没有给我的问题提供太多的见解,除非你想使用卡尔曼滤波器,但肯定有不太复杂的方法,因为我怀疑大多数应用程序都实现了这一点

不管怎么说,如果一个开发伙伴想分享他们正在用一些伪代码做什么,那将是非常感激的。我的意思是,如果我坚持使用Kalman,我会的,但我确信必须有更容易实现的算法,并且希望学习这些算法以及如何实现它们,这是非常合适的

上下文:这是一个移动步行应用程序

所以我试图从中收集信息的相关问题 :这是一个很好的开始,尽管我不确定我需要实现什么伪代码才能正确地使最小二乘拟合正常工作,这样我就有了样条线GPS数据,然后我可以在谷歌地图之类的东西上查看,以确认我做得正确。我想问题是,如果这是我处理的一般X和Y数据,而不是地理坐标,我可以在matlab中编写一些东西来测试它,然后继续

更新3

一张我收到的混乱的GPS数据的图像

代码

您得到的是因为您的标准将最佳提供商确定为
网络提供商
。 它不识别您的位置,而是提供覆盖您设备范围的基站的位置。因此,当您在任何建筑物外时,最好使用
GPS\u提供商
获得精确的地理位置。您之所以获得分散坐标,是因为您的设备位于另一个基站的范围内发生位置跳转。直接使用
GPS\U提供商
是您将获得的最佳解决方案。

查看Reto Meier的文章(包括代码)。它应该给你很多信息去思考。您至少应该设置最小距离和时间参数

lm.requestLocationUpdates(lm.getBestProvider(criteria, true), 5000, 20,
        locationListener);

此外,您还可以组合多个提供者,以获得目前所能获得的最佳坐标。祝你好运

GPS数据本身容易出错。即使您正确设置了所有LocationManager(看起来是这样),您也会看到位置中偶尔出现抖动

准确度

需要注意的一点是,GPS精度仅为您提供了一个估计,即在接收到GPS信号的情况下,计算结果有多好。系统误差可以给你一个很好的精度数字(100米),但在较低的水平上,它只是给你一个计算收敛的指示

过滤

过滤,就像很多事情一样,如果你做得尽可能少的话是最好的。精度过滤器应该能够消除较大的错误,如果您最终得到一个好的阈值,您可能能够获得平滑的数据


如果为运行应用程序的位置更改设置一个阈值,您也可能会获得一些好处。例如,跑步者在一段时间内只能跑一定距离,通过设置上限阈值(Usain螺栓切断),您应该能够消除缺点。问题是,如果你的第一点是错误,你最终会删除所有其他点

卡尔曼滤波

卡尔曼滤波器是一个很好的解决方案,我已经在我正在开发的导航应用程序上实现了它。结果非常合理,甚至允许在GPS不好或不可用的情况下进行有限的航位推算。不幸的是,我不能分享源代码,但如果你决定这样做,我可以给你一些指导。最好的结果来自一个6自由度的过滤器,在这里你可以计算加速度和速度,并用它来估计位置。这不是最简单的解决方案,但我们已经看到了很好的结果

最小二乘法

卡尔曼滤波器是伟大的,因为它可以用于实时过滤的位置。它跟踪自己的状态,您不需要存储旧位置。但另一方面,如果您想对路线进行后期处理,最小二乘拟合是一种最佳方法。(Kalman由LSQ公式推导而来)。我不做很多后处理,但我想我可以在上面找到一些旧的教科书。然而,理论应该是相同的


大多数GPS设备都很好,从我看到的所有测试中,我不经常看到您在示例中看到的抖动。然而,我实施卡尔曼滤波的一大优势和原因是,您的行驶距离和速度计算更加准确。

一个简单的方法是扔掉任何旧的或不准确的数据,并保持经度和纬度的运行平均值

private static final long WILDLY_OUT = 15;
private static final long TOO_OLD = 30000;
private static final long NO_SAMPLES = 5;

double lastLocationTime;

double calclongitude(Location location, double oldLongitude) {
    double newLongitude = oldLongitude;

    if (location.getAccuracy() < WILDLY_OUT) {
        newLongitude = (NO_SAMPLES * oldLongitude + location
                .getLongitude()) / (NO_SAMPLES + 1);
        lastLocationTime = System.currentTimeMillis();
    }

    if (lastLocationTime > TOO_OLD) {
        newLongitude = location.getLongitude();
    }

    return newLongitude;
}
private static final long\u OUT=15;
私人静态最终太长_OLD=30000;
私有静态最终无长_样本=5;
双上次定位时间;
双经度(位置,双经度){
双新经度=
private static final long WILDLY_OUT = 15;
private static final long TOO_OLD = 30000;
private static final long NO_SAMPLES = 5;

double lastLocationTime;

double calclongitude(Location location, double oldLongitude) {
    double newLongitude = oldLongitude;

    if (location.getAccuracy() < WILDLY_OUT) {
        newLongitude = (NO_SAMPLES * oldLongitude + location
                .getLongitude()) / (NO_SAMPLES + 1);
        lastLocationTime = System.currentTimeMillis();
    }

    if (lastLocationTime > TOO_OLD) {
        newLongitude = location.getLongitude();
    }

    return newLongitude;
}