Find distance between two points on map using Google Map API V2

AndroidGoogle Maps-Api-2

Android Problem Overview


I am using google map api v2 in my android application, I am able to show the map and put markers on it, but now I am stuck with the problem in which I need to find out the distance between two markers or points placed on map, I have already gone through the docs but didn't find anything helpful in this case.

If anyone knows how to solve this then please help me.

Thanks

Android Solutions


Solution 1 - Android

In Google Map API V2 You have LatLng objects so you can't use distanceTo (yet).

You can then use the following code considering oldPosition and newPosition are LatLng objects :

// The computed distance is stored in results[0].
//If results has length 2 or greater, the initial bearing is stored in results[1].
//If results has length 3 or greater, the final bearing is stored in results[2].
float[] results = new float[1];
Location.distanceBetween(oldPosition.latitude, oldPosition.longitude,
                newPosition.latitude, newPosition.longitude, results);

For more informations about the Location class see this link

Solution 2 - Android

You can use the following method that will give you accurate result

public double CalculationByDistance(LatLng StartP, LatLng EndP) {
		int Radius = 6371;// radius of earth in Km
		double lat1 = StartP.latitude;
		double lat2 = EndP.latitude;
		double lon1 = StartP.longitude;
		double lon2 = EndP.longitude;
		double dLat = Math.toRadians(lat2 - lat1);
		double dLon = Math.toRadians(lon2 - lon1);
		double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
				+ Math.cos(Math.toRadians(lat1))
				* Math.cos(Math.toRadians(lat2)) * Math.sin(dLon / 2)
				* Math.sin(dLon / 2);
		double c = 2 * Math.asin(Math.sqrt(a));
		double valueResult = Radius * c;
		double km = valueResult / 1;
		DecimalFormat newFormat = new DecimalFormat("####");
		int kmInDec = Integer.valueOf(newFormat.format(km));
		double meter = valueResult % 1000;
		int meterInDec = Integer.valueOf(newFormat.format(meter));
		Log.i("Radius Value", "" + valueResult + "   KM  " + kmInDec
				+ " Meter   " + meterInDec);

		return Radius * c;
	}

Solution 3 - Android

You should use the android Location

You can do:

location1.distanceTo(location2);

And also:

float[] results = new float[1];
Location.distanceBetween(latLongA.latitude, latLongA.longitude,
                         latLongB.latitude, latLongB.longitude,
                         results);

And you will get the distance in meters between location1 and location2 in meters. And beetween latLongA ant latLongB.

Using location.

Solution 4 - Android

Coming rather late, but seeing that this is one of the top results on Google search for the topic I'll share another way:

Use a one-liner with Googles utility class SphericalUtil

SphericalUtil.computeDistanceBetween(latLngFrom, latLngTo)

You will need the utility classes.

You can simply include them in your project using gradle:

implementation 'com.google.maps.android:android-maps-utils:0.5+'

Solution 5 - Android

All this answers will give you the distance in a straight line. If you need to get the distance by road, you have to parse the JSON that Google sends you back after calling his service. You can use this method:

public String getDistance(final double lat1, final double lon1, final double lat2, final double lon2){
    String parsedDistance;
    String response;
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    
                    URL url = new URL("http://maps.googleapis.com/maps/api/directions/json?origin=" + lat1 + "," + lon1 + "&destination=" + lat2 + "," + lon2 + "&sensor=false&units=metric&mode=driving");
                    final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("POST");
                    InputStream in = new BufferedInputStream(conn.getInputStream());
                    response = org.apache.commons.io.IOUtils.toString(in, "UTF-8");
                    
                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray array = jsonObject.getJSONArray("routes");
                    JSONObject routes = array.getJSONObject(0);
                    JSONArray legs = routes.getJSONArray("legs");
                    JSONObject steps = legs.getJSONObject(0);
                    JSONObject distance = steps.getJSONObject("distance");
                    parsedDistance=distance.getString("text");

                } catch (ProtocolException e) {
                    e.printStackTrace();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    thread.start();
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return parsedDistance;
}

lat1 and lon1 are coordinates of origin, lat2 and lon2 are coordinates of destination.

Solution 6 - Android

@salman khan what Usman Kurd suggested is perfect. Only thing i found which can be corrected is that "For google maps v2 we use LatLng class. So below is the code of Usman Kurd that can be used for Google Maps v2. I checked it works perfect.

