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



我正在开发一个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();
    }

计算距离的代码非常简单位置1.到(位置2)的距离;

我也有同样的问题。在我的应用程序中,我从任何提供商那里获得当前位置,然后从一组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);
                    }

更新/修复:停止使用谷歌的Location.distancebetween&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;
}

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

(几乎所有的GPS接收器都可以选择配置为在不移动的情况下支持不同位置的交付。但作为应用程序开发人员,您不能更改固定配置。)

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

据我所知,"gps正在说谎",准确位置约为"英尺"米。需要更高精度的商业应用程序在已知的确切位置有一个gps接收器,并在一个单独的信道上将差异发送给"躺着的gps",这样手机上的gps位置就可以得到相应的校正。

最新更新