android - 如何使用 android 在谷歌地图中显示替代路线?

标签 android google-maps

我想在谷歌地图中显示替代的多条路线。在我的代码中,我将我的位置设置为源,将静态位置设置为目的地。我已经使用 this 成功绘制了单条路线.

谁能告诉我,如何显示同一目的地的备选路线?

谢谢。

最佳答案

我认为你可以做这样的事情

LatLng origin = sourcePosition;
     LatLng dest = destPosition;

  DownloadTask1 downloadTask = new DownloadTask1();
  String url = downloadTask.getDirectionsUrl1(origin, dest);                   
  downloadTask.execute(url);

DownloadTask1 类

 private class DownloadTask1 extends AsyncTask<String, Void, String> {

        // 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);

            ParserTask1 parserTask = new ParserTask1();

            // Invokes the thread for parsing the JSON data
            parserTask.execute(result);
        }


        private String getDirectionsUrl1(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&alternatives=true&units=metric&mode=driving";
            //&alternatives=true&units=metric&mode=driving
            // 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;

            return url;
        }
    }

downloadUrl() 方法

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){
            e.printStackTrace();
            //Log.d("Exception while downloading url", e.toString());
        }finally{
            iStream.close();
            urlConnection.disconnect();
        }
        return data;
    } 

ParserTask1 类

private class ParserTask1 extends AsyncTask<String, Integer, List<List<List<HashMap<String, String>>>>> {

