【问题标题】:Android: Issue in calculating distance using Location managerAndroid:使用位置管理器计算距离时出现问题
【发布时间】:2013-03-21 05:24:02
【问题描述】:

目前我正在开发一个应用程序,我想在其中计算车辆行驶的距离。我的要求是在开车时,我的 Android 设备应该计算我行驶的总距离并将此信息发送到服务器。为了做到这一点,我使用了 Android 的位置管理器 API,设置了标准并使用了 getBestProvider。这样我们就可以使用 GPS 或网络来获取纬度和经度。下面是这个的代码sn-p:

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);    
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setPowerRequirement(Criteria.POWER_HIGH);
provider = locationManager.getBestProvider(criteria, false);

locationManager.requestLocationUpdates(provider,30000,5, this);

onLocationChanged() 回调方法每次都提供纬度和经度。我们总是存储以前的坐标,当我们获得新坐标时,我们使用 distanceBetween() api 找到两者之间的距离。下面是这个的代码sn-p:

public void onLocationChanged(Location location) {
                                    findLatLongDistance(location);
}

private void findLatLongDistance(Location location) {
            // TODO Auto-generated method stub
            try{
                  Date date = new Date();
                  TimeStamp2 = sdf.format(date);

                              getSavedLatLong();//get lat and long from preference
                          Location locationB = new Location("point B"); 

                          locationB.setLatitude(location.getLatitude()); 
                          locationB.setLongitude(location.getLongitude()); 

                          Location locationA = new Location("point A"); 

locationA.setLatitude(prelat_val);  //lat from pref                       locationA.setLongitude(prelong_val);  //long from pref

                          if(prelat_val>0.0 && prelong_val>0.0){
                              Toast.makeText(LocationService.this,"Location Odometer Sum "+odometer_sum, Toast.LENGTH_LONG).show();

                                  float distance2 = getDistance(prelat_val,prelong_val,location.getLatitude(),location.getLongitude());
                                  odometer_sum = odometer_sum + (distance2/1000);
                                  Toast.makeText(LocationService.this,"Lat "+prelat_val+"Long "+prelong_val+"Sum "+odometer_sum, Toast.LENGTH_LONG).show();

                          }

                        saveData(lat,lng,odometer_sum);
            }catch(Exception e){
                  e.printStackTrace();
            }
      }


public float getDistance(double d, double e, double f, double g) {

            float [] dist = new float[2];

            Location.distanceBetween(d,e,f, g, dist);
          return dist[0] ;
      }

这是我们在这里面临的问题列表:

  1. 它提供的位置不准确。我们在 5 公里距离内测试此应用时,存在大约 300-400 米的差异
  2. 当手机长时间处于同一位置时,它总是提供不同的经纬度。如果您检查上面的代码 sn-p,在 requestLocationUpdates() 中,我们设置了 30 秒的时间间隔和 5m 的距离。这里我们的想法是,如果我的移动设备移动 5m 距离并且如果它跨越 30 秒间隔,它将提供新的纬度和经度。但真正发生的是,它每 30 秒提供一次坐标,与设备移动无关。我不确定如何解决此问题。
  3. 当设备移动时,如何获得准确的值。我需要在代码中做更多的事情吗?

我真的花了很多时间尝试各种选择。但我觉得我在这里遗漏了一些东西。请帮助我。提前谢谢..

谢谢,

【问题讨论】:

  • 根据您的标准。它将采用网络三角测量值。直接使用 gps 提供程序并检查纬度和经度。 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,30000,5, this);
  • 如上所述,我还面临另一个问题。当手机长时间处于同一位置时,它总是提供不同的纬度和经度。如何控制这个问题?这可以通过不同的标准设置或其他选项来解决吗?请告诉我..

标签: android locationmanager


【解决方案1】:

您在 requestLocationUpdates() 中的 minTime 值为 30 秒。对于试图计算准确距离的应用程序来说,这太长了。我用过locationManager.requestLocationUpdates(provider, 0, 5, locationListener); 在我的代码中很长时间,我得到了准确的更新。虽然这会很快耗尽电池。因此,您必须尝试不同的值以在准确性和电池寿命之间取得平衡,然后看看哪种值适合您的应用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2020-07-16
    • 2014-01-05
    相关资源
    最近更新 更多