DistanceTo()不能给我稳定的测量结果

时间:2013-11-30 15:06:43

标签: android gps distance latitude-longitude

我正在开发一个Android应用程序,用于获取用户的位置并计算他与其他位置之间的距离。

问题是,每次按下按钮时,DistanceTo功能都会给我不同的测量值,尽管我不会移动设备。

有时它给我完美的测量(给我18米),有时它给我太糟糕的测量(53米)而实际距离15米! 提示:我需要非常精确的测量精度< 4M

这是获取位置的代码

LM = (LocationManager) getApplicationContext().getSystemService(
            LOCATION_SERVICE);

    Criteria criteria = new Criteria();
    provider = LM.getBestProvider(criteria, false);
    try {

        LM.requestLocationUpdates(provider, 100000, 1, this);

        if (LM != null) {
            Loc = LM.getLastKnownLocation(provider);
            LM.removeUpdates(this);
            if (Loc != null) {
                   //set the location

            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

和克拉距离的代码很容易     Location1.distanceTo(LOCATION2);

3 个答案:

答案 0 :(得分:0)

distanceTo功能有效,但您的应用没有过滤器来检测您不移动时的情况。 一些像iphone这样的智能手机内置了仅在移动时才能提供GPS位置。 你所看到的是所谓的静态运动。

(几乎所有GPS接收器都可以选择配置为在不移动时抑制不同位置的传送。但作为App开发者,您无法更改该固定配置。)

您必须编写这样的过滤器,以避免在同一位置采取不同的措施。

答案 1 :(得分:0)

我有完全相同的问题。 在我的应用程序中,我从任何提供程序获取当前位置,然后计算一组LatLng的距离。这是在10秒的定时器循环中完成的。

lat01,lng01,lat02和lng02已修复,我已确认它们没有更改。 但是在每个定时器循环中,我得到不同的值。

                            grep "in for" mymap.log  | sort | uniq 
                                in for loop dist 18.917835 <lat01> <lng01> <lat02> <lng02>
                                in for loop dist 324.48648 <lat01> <lng01> <lat02> <lng02>
                                in for loop dist 325.92554 <lat01> <lng01> <lat02> <lng02>

逻辑是这样的:

                    if(testtimer==null)
                    {
                        testtimer = new Timer();
                        testtimer.scheduleAtFixedRate(new TimerTask() {
                            @Override
                            public void run() {
                                Location loc1 = new Location("test");
                                loc1.setLatitude(lat01);
                                loc1.setLatitude(lng01);

                                Location loc2 = new Location("test");
                                loc2.setLatitude(lat02);
                                loc2.setLatitude(lng02);

                                for(int i=0;i<30;i++)
                                {
                                    log_write("distance loc1 to loc2 "+loc1.distanceTo(loc2));
                                }

                            }
                        },1000,10000);
                    }

更新/修复: 停止使用google的Location.distance介于&amp; location.distanceto函数。它们不起作用。

而是使用直接公式来计算距离:

double distance_between(Location l1, Location l2)
{
    //float results[] = new float[1];
    /* Doesn't work. returns inconsistent results
    Location.distanceBetween(
            l1.getLatitude(),
            l1.getLongitude(),
            l2.getLatitude(),
            l2.getLongitude(),
            results);
            */
    double lat1=l1.getLatitude();
    double lon1=l1.getLongitude();
    double lat2=l2.getLatitude();
    double lon2=l2.getLongitude();
    double R = 6371; // km
    double dLat = (lat2-lat1)*Math.PI/180;
    double dLon = (lon2-lon1)*Math.PI/180;
    lat1 = lat1*Math.PI/180;
    lat2 = lat2*Math.PI/180;

    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double d = R * c * 1000;

    log_write("dist betn "+
            d + " " +
            l1.getLatitude()+ " " +
            l1.getLongitude() + " " +
            l2.getLatitude() + " " +
            l2.getLongitude()
            );

    return d;
}

答案 2 :(得分:-1)

据我所知,“gps在撒谎”关于“费用”米的确切位置。需要更高精度的商业应用程序在已知的确切位置处具有gps接收器,并将差异传递到单独通道上的“躺着的gps”,因此可以相应地校正移动设备上的gps位置。