Android GPS:连续测量位置之间的距离

时间:2013-12-04 09:08:50

标签: android gps

我想在android中创建一个距离跟踪器的应用程序。我有一个Spinner, button和一个TextView。最初的文字视图将是 0.00km
当我点击按钮(GPS跟踪开始)和在文本视图中开始行走,它将连续显示距离。当我再次单击该按钮(GPS跟踪终止)并显示单击按钮之间的完整距离时。

以下是应用程序的截图:

starting app

after click start button

这是我的代码:

public class Gps extends Activity   {

 TextView display;


  double currentLon=0 ;
  double currentLat=0 ;
  double lastLon = 0;
  double lastLat = 0;
  double distance;




public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    display = (TextView) findViewById(R.id.textView1);


  LocationManager lm =(LocationManager) getSystemService(LOCATION_SERVICE);
                lm.requestLocationUpdates(lm.GPS_PROVIDER, 0,0, Loclist);
                Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER);

                if(loc==null){
                    display.setText("No GPS location found");
                    }
                    else{
                        //set Current latitude and longitude
                        currentLon=loc.getLongitude();
                        currentLat=loc.getLatitude();

                        }
                //Set the last latitude and longitude
                lastLat=currentLat;
                lastLon=currentLon ;


}



 LocationListener Loclist = new LocationListener(){




@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

     //start location manager
     LocationManager lm =(LocationManager) getSystemService(LOCATION_SERVICE);

      //Get last location
     Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER);

    //Request new location
      lm.requestLocationUpdates(lm.GPS_PROVIDER, 0,0, Loclist);

      //Get new location
      Location loc2 = lm.getLastKnownLocation(lm.GPS_PROVIDER);

      //get the current lat and long
     currentLat = loc.getLatitude();
     currentLon = loc.getLongitude();


    Location locationA = new Location("point A");
        locationA.setLatitude(lastLat);
        locationA.setLongitude(lastLon);

    Location locationB = new Location("point B");
        locationB.setLatitude(currentLat);
        locationB.setLongitude(currentLon);

        double distanceMeters = locationA.distanceTo(locationB);

        double distanceKm = distanceMeters / 1000f;

        display.setText(String.format("%.2f Km",distanceKm ));

        }



@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}



@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}



@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub



}

 };

}

请帮帮我。感谢。

1 个答案:

答案 0 :(得分:1)

当位置发生变化时,您应该在GPS上注册听众。您基本上必须存储以前的已知位置并将其与新位置进行比较。

获得两点之间距离的最简单方法是使用:

sqrt( (x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2 )
  • X可能是纬度
  • Y可能是经度
  • Z可能是高度

这是一个帮助您的伪代码示例

public class GpsCalculator
{

    private LocationManager locationManager = null;
    private Location previousLocation = null;
    private double totalDistance = 0D;

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 100; // 100 meters
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minutes

    public void run(Context context)
    {
        // Get the location manager
        locationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE);

        // Add new listeners with the given params
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener); // Network location
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener); // Gps location
    }

    public void stop()
    {
        locationManager.removeUpdates(locationListener);
    }

    private LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location newLocation)
        {
            if (previousLocation != null)
            {
                double latitude = newLocation.getLatitude() + previousLocation.getLatitude();
                latitude *= latitude;
                double longitude = newLocation.getLongitude() + previousLocation.getLongitude();
                longitude *= longitude;
                double altitude = newLocation.getAltitude() + previousLocation.getAltitude();
                altitude *= altitude;
                GpsCalculator.this.totalDistance += Math.sqrt(latitude + longitude + altitude);
            }

            // Update stored location
            GpsCalculator.this.previousLocation = newLocation;
        }

        @Override
        public void onProviderDisabled(String provider) {}

        @Override
        public void onProviderEnabled(String provider) {}

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };
}

Activty看起来应该是这样的:

public class MainActivity extends Activity
{
    private Button mainButton = null;
    private boolean isButtonPressed = false;

    private GpsCalculator gpsCalculator = null;

    public void onCreate(Bundle savedInstance)
    {
        super.onCreate(savedInstance);

        // Create a new GpsCalculator instance
        this.gpsCalculator =  new GpsCalculator();

        // Get your layout + buttons

        this.mainButton = (Button) findViewById(R.id.main_button);

        this.mainButton.addOnClickListener(new OnClickListener() {
            @Override
            public void onClick()
            {
                // Enable or diable gps
                if (MainActivity.this.isButtonPressed) gpsCalculator.run(this);
                else gpsCalculator.stop();

                // Change button state
                MainActivity.this.isButtonPressed = !MainActivity.this.isButtonPressed;
            }
        });
    }
}