Android GPS精度计算距离问题

时间:2014-02-25 09:44:14

标签: android localization gps

我认为这个问题众所周知。

那我的问题是什么?

我正在编写一个使用GPS提供商的应用程序来查找用户的位置并计算从用户到终点的距离。这工作正常。但是会出现问题:

详细问题:

如果你带着我的应用程序环游城市,它会给你一些距离的数字,但......距离正在改变。无论我是否朝着我的目的地移动,距离要么越来越高或越来越低(计算的距离的值是从高到低“跳跃”,反之亦然)前一个距离的数量,但逻辑上它应该越来越低。我相信这是因为GPS信号有时会丢失或变弱,而且无法正确计算距离。

我需要帮助吗?

我想知道有没有办法过滤从GPS接收到的坐标,这样我就可以得到更准确的距离数,所以当我向终点移动时,距离计算正确(尽可能不必为100%)正确)而不是像疯了一样上下。

如何获取坐标并计算距离:

public void onLocationChanged(Location location) 
{
    txtLat = (TextView) findViewById(R.id.currentCoordinatesView);
    clat = location.getLatitude();
    clong = location.getLongitude();

    Location location1 = new Location("Start");
    location1.setLatitude(clat);
    location1.setLongitude(clong);

    Location locationB = new Location("Finish");

    locationB.setLatitude(endLatitude); //endpoint coordinates
    locationB.setLongitude(endLongitude);

    distance = location1.distanceTo(locationB); //calculate the distance

    TextView TextDistance = (TextView)findViewById(R.id.TextDistance);
    TextDistance.setText(new DecimalFormat("##,###,###.##").format(distance)+" m");

    CurLat = location.getLatitude();
    CurLong = location.getLongitude();  

1 个答案:

答案 0 :(得分:2)

通过保存最后的10个位置对象并根据这些对象进行计算,可以进一步改善以下答案。例如,如果10个最后位置表明用户以1米/秒的速度向目标移动,那么表明5米跳跃的新位置很可能是不准确的,应该被忽略。

要过滤一些已更新的GPS,您可以简单地执行此类操作(3表示相对于您的实际位置的位置应该是多么准确并且可以调整):

    public void onLocationChanged(Location location) 
    {
        if (location.hasAccuracy() && location.getAccuracy() < 3) {
            txtLat = (TextView) findViewById(R.id.currentCoordinatesView);
            clat = location.getLatitude();
            clong = location.getLongitude();

            Location location1 = new Location("Start");
            location1.setLatitude(clat);
            location1.setLongitude(clong);

            Location locationB = new Location("Finish");

            locationB.setLatitude(endLatitude); //endpoint coordinates
            locationB.setLongitude(endLongitude);

            distance = location1.distanceTo(locationB); //calculate the distance

            TextView TextDistance = (TextView)findViewById(R.id.TextDistance);
            TextDistance.setText(new DecimalFormat("##,###,###.##").format(distance)+" m");

            CurLat = location.getLatitude();
            CurLong = location.getLongitude(); 
        }
    }

以下是来自Location getAccuracy()

的准确度度量的定义
  

获取此位置的估计精确度(以米为单位)。   我们将准确度定义为68%置信度的半径。换句话说,如果您绘制一个以此位置的纬度和经度为中心的圆,并且半径等于精度,那么真实位置在圆内的概率为68%。

     

在统计学术语中,假设位置误差是随机的,具有正态分布,因此68%置信圆表示一个标准偏差。请注意,在实践中,位置错误并不总是遵循这样简单的分布。

     

此准确度估算仅涉及水平精度,如果包含在此位置,则不表示方位,速度或高度的准确性。

     

如果此位置没有准确性,则返回0.0。 LocationManager生成的所有位置都包含准确度。