public double CalculationByDistance(LatLng StartP, LatLng EndP) {
	    int Radius=6371;//radius of earth in Km         
	    double lat1 = StartP.latitude;
	    double lat2 = EndP.latitude;
	    double lon1 = StartP.longitude;
	    double lon2 = EndP.longitude;
	    double dLat = Math.toRadians(lat2-lat1);
	    double dLon = Math.toRadians(lon2-lon1);
	    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
	    Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
	    Math.sin(dLon/2) * Math.sin(dLon/2);
	    double c = 2 * Math.asin(Math.sqrt(a));
	    double valueResult= Radius*c;
	    double km=valueResult/1;
	    DecimalFormat newFormat = new DecimalFormat("####");
	    int kmInDec =  Integer.valueOf(newFormat.format(km));
	    double meter=valueResult%1000;
	    int  meterInDec= Integer.valueOf(newFormat.format(meter));
	    Log.i("Radius Value",""+valueResult+"   KM  "+kmInDec+" Meter   "+meterInDec);

	    return Radius * c;
	 }

Solution 7 - Android

simple util function to calculate distance between two geopoints:

public static long getDistanceMeters(double lat1, double lng1, double lat2, double lng2) {
	
	double l1 = toRadians(lat1);
	double l2 = toRadians(lat2);
	double g1 = toRadians(lng1);
	double g2 = toRadians(lng2);
	
	double dist = acos(sin(l1) * sin(l2) + cos(l1) * cos(l2) * cos(g1 - g2));
	if(dist < 0) {
		dist = dist + Math.PI;
	}
	
	return Math.round(dist * 6378100);
}


Solution 8 - Android

try this

double distance;
Location locationA = new Location("");
locationA.setLatitude(main_Latitude);
locationA.setLongitude(main_Longitude);
Location locationB = new Location("");
locationB.setLatitude(sub_Latitude);
locationB.setLongitude(sub_Longitude);
distance = locationA.distanceTo(locationB)/1000;
kmeter.setText(String.valueOf(distance));
Toast.makeText(getApplicationContext(), ""+distance, Toast.LENGTH_LONG).show();double distance;

				

Solution 9 - Android

public class GoogleDirection {

    public final static String MODE_DRIVING = "driving";
    public final static String MODE_WALKING = "walking";
    public final static String MODE_BICYCLING = "bicycling";

    public final static String STATUS_OK = "OK";
    public final static String STATUS_NOT_FOUND = "NOT_FOUND";
    public final static String STATUS_ZERO_RESULTS = "ZERO_RESULTS";
    public final static String STATUS_MAX_WAYPOINTS_EXCEEDED = "MAX_WAYPOINTS_EXCEEDED";
    public final static String STATUS_INVALID_REQUEST = "INVALID_REQUEST";
    public final static String STATUS_OVER_QUERY_LIMIT = "OVER_QUERY_LIMIT";
    public final static String STATUS_REQUEST_DENIED = "REQUEST_DENIED";
    public final static String STATUS_UNKNOWN_ERROR = "UNKNOWN_ERROR";

    public final static int SPEED_VERY_FAST = 1;
    public final static int SPEED_FAST = 2;
    public final static int SPEED_NORMAL = 3;
    public final static int SPEED_SLOW = 4;
    public final static int SPEED_VERY_SLOW = 5;
    
	private OnDirectionResponseListener mDirectionListener = null;
	private OnAnimateListener mAnimateListener = null;
	
	private boolean isLogging = false;
	
	private LatLng animateMarkerPosition = null;
	private LatLng beginPosition = null;
	private LatLng endPosition = null;
	private ArrayList<LatLng> animatePositionList = null;
	private Marker animateMarker = null;
	private Polyline animateLine = null;
	private GoogleMap gm = null;
	private int step = -1;
	private int animateSpeed = -1;
	private int zoom = -1;
	private double animateDistance = -1;
	private double animateCamera = -1;
	private double totalAnimateDistance = 0;
	private boolean cameraLock = false;
	private boolean drawMarker = false;
	private boolean drawLine = false;
	private boolean flatMarker = false;
	private boolean isCameraTilt = false;
	private boolean isCameraZoom = false;
	private boolean isAnimated = false;
	
	private Context mContext = null;
 
    public GoogleDirection(Context context) { 
    	mContext = context;
    }
 
    public String request(LatLng start, LatLng end, String mode) {
        final String url = "http://maps.googleapis.com/maps/api/directions/xml?"
                + "origin=" + start.latitude + "," + start.longitude  
                + "&destination=" + end.latitude + "," + end.longitude 
                + "&sensor=false&units=metric&mode=" + mode;

   		if(isLogging)
   			Log.i("GoogleDirection", "URL : " + url);
        new RequestTask().execute(new String[]{ url });
        return url;
    }
    
    private class RequestTask extends AsyncTask<String, Void, Document> {
		protected Document doInBackground(String... url) {
			try {
				HttpClient httpClient = new DefaultHttpClient();
				HttpContext localContext = new BasicHttpContext();
				HttpPost httpPost = new HttpPost(url[0]);
				HttpResponse response = httpClient.execute(httpPost, localContext);
				InputStream in = response.getEntity().getContent();
				DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
				return builder.parse(in);
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			} catch (SAXException e) {
				e.printStackTrace();
			} 
			return null;
		}
		
		protected void onPostExecute(Document doc) {
			super.onPostExecute(doc);
			if(mDirectionListener != null)
				mDirectionListener.onResponse(getStatus(doc), doc, GoogleDirection.this);
		}
	    
	   	private String getStatus(Document doc) {
	   		NodeList nl1 = doc.getElementsByTagName("status");
	   		Node node1 = nl1.item(0);
	   		if(isLogging)
	   			Log.i("GoogleDirection", "Status : " + node1.getTextContent());
	   		return node1.getTextContent();
	    }
    }
    
    public void setLogging(boolean state) {
    	isLogging = state;
    }
    
   	public String getStatus(Document doc) {
   		NodeList nl1 = doc.getElementsByTagName("status");
   		Node node1 = nl1.item(0);
   		if(isLogging)
   			Log.i("GoogleDirection", "Status : " + node1.getTextContent());
   		return node1.getTextContent();
    }
        
   	public String[] getDurationText(Document doc) {
   		NodeList nl1 = doc.getElementsByTagName("duration");
   		String[] arr_str = new String[nl1.getLength() - 1];
   		for(int i = 0 ; i < nl1.getLength() - 1 ; i++) {
	   		Node node1 = nl1.item(i);
	   		NodeList nl2 = node1.getChildNodes();
	   		Node node2 = nl2.item(getNodeIndex(nl2, "text"));
	   		arr_str[i] = node2.getTextContent();
	   		if(isLogging)
	   			Log.i("GoogleDirection", "DurationText : " + node2.getTextContent());
   		}
   		return arr_str;
    }
   	    
   	public int[] getDurationValue(Document doc) {
   		NodeList nl1 = doc.getElementsByTagName("duration");
   		int[] arr_int = new int[nl1.getLength() - 1];
   		for(int i = 0 ; i < nl1.getLength() - 1 ; i++) {
	   		Node node1 = nl1.item(i);
	   		NodeList nl2 = node1.getChildNodes();
	   		Node node2 = nl2.item(getNodeIndex(nl2, "value"));
	   		arr_int[i] = Integer.parseInt(node2.getTextContent());
	   		if(isLogging)
	   			Log.i("GoogleDirection", "Duration : " + node2.getTextContent());
   		}
   		return arr_int;
    }
   	
   	public String getTotalDurationText(Document doc) {
   		NodeList nl1 = doc.getElementsByTagName("duration");
   		Node node1 = nl1.item(nl1.getLength() - 1);
   		NodeList nl2 = node1.getChildNodes();
   		Node node2 = nl2.item(getNodeIndex(nl2, "text"));
   		if(isLogging)
   			Log.i("GoogleDirection", "TotalDuration : " + node2.getTextContent());
   		return node2.getTextContent();
    }
    
   	public int getTotalDurationValue(Document doc) {
   		NodeList nl1 = doc.getElementsByTagName("duration");
   		Node node1 = nl1.item(nl1.getLength() - 1);
   		NodeList nl2 = node1.getChildNodes();
   		Node node2 = nl2.item(getNodeIndex(nl2, "value"));
   		if(isLogging)
   			Log.i("GoogleDirection", "TotalDuration : " + node2.getTextContent());
   		return Integer.parseInt(node2.getTextContent());
    }
  
    public String[] getDistanceText(Document doc) {
   		NodeList nl1 = doc.getElementsByTagName("distance");
   		String[] arr_str = new String[nl1.getLength() - 1];
   		for(int i = 0 ; i < nl1.getLength() - 1 ; i++) {
	   		Node node1 = nl1.item(i);
	   		NodeList nl2 = node1.getChildNodes();
	   		Node node2 = nl2.item(getNodeIndex(nl2, "text"));
	   		arr_str[i] = node2.getTextContent();
	   		if(isLogging)
	   			Log.i("GoogleDirection", "DurationText : " + node2.getTextContent());
   		}
   		return arr_str;
    }
 
