2
votes

Hi i want to draw a straight line on Google Maps v2. And get all LatLng points from that line (Note : This is not simple drawing a line ....i want to get all step points).

I searched google a lot but that give road routes ....i want straight line only(not by roads). This is code i am using:

Polyline line = mMap.addPolyline(new PolylineOptions()
                    .add(origin, dest)
                    .width(10)
                    .color(Color.RED));
Log.wtf("Activity","Poits="+line.getPoints());

But it gives origin and dest points only!. can anyone suggest me how to get all points ? Thanx in advance !

1
@antonio Thanks !...it helped me abit :) - Animesh Mangla

1 Answers

0
votes

For multiple points you can try this.

private String getDirectionsUrlForAllPoints(String travelMode, ArrayList<LatLng> points) 
    {
        //int source, dest = 0;
        StringBuilder polyLineUrl = new StringBuilder("http://maps.googleapis.com/maps/api/directions/");

        // Output format
        polyLineUrl.append("json?");

        StringBuilder wayPointUrl = new StringBuilder();

        for (int i = 0; i < points.size(); i++) {

            if (i == 0) {
                // Origin of route
                polyLineUrl.append("origin=");
                polyLineUrl.append(points.get(i).latitude);
                polyLineUrl.append(",");
                polyLineUrl.append(points.get(i).longitude);
                continue;
            }

            // For poly line between last points
            if (i == points.size() - 1) {
                //dest = i;

                // Destination of route
                polyLineUrl.append("&destination=");
                polyLineUrl.append(points.get(i).latitude);
                polyLineUrl.append(",");
                polyLineUrl.append(points.get(i).longitude);
                continue;
            }

            wayPointUrl.append("|");
            wayPointUrl.append(points.get(i).latitude);
            wayPointUrl.append(",");
            wayPointUrl.append(points.get(i).longitude);

            /*https://maps.googleapis.com/maps/api/directions/json?origin=Adelaide,SA&destination=Adelaide,SA&waypoints=optimize:true
            |-34.901374,138.737500|-34.918335,138.720412|-34.919335,138.750412|-34.928335,138.790412|-34.938335,138.800412
            * */


        }

        // Sensor enabled
        // Building the parameters to the web service
        polyLineUrl.append("&sensor=false&optimize=true&mode="); //String parameters = str_origin+"&"+str_dest+"&"+sensor + ;

        polyLineUrl.append(travelMode);

        if (wayPointUrl.toString().length() > 0) {
            wayPointUrl.insert(0, "&waypoints=");
        }

        // Building the url to the web service
        String url = polyLineUrl.toString() + wayPointUrl.toString();

        Log.d(TAG, "Url: " + url);

        return url;
    }


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

        List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String, String>>>();
        JsonArray jRoutes = null;
        JsonArray jLegs = null;
        JsonArray jSteps = null;
        JsonObject jDistance = null;
        JsonObject jDuration = null;

        try {


            jRoutes = jObject.getAsJsonArray("routes");

            if (jRoutes != null) {
                /** Traversing all routes */
                for (int i = 0; i < jRoutes.size(); i++) {
                    jLegs = ((JsonObject) jRoutes.get(i)).getAsJsonArray("legs");

                    List<HashMap<String, String>> path = new ArrayList<HashMap<String, String>>();

                    /** Traversing all legs */
                    for (int j = 0; j < jLegs.size(); j++) {

                        /** Getting distance from the json data */
                        jDistance = ((JsonObject) jLegs.get(j)).getAsJsonObject("distance");
                        HashMap<String, String> hmDistance = new HashMap<String, String>();
                        hmDistance.put("distance", jDistance.get("text").getAsString());

                        /** Getting duration from the json data */
                        jDuration = ((JsonObject) jLegs.get(j)).getAsJsonObject("duration");
                        HashMap<String, String> hmDuration = new HashMap<String, String>();
                        hmDuration.put("duration", jDuration.get("text").getAsString());

                        /** Adding distance object to the path */
                        path.add(hmDistance);

                        /** Adding duration object to the path */
                        path.add(hmDuration);

                        jSteps = ((JsonObject) jLegs.get(j)).getAsJsonArray("steps");

                        /** Traversing all steps */
                        for (int k = 0; k < jSteps.size(); k++) {
                            String polyline = "";
                            polyline = ((JsonObject) ((JsonObject) jSteps.get(k)).get("polyline")).get("points").getAsString();
                            //Log.d(TAG, "parse: " + polyline);
                            List<LatLng> list = decodePoly(polyline);

                            /** Traversing all points */
                            for (int l = 0; l < list.size(); l++) {
                                HashMap<String, String> hm = new HashMap<String, String>();

                                if (list.get(l) != null) {
                                    hm.put("lat", Double.toString(((LatLng) list.get(l)).latitude));
                                    hm.put("lng", Double.toString(((LatLng) list.get(l)).longitude));
                                    path.add(hm);
                                }
                            }
                        }
                    }
                    routes.add(path);
                }
            }

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

        return routes;
    }


    /**
     * Method to decode polyline points
     * Courtesy : 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;
    }

You will get url from getDirectionsUrlForAllPoints(). make webservice(get) call and then parse that response using parseForAllPoints() method. then finally add arraylist of latlng to polyline. it will draw polyline with all points. i have done this things in different class but i can't paste full code here. hope you will understand.