Note that there are some explanatory texts on larger screens.

plurals
  1. POCalculating distance between two points
    primarykey
    data
    text
    <p>I know this has been asked loads before, however I'm getting mixed views on whats correct and whats not,</p> <p>I am trying to calculate the distance between two points in my app using two buttons, Start and stop.</p> <p>I figured this would be simple, get the lat and long of the position when start is pressed, then get them again when stop is pressed, calculate the two and voila. However it isn't going to plan. </p> <p>I have set up a dialog on the stop button when its clicked for feedback and currently I'm only returning (presumably) a single latitude or longitude.</p> <p>My codes below::</p> <pre><code> public class MapRun extends FragmentActivity implements LocationListener, LocationSource { private OnLocationChangedListener mListener; private LocationManager locationManager; private GoogleMap mMap; double lat, lng; static double startLat; double startLong; double stopLat; double stopLong; public static Location l; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.maprun); locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); // Creating a criteria object to retrieve provider Criteria criteria = new Criteria(); // Getting the name of the best provider String provider = locationManager.getBestProvider(criteria, true); // Getting Current Location Location location = locationManager.getLastKnownLocation(provider); l = location; lat = l.getLatitude(); lng = l.getLongitude(); onLocationChanged(location); locationManager.requestLocationUpdates(provider, 20000, 0, this); setUpMapIfNeeded(); } @Override public void onPause() { if (locationManager != null) { locationManager.removeUpdates(this); } super.onPause(); } @Override public void onResume() { super.onResume(); setUpMapIfNeeded(); if (locationManager != null) { mMap.setMyLocationEnabled(true); } } /** * Sets up the map if it is possible to do so (i.e., the Google Play * services APK is correctly installed) and the map has not already been * instantiated.. This will ensure that we only ever call * {@link #setUpMap()} once when {@link #mMap} is not null. * &lt;p&gt; * If it isn't installed {@link SupportMapFragment} (and * {@link com.google.android.gms.maps.MapView MapView}) will show a prompt * for the user to install/update the Google Play services APK on their * device. * &lt;p&gt; * A user can return to this Activity after following the prompt and * correctly installing/updating/enabling the Google Play services. Since * the Activity may not have been completely destroyed during this process * (it is likely that it would only be stopped or paused), * {@link #onCreate(Bundle)} may not be called again so we should call this * method in {@link #onResume()} to guarantee that it will be called. */ private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the // map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map)).getMap(); // Check if we were successful in obtaining the map. if (mMap != null) { setUpMap(); } // This is how you register the LocationSource mMap.setLocationSource(this); } } /** * This is where we can add markers or lines, add listeners or move the * camera. In this case, we just add a marker near Africa. * &lt;p&gt; * This should only be called once and when we are sure that {@link #mMap} * is not null. */ private void setUpMap() { mMap.setMyLocationEnabled(true); } @Override public void activate(OnLocationChangedListener listener) { mListener = listener; } @Override public void deactivate() { mListener = null; } @Override public void onLocationChanged(Location location) { if (mListener != null) { mListener.onLocationChanged(location); // Move the camera to the user's location once it's available! mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng( location.getLatitude(), location.getLongitude()), 16.0f)); } } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub Toast.makeText(this, "provider disabled", Toast.LENGTH_SHORT).show(); } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub Toast.makeText(this, "provider enabled", Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub Toast.makeText(this, "status changed", Toast.LENGTH_SHORT).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.map_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.startRun: startRun(); case R.id.stopRun: stopRun(); return true; default: return super.onOptionsItemSelected(item); } } public void startRun() { ; } public void stopRun() { Location startPoint = new Location("Ran From"); startPoint.setLatitude(lat); startPoint.setLongitude(lng); Location stopPoint = new Location("Ran To"); stopPoint.setLatitude(stopLat); stopPoint.setLongitude(stopLong); float distance = startPoint.distanceTo(stopPoint); String distStr = String.valueOf(distance); Dialog d = new Dialog(this); d.setTitle("distance"); TextView tv = new TextView(this); tv.setText(distStr); d.setContentView(tv); d.show(); } </code></pre> <p>Here are my updated buttons so far, I've got the principle I think I'm just struggling with the correct way to store and pass the variables:</p> <pre><code>@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.startRun: currentLocation = lat + lng; startLocation = currentLocation; case R.id.stopRun: currentLocation = lat + lng; stopLocatio </code></pre> <p>n = currentLocation;</p> <pre><code> float distance = startLocation.distanceTo(stopLocation); String distStr = String.valueOf(distance); Dialog d = new Dialog(this); d.setTitle("distance"); TextView tv = new TextView(this); tv.setText(distStr); d.setContentView(tv); d.show(); return true; default: return super.onOptionsItemSelected(item); } </code></pre> <p>And my OnLocationchanged:</p> <pre><code>@Override public void onLocationChanged(Location location) { l = location; lat = l.getLatitude(); lng = l.getLongitude(); if (mListener != null) { mListener.onLocationChanged(location); // Move the camera to the user's location once it's available! mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng( location.getLatitude(), location.getLongitude()), 16.0f)); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload