How to get driving distance between two locations?

后端 未结 2 1002
逝去的感伤
逝去的感伤 2021-01-03 16:27

I am using GoogleMapv2 api in my app. I want to draw a polygon line from source to destination. and show the travel time as well as distance on map activity but I am unable

2条回答
  •  爱一瞬间的悲伤
    2021-01-03 16:57

    You can get Trvelling time and distance with following code.. i have already use this code in one of my project hope this will help you

    CalculateDistanceTime distance_task = new CalculateDistanceTime(getActivity());
    
    distance_task.getDirectionsUrl(startLatLng, endLatLng);
    
    distance_task.setLoadListener(new CalculateDistanceTime.taskCompleteListener() {
               @Override
               public void taskCompleted(String[] time_distance) {
                       approximate_time.setText("" + time_distance[1]);
                       approximate_diatance.setText("" + time_distance[0]);
               }
    
     });
    

    and here is the CalculateDistanceTime class.

        import android.content.Context;
        import android.os.AsyncTask;
        import android.util.Log;
    
        import com.google.android.gms.maps.model.LatLng;
    
        import org.json.JSONObject;
    
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.net.HttpURLConnection;
        import java.net.URL;
        import java.util.HashMap;
        import java.util.Iterator;
        import java.util.List;
        import java.util.Set;
    
        public class CalculateDistanceTime {
    
            private taskCompleteListener mTaskListener;
            private Context mContext;
    
    
            public CalculateDistanceTime(Context context) {
                mContext = context;
            }
    
            public void setLoadListener(taskCompleteListener taskListener) {
                mTaskListener = taskListener;
            }
    
    
            public void getDirectionsUrl(LatLng origin, LatLng dest) {
    
                // Origin of route
                String str_origin = "origin=" + origin.latitude + "," + origin.longitude;
    
                // Destination of route
                String str_dest = "destination=" + dest.latitude + "," + dest.longitude;
    
    
                // Sensor enabled
                String sensor = "sensor=false";
    
                // Building the parameters to the web service
                String parameters = str_origin + "&" + str_dest + "&" + sensor;
    
                // Output format
                String output = "json";
    
                // Building the url to the web service
                String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters;
    
    
                DownloadTask downloadTask = new DownloadTask();
    
                // Start downloading json data from Google Directions API
    
                downloadTask.execute(url);
            }
    
            private String downloadUrl(String strUrl) throws IOException {
                String data = "";
                InputStream iStream = null;
                HttpURLConnection urlConnection = null;
                try {
                    URL url = new URL(strUrl);
    
                    // Creating an http connection to communicate with url
                    urlConnection = (HttpURLConnection) url.openConnection();
    
                    // Connecting to url
                    urlConnection.connect();
    
                    // Reading data from url
                    iStream = urlConnection.getInputStream();
    
                    BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
    
                    StringBuffer sb = new StringBuffer();
    
                    String line = "";
                    while ((line = br.readLine()) != null) {
                        sb.append(line);
                    }
    
                    data = sb.toString();
    
                    br.close();
    
                } catch (Exception e) {
                    Log.d("Exception while downloading url", e.toString());
                } finally {
                    iStream.close();
                    urlConnection.disconnect();
                }
                return data;
            }
    
    
            public interface taskCompleteListener {
                void taskCompleted(String[] time_distance);
            }
    
            private class DownloadTask extends AsyncTask {
    
                // Downloading data in non-ui thread
                @Override
                protected String doInBackground(String... url) {
    
                    // For storing data from web service
                    String data = "";
    
                    try {
                        // Fetching the data from web service
                        data = downloadUrl(url[0]);
                    } catch (Exception e) {
                        Log.d("Background Task", e.toString());
                    }
                    return data;
                }
    
                // Executes in UI thread, after the execution of
                // doInBackground()
                @Override
                protected void onPostExecute(String result) {
                    super.onPostExecute(result);
    
                    ParserTask parserTask = new ParserTask();
    
                    // Invokes the thread for parsing the JSON data
                    parserTask.execute(result);
    
                }
            }
    
            private class ParserTask extends AsyncTask>> {
    
                // Parsing the data in non-ui thread
                @Override
                protected List> doInBackground(String... jsonData) {
    
                    JSONObject jObject;
                    List> routes = null;
    
                    try {
                        jObject = new JSONObject(jsonData[0]);
                        DistanceTimeParser parser = new DistanceTimeParser();
    
                        // Starts parsing data
                        routes = parser.parse(jObject);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return routes;
                }
    
                // Executes in UI thread, after the parsing process
                @Override
                protected void onPostExecute(List> result) {
    
                    String distance = "";
                    String duration_distance = "";
    
    
                    if (result.size() < 1) {
                        Log.e("Error : ", "No Points found");
                        return;
                    }
    
    
                    String[] date_dist = new String[2];
    
                    // Traversing through all the routes
                    for (int i = 0; i < result.size(); i++) {
    
                        // Fetching i-th route
                        HashMap tmpData = result.get(i);
                        Set key = tmpData.keySet();
                        Iterator it = key.iterator();
                        while (it.hasNext()) {
                            String hmKey = (String) it.next();
                            duration_distance = tmpData.get(hmKey);
    
                            System.out.println("Key: " + hmKey + " & Data: " + duration_distance);
    
                            it.remove(); // avoids a ConcurrentModificationException
                        }
    
                        date_dist[i] = duration_distance;
                    }
    
                    mTaskListener.taskCompleted(date_dist);
                }
            }
        }
    

    and DistanceTimeparser

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    public class DistanceTimeParser {
    
        public List> parse(JSONObject jObject) {
    
    
            List> routes = new ArrayList>();
            JSONArray jRoutes = null;
            JSONArray jLegs = null;
    
            JSONObject jDistance = null;
            JSONObject jDuration = null;
    
            try {
    
                jRoutes = jObject.getJSONArray("routes");
    
                jLegs = ((JSONObject) jRoutes.get(0)).getJSONArray("legs");
    
                List> path = new ArrayList>();
    
    
                /** Getting distance from the json data */
                jDistance = ((JSONObject) jLegs.get(0)).getJSONObject("distance");
                HashMap hmDistance = new HashMap();
                hmDistance.put("distance", jDistance.getString("text"));
    
                /** Getting duration from the json data */
                jDuration = ((JSONObject) jLegs.get(0)).getJSONObject("duration");
                HashMap hmDuration = new HashMap();
                hmDuration.put("duration", jDuration.getString("text"));
    
                routes.add(hmDistance);
    
                routes.add(hmDuration);
    
            } catch (JSONException e) {
                e.printStackTrace();
            } catch (Exception e) {
            }
    
            return routes;
        }
    
    }
    

提交回复
热议问题