    public int[] getDistanceValue(Document doc) {
    	NodeList nl1 = doc.getElementsByTagName("distance");
   		int[] arr_int = new int[nl1.getLength() - 1];
   		for(int i = 0 ; i < nl1.getLength() - 1 ; i++) {
	   		Node node1 = nl1.item(i);
	   		NodeList nl2 = node1.getChildNodes();
	   		Node node2 = nl2.item(getNodeIndex(nl2, "value"));
	   		arr_int[i] = Integer.parseInt(node2.getTextContent());
	   		if(isLogging)
	   			Log.i("GoogleDirection", "Duration : " + node2.getTextContent());
   		}
   		return arr_int;
    }

   	public String getTotalDistanceText(Document doc) {
   		NodeList nl1 = doc.getElementsByTagName("distance");
   		Node node1 = nl1.item(nl1.getLength() - 1);
   		NodeList nl2 = node1.getChildNodes();
   		Node node2 = nl2.item(getNodeIndex(nl2, "text"));
   		if(isLogging)
   			Log.i("GoogleDirection", "TotalDuration : " + node2.getTextContent());
   		return node2.getTextContent();
    }
    
   	public int getTotalDistanceValue(Document doc) {
   		NodeList nl1 = doc.getElementsByTagName("distance");
   		Node node1 = nl1.item(nl1.getLength() - 1);
   		NodeList nl2 = node1.getChildNodes();
   		Node node2 = nl2.item(getNodeIndex(nl2, "value"));
   		if(isLogging)
   			Log.i("GoogleDirection", "TotalDuration : " + node2.getTextContent());
   		return Integer.parseInt(node2.getTextContent());
    }
 
    public String getStartAddress(Document doc) {
        NodeList nl1 = doc.getElementsByTagName("start_address");
        Node node1 = nl1.item(0);
   		if(isLogging)
   			Log.i("GoogleDirection", "StartAddress : " + node1.getTextContent());
        return node1.getTextContent();
    }
 
    public String getEndAddress(Document doc) {
        NodeList nl1 = doc.getElementsByTagName("end_address");
        Node node1 = nl1.item(0);
   		if(isLogging)
   			Log.i("GoogleDirection", "StartAddress : " + node1.getTextContent());
        return node1.getTextContent();
    }
 
    public String getCopyRights(Document doc) {
        NodeList nl1 = doc.getElementsByTagName("copyrights");
        Node node1 = nl1.item(0);
   		if(isLogging)
   			Log.i("GoogleDirection", "CopyRights : " + node1.getTextContent());
        return node1.getTextContent();
    }
 
    public ArrayList<LatLng> getDirection(Document doc) {
        NodeList nl1, nl2, nl3;
        ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>();
        nl1 = doc.getElementsByTagName("step");
        if (nl1.getLength() > 0) {
            for (int i = 0; i < nl1.getLength(); i++) {
                Node node1 = nl1.item(i);
                nl2 = node1.getChildNodes();

                Node locationNode = nl2.item(getNodeIndex(nl2, "start_location"));
                nl3 = locationNode.getChildNodes();
                Node latNode = nl3.item(getNodeIndex(nl3, "lat"));
                double lat = Double.parseDouble(latNode.getTextContent());
                Node lngNode = nl3.item(getNodeIndex(nl3, "lng"));
                double lng = Double.parseDouble(lngNode.getTextContent());
                listGeopoints.add(new LatLng(lat, lng));

                locationNode = nl2.item(getNodeIndex(nl2, "polyline"));
                nl3 = locationNode.getChildNodes();
                latNode = nl3.item(getNodeIndex(nl3, "points"));
                ArrayList<LatLng> arr = decodePoly(latNode.getTextContent());
                for(int j = 0 ; j < arr.size() ; j++) {
                    listGeopoints.add(new LatLng(arr.get(j).latitude
                            , arr.get(j).longitude));
                }

                locationNode = nl2.item(getNodeIndex(nl2, "end_location"));
                nl3 = locationNode.getChildNodes();
                latNode = nl3.item(getNodeIndex(nl3, "lat"));
                lat = Double.parseDouble(latNode.getTextContent());
                lngNode = nl3.item(getNodeIndex(nl3, "lng"));
                lng = Double.parseDouble(lngNode.getTextContent());
                listGeopoints.add(new LatLng(lat, lng));
            }
        }
        
        return listGeopoints;
    }
    