        // Parsing the data in non-ui thread
        @Override
        protected List<List<List<HashMap<String, String>>>> doInBackground(String... jsonData) {

            JSONObject jObject;
            List<List<List<HashMap<String, String>>>> routes = null;

            try {
                jObject = new JSONObject(jsonData[0]);
                DirectionsJSONParser parser = new DirectionsJSONParser();

                // 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<List<List<HashMap<String, String>>>> result) {
            ArrayList<LatLng> points = null;
            PolylineOptions lineOptions = new PolylineOptions();

            PolylineOptions lineOptions1 = null;
            MarkerOptions markerOptions = new MarkerOptions();
            String distance = "";
            String duration = "";

            Integer size1 = 0;
            Integer size2 = 0;
            Integer size3 = 0;
//            Log.d(SHETTY, "onPostExecute: result set "+result.size());


            List<LatLng> aline1 = new ArrayList<LatLng>();
            List<LatLng> aline2 = new ArrayList<LatLng>();
            List<LatLng> aline3 = new ArrayList<LatLng>();


            if (result != null) {
                int i = 0;
                Log.d(SHETTY, "onPostExecute: result size " + result.size());

                while (i < result.size()) {

                    //  for(int i=0;i<result.size();i++){
                    //result.size()
                    //int g= i-1;
                    points = new ArrayList<LatLng>();
                    // lineOptions = new PolylineOptions();
                    // if(i==1){

                    // }else{
                    List<List<HashMap<String, String>>> path1 = result.get(i);

                    for (int s = 0; s < path1.size(); s++) {
                        Log.d("pathsize1", path1.size() + "");

                        // Fetching i-th route
                        List<HashMap<String, String>> path = path1.get(s);
                        Log.d("pathsize", path.size() + "");
                        // Fetching all the points in i-th route

                        for (int j = 0; j < path.size(); j++) {
                            lineOptions1 = new PolylineOptions();
                            HashMap<String, String> point = path.get(j);
                            //  points = new ArrayList<LatLng>();
                            //                    if(j==0){    // Get distance from the list
                            //                        distance = (String)point.get("distance");
                            //                        continue;
                            //                    }else if(j==1){ // Get duration from the list
                            //                        duration = (String)point.get("duration");
                            //                        continue;
                            //                    }
                            double lat = Double.parseDouble(point.get("lat"));
                            double lng = Double.parseDouble(point.get("lng"));
                            LatLng position = new LatLng(lat, lng);
                            // Log.d("latlng", position.toString());
                            points.add(position);


                        }
                        //                lineOptions.addAll(points);
                        //                lineOptions.width(5);
                        //                lineOptions.color(Color.BLUE);
                        //                map.addPolyline(lineOptions);

                    }
                    // }
                    if (i == 0) {


//                        line1.addAll(points);
//                        mMap.addPolyline(line1);

                        size1 = points.size();

                        aline1.addAll(points);
                    } else if (i == 1) {


//                        line2.addAll(points);
//                        mMap.addPolyline(line2);

                        aline2.addAll(points);
                        size2 = points.size();
                    } else if (i == 2) {


//                        line3.addAll(points);
//                        mMap.addPolyline(line3);

                        aline3.addAll(points);
                        size3 = points.size();
                    }
                    // Adding all the points in the route to LineOptions
                    i++;


                }
                // Drawing polyline in the Google Map for the i-th route
                // map.addPolyline(lineOptions);
            }

            if (size3 != 0)
            {

                if ((size1 > size2 && size1 > size3)) {
                    if (size2 > size3) {
                        PolylineOptions line1 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));
                        PolylineOptions line2 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));
                        PolylineOptions line3 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.lightblue));

                        line1.addAll(aline1);
                        line2.addAll(aline2);
                        line3.addAll(aline3);

                        mMap.addPolyline(line1);
                        mMap.addPolyline(line2);
                        mMap.addPolyline(line3);


                        Log.d(SHETTY, "onPostExecute: 3110 ");
                    } else {

                        PolylineOptions line1 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));
                        PolylineOptions line2 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.lightblue));
                        PolylineOptions line3 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));

                        line1.addAll(aline1);
                        line2.addAll(aline2);
                        line3.addAll(aline3);

                        mMap.addPolyline(line1);
                        mMap.addPolyline(line3);

                        mMap.addPolyline(line2);


                        Log.d(SHETTY, "onPostExecute: 3127 ");
                    }
                } else if ((size2 > size1 && size2 > size3)) {
                    if (size1 > size3) {
                        PolylineOptions line1 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));
                        PolylineOptions line2 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));
                        PolylineOptions line3 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.lightblue));

                        line1.addAll(aline1);
                        line2.addAll(aline2);
                        line3.addAll(aline3);

                        mMap.addPolyline(line1);
                        mMap.addPolyline(line2);

                        mMap.addPolyline(line3);


                        Log.d(SHETTY, "onPostExecute: 3147 ");
                    } else {

                        PolylineOptions line1 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.lightblue));
                        PolylineOptions line2 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));
                        PolylineOptions line3 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));

                        line1.addAll(aline1);
                        line2.addAll(aline2);
                        line3.addAll(aline3);


                        mMap.addPolyline(line2);
                        mMap.addPolyline(line3);

                        mMap.addPolyline(line1);

                        Log.d(SHETTY, "onPostExecute: 3164 ");
                    }
                } else if ((size3 > size1 && size3 > size2)) {
                    if (size1 > size2) {
                        PolylineOptions line1 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));
                        PolylineOptions line2 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.lightblue));
                        PolylineOptions line3 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));

                        line1.addAll(aline1);
                        line2.addAll(aline2);
                        line3.addAll(aline3);


                        mMap.addPolyline(line3);
                        mMap.addPolyline(line1);
                        mMap.addPolyline(line2);

                        Log.d(SHETTY, "onPostExecute: 3182 ");
                    } else {
                        PolylineOptions line1 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.lightblue));
                        PolylineOptions line2 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));
                        PolylineOptions line3 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));

                        line1.addAll(aline1);
                        line2.addAll(aline2);
                        line3.addAll(aline3);

                        mMap.addPolyline(line3);
                        mMap.addPolyline(line2);

                        mMap.addPolyline(line1);

                        Log.d(SHETTY, "onPostExecute: 3196 ");
                    }
                } else {
                    System.out.println("ERROR!");
                }

        }else if(size2!=0)
            {
                if(size1>size2){

                    PolylineOptions line1 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));
                    PolylineOptions line2 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.lightblue));


                    line1.addAll(aline1);
                    line2.addAll(aline2);

                    mMap.addPolyline(line1);
                    mMap.addPolyline(line2);

                }else
                {
                    PolylineOptions line1 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.lightblue));
                    PolylineOptions line2 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.grey));

                    line1.addAll(aline1);
                    line2.addAll(aline2);

                    mMap.addPolyline(line2);
                    mMap.addPolyline(line1);
                }



            }
            else if(size1!=0){
                PolylineOptions line1 = new PolylineOptions().width(8).color(getActivity().getResources().getColor(R.color.lightblue));
                line1.addAll(aline1);
                mMap.addPolyline(line1);
            }

        }




        }

现在为解析 JObject 创建 DirectionsJSONParser 类

public class DirectionsJSONParser {

    /**
     * Receives a JSONObject and returns a list of lists containing latitude and
     * longitude
     */
    public List<List<List<HashMap<String,String>>>> parse(JSONObject jObject){

        List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,String>>>() ;
        List<List<List<HashMap<String,String>>>> routes1 = new ArrayList<List<List<HashMap<String,String>>>>() ;
        JSONArray jRoutes = null;
        JSONArray jLegs = null;
        JSONArray jSteps = null;

        try {

            jRoutes = jObject.getJSONArray("routes");

            /** Traversing all routes */
            for(int i=0;i<jRoutes.length();i++){
                jLegs = ( (JSONObject)jRoutes.get(i)).getJSONArray("legs");
                List path = new ArrayList<HashMap<String, String>>();
                List path1 = new ArrayList<ArrayList<HashMap<String,String>>>();

                // Log.d("legs",jLegs.toString());
                /** Traversing all legs */
                for(int j=0;j<jLegs.length();j++){
                    HashMap<String, String> hm1 = new HashMap<String, String>();
                    jSteps = ( (JSONObject)jLegs.get(j)).getJSONArray("steps");
                    // Log.d("steps",jSteps.toString());
                    /** Traversing all steps */
                    for(int k=0;k<jSteps.length();k++){

                        String polyline = "";
                        polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points");
                        List<LatLng> list = decodePoly(polyline);
                        //  Log.d("polyline",polyline.toString());
                        /** Traversing all points */

                        for(int l=0;l<list.size();l++){
                            HashMap<String, String>    hm = new HashMap<String, String>();
                            hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) );
                            hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) );

                            path.add(hm);
                            //  Log.d("lat", Double.toString(((LatLng)list.get(l)).latitude));
                            //  Log.d("lng", Double.toString(((LatLng)list.get(l)).longitude));
                        }

                    }

                    path1.add(path);

                }
                routes1.add(path1);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }catch (Exception e){
        }

        return routes1;
    }
    /**
     * Method to decode polyline points
     * Courtesy : http://jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java
     * */
    private List<LatLng> decodePoly(String encoded) {

        List<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 p = new LatLng((((double) lat / 1E5)),
                    (((double) lng / 1E5)));
            poly.add(p);
        }

        return poly;
    }

}

最后,您将看到蓝色的主要路线和灰色的备选路线。 希望对您有所帮助。

关于android - 如何使用 android 在谷歌地图中显示替代路线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28274823/

相关文章:

java - 如何更改日期时间选择器对话框中天数的文本大小?

javascript - map 未加载到 HTML 页面

google-maps - 通过单击侧边栏打开 Google Map V3 InfoBox 的方法

android - 从asp.net服务器在android中使用kso​​ap2下载大文件

android - 使用 Google Map Android API V2 在两个位置之间路由

javascript - 在 React 中传递任意回调/参数

android - 是否可以从谷歌地图 API 获取过去旅行地点的经度、纬度和时间戳?

android - 如何在微调器的 ArrayAdapter 中添加 ArrayList<My class>?

java - 取消 Observable 的执行 (RxJava 1)

android - 我正在创建一个类似Uber的应用程序,但它突然崩溃,并出现预期的BEGIN_ARRAY错误,但在第1行第1列路径$ STRING