    public ArrayList<LatLng> getSection(Document doc) {
        NodeList nl1, nl2, nl3;
        ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>();
        nl1 = doc.getElementsByTagName("step");
        if (nl1.getLength() > 0) {
            for (int i = 0; i < nl1.getLength(); i++) {
                Node node1 = nl1.item(i);
                nl2 = node1.getChildNodes();

                Node locationNode = nl2.item(getNodeIndex(nl2, "end_location"));
                nl3 = locationNode.getChildNodes();
                Node latNode = nl3.item(getNodeIndex(nl3, "lat"));
                double lat = Double.parseDouble(latNode.getTextContent());
                Node lngNode = nl3.item(getNodeIndex(nl3, "lng"));
                double lng = Double.parseDouble(lngNode.getTextContent());
                listGeopoints.add(new LatLng(lat, lng));
            }
        }
        
        return listGeopoints;
    }
    
    public PolylineOptions getPolyline(Document doc, int width, int color) {
    	ArrayList<LatLng> arr_pos = getDirection(doc);
    	PolylineOptions rectLine = new PolylineOptions().width(dpToPx(width)).color(color);
        for(int i = 0 ; i < arr_pos.size() ; i++)        
            rectLine.add(arr_pos.get(i));
        return rectLine;
    }
 
    private int getNodeIndex(NodeList nl, String nodename) {
        for(int i = 0 ; i < nl.getLength() ; i++) {
            if(nl.item(i).getNodeName().equals(nodename))
                return i;
        }
        return -1;
    }
 
    private ArrayList<LatLng> decodePoly(String encoded) {
        ArrayList<LatLng> poly = new ArrayList<LatLng>();
        int index = 0, len = encoded.length();
        int lat = 0, lng = 0;
        while (index < len) {
            int b, shift = 0, result = 0;
            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);
            int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lat += dlat;
            shift = 0;
            result = 0;
            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);
            int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lng += dlng;
   
            LatLng position = new LatLng((double)lat / 1E5, (double)lng / 1E5);
            poly.add(position);
        }
        return poly;
    }
    
    private int dpToPx(int dp) {
	    DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();
	    int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));       
	    return px;
	}

	public void setOnDirectionResponseListener(OnDirectionResponseListener listener) {
		mDirectionListener = listener;
    }
	
	public void setOnAnimateListener(OnAnimateListener listener) {
		mAnimateListener = listener;
	}
	
	public interface OnDirectionResponseListener {
	    public void onResponse(String status, Document doc, GoogleDirection gd);
	}
	
	public interface OnAnimateListener {
	    public void onFinish();
	    public void onStart();
	    public void onProgress(int progress, int total);
	}
	
	public void animateDirection(GoogleMap gm, ArrayList<LatLng> direction, int speed
			, boolean cameraLock, boolean isCameraTilt, boolean isCameraZoom
			, boolean drawMarker, MarkerOptions mo, boolean flatMarker
			, boolean drawLine, PolylineOptions po) {
		if(direction.size() > 1) {
			isAnimated = true;
			animatePositionList = direction;
			animateSpeed = speed;
			this.drawMarker = drawMarker;
			this.drawLine = drawLine;
			this.flatMarker = flatMarker;
			this.isCameraTilt = isCameraTilt;
			this.isCameraZoom = isCameraZoom;
			step = 0;
			this.cameraLock = cameraLock;
			this.gm = gm;
				
			setCameraUpdateSpeed(speed);
			
			beginPosition = animatePositionList.get(step);
			endPosition = animatePositionList.get(step + 1);
			animateMarkerPosition = beginPosition;
			
			if(mAnimateListener != null)
				mAnimateListener.onProgress(step, animatePositionList.size());
			
	        if(cameraLock) {
				float bearing = getBearing(beginPosition, endPosition);
	        	CameraPosition.Builder cameraBuilder = new CameraPosition.Builder()
					.target(animateMarkerPosition).bearing(bearing);

	        	if(isCameraTilt) 
	        		cameraBuilder.tilt(90);
	        	else 
	        		cameraBuilder.tilt(gm.getCameraPosition().tilt);

	        	if(isCameraZoom) 
	        		cameraBuilder.zoom(zoom);
	        	else 
	        		cameraBuilder.zoom(gm.getCameraPosition().zoom);
	        	
	        	CameraPosition cameraPosition = cameraBuilder.build();
	        	gm.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
	        }
	        
	        if(drawMarker) {
	        	if(mo != null)
	        		animateMarker = gm.addMarker(mo.position(beginPosition));
	        	else 
	        		animateMarker = gm.addMarker(new MarkerOptions().position(beginPosition));
	        	
	        	if(flatMarker) {
		        	animateMarker.setFlat(true);

		        	float rotation = getBearing(animateMarkerPosition, endPosition) + 180;
		        	animateMarker.setRotation(rotation);
		        }
	        }
	        
	        
	        if(drawLine) {
	        	if(po != null) 
	        		animateLine = gm.addPolyline(po.add(beginPosition)
			        		.add(beginPosition).add(endPosition)
			        		.width(dpToPx((int)po.getWidth())));
	        	else 
		        	animateLine = gm.addPolyline(new PolylineOptions()
    						.width(dpToPx(5)));
	        }
	        
			new Handler().postDelayed(r, speed);
			if(mAnimateListener != null)
				mAnimateListener.onStart();
		}
	}
	
	public void cancelAnimated() {
		isAnimated = false;
	}
	
	public boolean isAnimated() {
		return isAnimated;
	}

    private Runnable r = new Runnable() {
    	public void run() {
    		
    		animateMarkerPosition = getNewPosition(animateMarkerPosition, endPosition);

	        if(drawMarker)
	        	animateMarker.setPosition(animateMarkerPosition);

	        
	        if(drawLine) {
	        	List<LatLng> points = animateLine.getPoints();
	        	points.add(animateMarkerPosition);
	        	animateLine.setPoints(points);
	        }
    
    		if((animateMarkerPosition.latitude == endPosition.latitude 
    				&& animateMarkerPosition.longitude == endPosition.longitude)) {
    			if(step == animatePositionList.size() - 2) {
    				isAnimated = false;
    				totalAnimateDistance = 0;
    				if(mAnimateListener != null)
    					mAnimateListener.onFinish();
    			} else {
    				step++;
    				beginPosition = animatePositionList.get(step);
    				endPosition = animatePositionList.get(step + 1);
    				animateMarkerPosition = beginPosition;
    				
    		        if(flatMarker && step + 3 < animatePositionList.size() - 1) {
    		        	float rotation = getBearing(animateMarkerPosition, animatePositionList.get(step + 3)) + 180;
    		        	animateMarker.setRotation(rotation);
    		        }
    				
    				if(mAnimateListener != null)
    					mAnimateListener.onProgress(step, animatePositionList.size());
    			}
    		}
    		
    		if(cameraLock && (totalAnimateDistance > animateCamera || !isAnimated)) {
				totalAnimateDistance = 0;
				float bearing = getBearing(beginPosition, endPosition);
	        	CameraPosition.Builder cameraBuilder = new CameraPosition.Builder()
					.target(animateMarkerPosition).bearing(bearing);

	        	if(isCameraTilt) 
	        		cameraBuilder.tilt(90);
	        	else 
	        		cameraBuilder.tilt(gm.getCameraPosition().tilt);

	        	if(isCameraZoom) 
	        		cameraBuilder.zoom(zoom);
	        	else 
	        		cameraBuilder.zoom(gm.getCameraPosition().zoom);
	        	
	        	CameraPosition cameraPosition = cameraBuilder.build();
	        	gm.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
				
			}
    		
    		if(isAnimated) {
    			new Handler().postDelayed(r, animateSpeed);
    		}
    	}
    };
    
    public Marker getAnimateMarker() {
    	return animateMarker;
    }
    
    public Polyline getAnimatePolyline() {
    	return animateLine;
    }
    
    private LatLng getNewPosition(LatLng begin, LatLng end) {
		double lat = Math.abs(begin.latitude - end.latitude); 
        double lng = Math.abs(begin.longitude - end.longitude);
        
        double dis = Math.sqrt(Math.pow(lat, 2) + Math.pow(lng, 2));
        if(dis >= animateDistance) {
	        double angle = -1;
	        
	        if(begin.latitude <= end.latitude && begin.longitude <= end.longitude)
	    		angle = Math.toDegrees(Math.atan(lng / lat));
			else if(begin.latitude > end.latitude && begin.longitude <= end.longitude)
	    		angle = (90 - Math.toDegrees(Math.atan(lng / lat))) + 90;
			else if(begin.latitude > end.latitude && begin.longitude > end.longitude)
	    		angle = Math.toDegrees(Math.atan(lng / lat)) + 180;
			else if(begin.latitude <= end.latitude && begin.longitude > end.longitude)
	    		angle = (90 - Math.toDegrees(Math.atan(lng / lat))) + 270;
			
	        double x = Math.cos(Math.toRadians(angle)) * animateDistance;
	        double y = Math.sin(Math.toRadians(angle)) * animateDistance;
	        totalAnimateDistance += animateDistance;
	        double finalLat = begin.latitude + x;
	        double finalLng = begin.longitude + y;
	        
	        return new LatLng(finalLat, finalLng);
        } else {
        	return end;
        }
    }
    
    private float getBearing(LatLng begin, LatLng end) {
		double lat = Math.abs(begin.latitude - end.latitude); 
        double lng = Math.abs(begin.longitude - end.longitude);
    	 if(begin.latitude < end.latitude && begin.longitude < end.longitude)
	    	return (float)(Math.toDegrees(Math.atan(lng / lat)));
		else if(begin.latitude >= end.latitude && begin.longitude < end.longitude)
			return (float)((90 - Math.toDegrees(Math.atan(lng / lat))) + 90);
		else if(begin.latitude >= end.latitude && begin.longitude >= end.longitude)
			return  (float)(Math.toDegrees(Math.atan(lng / lat)) + 180);
		else if(begin.latitude < end.latitude && begin.longitude >= end.longitude)
			return (float)((90 - Math.toDegrees(Math.atan(lng / lat))) + 270);
    	 return -1;
    }
    
    public void setCameraUpdateSpeed(int speed) {		
		if(speed == SPEED_VERY_SLOW) {
			animateDistance = 0.000005;
			animateSpeed = 20;
			animateCamera = 0.0004;
			zoom = 19;
		} else if(speed == SPEED_SLOW) {
			animateDistance = 0.00001;
			animateSpeed = 20;
			animateCamera = 0.0008;
			zoom = 18;
		} else if(speed == SPEED_NORMAL) {
			animateDistance = 0.00005;
			animateSpeed = 20;
			animateCamera = 0.002;
			zoom = 16;
		} else if(speed == SPEED_FAST) {
			animateDistance = 0.0001;
			animateSpeed = 20;
			animateCamera = 0.004;
			zoom = 15;
		} else if(speed == SPEED_VERY_FAST) {
			animateDistance = 0.0005;
			animateSpeed = 20;
			animateCamera = 0.004;
			zoom = 13;
		} else {
			animateDistance = 0.00005;
			animateSpeed = 20;
			animateCamera = 0.002;
			zoom = 16;
		}
    }
}

//Main Activity

public class MapActivity extends ActionBarActivity {

    GoogleMap map = null;
    GoogleDirection gd;

    LatLng start,end;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        start = new LatLng(13.744246499553903, 100.53428772836924);
        end = new LatLng(13.751279688694071, 100.54316081106663);


        map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        map.animateCamera(CameraUpdateFactory.newLatLngZoom(start, 15));

        gd = new GoogleDirection(this);
        gd.setOnDirectionResponseListener(new GoogleDirection.OnDirectionResponseListener() {
            public void onResponse(String status, Document doc, GoogleDirection gd) {
                Toast.makeText(getApplicationContext(), status, Toast.LENGTH_SHORT).show();

                gd.animateDirection(map, gd.getDirection(doc), GoogleDirection.SPEED_FAST
                        , true, true, true, false, null, false, true, new PolylineOptions().width(8).color(Color.RED));

                map.addMarker(new MarkerOptions().position(start)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.markera)));

                map.addMarker(new MarkerOptions().position(end)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.markerb)));

				String TotalDistance = gd.getTotalDistanceText(doc);
				String TotalDuration = gd.getTotalDurationText(doc);
            }
        });

        gd.request(start, end, GoogleDirection.MODE_DRIVING);
    }
}

Solution 10 - Android

The distance between two geo-coordinates can be found by using Haversine formula . This formula is effective to calculate distance in a spherical body i.e earth in our case.

Solution 11 - Android

THIS IS THE EASY AND PERFECT CODE FOR DURATION AND DISTANCE FINDING

  • Step 1;(add this and sync in your gradle)

     implementation 'com.android.volley:volley:1.0.0'  
    
  • Step 2:(write this in your trigger method)

     public void clicked(View view) throws JSONException {  
            
          JSONObject locationJsonObject = new JSONObject();
                 locationJsonObject.put("origin", "54.406505,18.67708");
                 locationJsonObject.put("destination", "54.446251,18.570993");
                 LatlngCalc(locationJsonObject);
     }
         
    
  • Step 3:(Copy & Paste in your class)

     private void LatlngCalc(JSONObject locationJsonObject) throws JSONException {
         
         RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
         String url = "https://maps.googleapis.com/maps/api/distancematrix/" +
                     "json?origins=" + locationJsonObject.getString("origin") + "&destinations=" + locationJsonObject.getString("destination") + "&mode=driving&" +
                     "language=en-EN&sensor=false" + "&key=" + /*Insert Your API Key Here */;
         
         StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                 new Response.Listener<String>() {
                     @Override
                     public void onResponse(String response) {
                       
                         mTextView.setText("Response is: " + response.substring(0, 500));
                     }
                 }, new Response.ErrorListener() {
             @Override
             public void onErrorResponse(VolleyError error) {
                 mTextView.setText("That didn't work!");
             }
         });
         queue.add(stringRequest);  
     }
    

Solution 12 - Android

to get distance between two points try this code..

public static float GetDistanceFromCurrentPosition(double lat1,double lng1, double lat2, double lng2)
 {
        double earthRadius = 3958.75;

        double dLat = Math.toRadians(lat2 - lat1);

        double dLng = Math.toRadians(lng2 - lng1);

        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
                + Math.cos(Math.toRadians(lat1))
                * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng / 2)
                * Math.sin(dLng / 2);

        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        double dist = earthRadius * c;

        int meterConversion = 1609;

        return new Float(dist * meterConversion).floatValue();

    }

Solution 13 - Android

you can use this function. I have used it in my project.

public String getDistance(LatLng my_latlong, LatLng frnd_latlong) {
    Location l1 = new Location("One");
    l1.setLatitude(my_latlong.latitude);
    l1.setLongitude(my_latlong.longitude);

    Location l2 = new Location("Two");
    l2.setLatitude(frnd_latlong.latitude);
    l2.setLongitude(frnd_latlong.longitude);

    float distance = l1.distanceTo(l2);
    String dist = distance + " M";

    if (distance > 1000.0f) {
        distance = distance / 1000.0f;
        dist = distance + " KM";
    }
    return dist;
}

Solution 14 - Android

This is an old question with old answers. I want to highlight an updated way of calculating distance between two points. By now we should be familiar with the utility class, "SphericalUtil". You can retrieve the distance using that.

double distance = SphericalUtil.computeDistanceBetween(origin, dest);

Solution 15 - Android

In android google maps application there is a very easy way to find distance between 2 locations, to do so follow the following easy steps:

  1. when you first open the app go to " your timeline " from the drop menue on the top left.

  2. once the new windwo opens, chose from the settings on your top right menue and choose "add place".

  3. add your places and name them lilke point 1 , point 2 , or any easy name to remember.

  4. once your places are added and flagged go back to the main Window in your google app.

  5. click on the blue circle with the arrow in your bottom right.

  6. a new windwo will open and you can see on the top there are two text fields in which you can add your "from location" and "distance location".

  7. click on any text field and type in your saved location in point 3.

  8. click on the other text field and add your next saved location.

  9. By doing so, google maps will calculate the distance between the two locations and show you the blue path on map ..

Good luck

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSalman KhanView Question on Stackoverflow
Solution 1 - AndroidFr4nzView Answer on Stackoverflow
Solution 2 - AndroidUsman KurdView Answer on Stackoverflow
Solution 3 - AndroidhanooView Answer on Stackoverflow
Solution 4 - AndroidBjörn KechelView Answer on Stackoverflow
Solution 5 - AndroidFustigadorView Answer on Stackoverflow
Solution 6 - AndroidAbhijit KuraneView Answer on Stackoverflow
Solution 7 - AndroidYilmaz GuleryuzView Answer on Stackoverflow
Solution 8 - AndroidAnil M HView Answer on Stackoverflow
Solution 9 - AndroidNikunj DesaiView Answer on Stackoverflow
Solution 10 - AndroidLaxmi KadariyaView Answer on Stackoverflow
Solution 11 - AndroidSivaramakrishnan ThevarajView Answer on Stackoverflow
Solution 12 - AndroidManohar Chowdary VankaView Answer on Stackoverflow
Solution 13 - AndroidMilonView Answer on Stackoverflow
Solution 14 - AndroidportfoliobuilderView Answer on Stackoverflow
Solution 15 - AndroidRoumaniView Answer on Stackoverflow