0

enter image description hereIn my application, display of Map and multiple routes between source and destination is done using Google mapv2 API. The only problem is, while displaying multiple routes on the map, one straight comes along with the correct routes. I want to get rid of that straight line between source and destination. I am trying to find a way from past two days. Please guide me.

DisplayMap.java

PolylineOptions rectLine = null;
            if(result.equalsIgnoreCase("exception caught")){
                Toast.makeText(getApplicationContext(), "INVALID VALUES", Toast.LENGTH_LONG).show();
            }
            else{
            if (weakRef.get() != null && ! weakRef.get().isFinishing()){

        //  if(response.equalsIgnoreCase("Success")){
                ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document);
                int duration = v2GetRouteDirection.getDurationValue(document);
                Log.e("TRAFFIC DURATIONTIME",""+duration);
                int trfficClearTime = v2GetRouteDirection.getDistanceValue(document);
                Log.e("TRAFFIC TIME", ""+trfficClearTime);

                Markeropition.position(myposition).icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_RED))
                          .flat(true);
                Markeropition2.position(myposition2).icon(BitmapDescriptorFactory
                             .defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                             .flat(true);
                Markeropition.draggable(true);
                Markeropition2.draggable(true);
                googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myposition,10)); 
               googleMap.addMarker(Markeropition);
                googleMap.addMarker(Markeropition2);



                    rectLine = new PolylineOptions().width(5).color(Color.RED);

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

                        rectLine.add(directionPoint.get(i));

                    }
                googleMap.addPolyline(rectLine);


                  showDirection.setText("");
                       // Convert from Unicode to UTF-8
                    ArrayList<String> dir = v2GetRouteDirection.getDirectionPanel(document);
                    if(dir.size()!=0){
                    for(int i=0;i<dir.size();i++){
                     String goDirections=dir.get(i).replaceAll("\\<.*?>","");
                     showDirection.append(goDirections+"\n");
                     Log.e("SIZE", ""+dir.size());
                       Log.e("PANEL", goDirections);
                    }
                    }
                    else{
                        Toast.makeText(getApplicationContext(), "no value", Toast.LENGTH_LONG).show();
                    }

                    String alter = v2GetRouteDirection.getAlternativeRoutes(document);

                    Log.e("ALTER", alter);

                    }
            }

gmpv2directions.java(for drawing routes)

public class GMapv2Direction {

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


    public GMapv2Direction() { }


    public Document getDocument(LatLng start, LatLng end, String mode) {
        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=driving&alternatives=true";


        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpContext localContext = new BasicHttpContext();
            HttpPost httpPost = new HttpPost(url);
            HttpResponse response = httpClient.execute(httpPost, localContext);
            InputStream in = response.getEntity().getContent();
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(in);
            return doc;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public String getDurationText (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"));
          Log.i("DurationText", node2.getTextContent());
          return node2.getTextContent();
    }


    public int getDurationValue (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"));
        Log.i("DurationValue", node2.getTextContent());
        return Integer.parseInt(node2.getTextContent());
    }


    public String getDistanceText (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("distance");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "text"));
        Log.i("DistanceText", node2.getTextContent());
        return node2.getTextContent();
    }


    public int getDistanceValue (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("distance");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "value"));
        Log.i("DistanceValue", node2.getTextContent());
        return Integer.parseInt(node2.getTextContent());
    }


    public String getStartAddress (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("start_address");
        Node node1 = nl1.item(0);
        Log.i("StartAddress", node1.getTextContent());
        return node1.getTextContent();
    }


    public String getEndAddress (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("end_address");
        Node node1 = nl1.item(0);
        Log.i("StartAddress", node1.getTextContent());
        return node1.getTextContent();
    }
    public ArrayList<String> getDirectionPanel(Document doc){
        Node node1 = null;
        ArrayList<String> arry = new ArrayList<String>();
        NodeList nl1 = doc.getElementsByTagName("html_instructions");

        for(int i = 0;i<nl1.getLength();i++){
        node1 = nl1.item(i);
        arry.add(node1.getTextContent());

        Log.i("DIRECTION PANEL", node1.getTextContent());

        }
        return arry;
    }
   public String getAlternativeRoutes(Document doc){


      NodeList nl1;
      Node  firstNode=null;
      Node first = null;
      NodeList nodeList = doc.getElementsByTagName("route");
      if(nodeList.getLength()>0){
          for(int j=0;j<nodeList.getLength();j++){

              Node node1 = nodeList.item(j);
              nl1 = node1.getChildNodes();
              first = nl1.item(getNodeIndex(nl1, "summary"));
              Log.e("FIRST", first.getTextContent());
          }




      }
      return first.getTextContent();
   }


    public String getCopyRights (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("copyrights");
        Node node1 = nl1.item(0);
        Log.i("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));

                locationNode = nl2.item(getNodeIndex(nl2, "start_location"));
            }
        }


        return listGeopoints;
    }


    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;
    }


}

Thanks in advance!

kumar
  • 148
  • 6
  • 25
  • post one screen shot plz – M D Mar 21 '14 at 11:52
  • i added the screen shot please check once – kumar Mar 21 '14 at 11:59
  • do u understand or not please let me know – kumar Mar 21 '14 at 12:09
  • Remove this `googleMap.addPolyline(rectLine);` why you added this? – M D Mar 21 '14 at 12:22
  • rectLine is having all routes between the source and destination thats why i am using – kumar Mar 21 '14 at 12:28
  • but what about route is not available between the points? then it is directly draw a PATH between your points. becoz no ROUTES available – M D Mar 21 '14 at 12:32
  • Are you get it? what i am talk in about? – M D Mar 21 '14 at 12:34
  • actually routes are getting but along with routes straight line is also added between 2 points,here intresing thing is if 1 route is available between 2 points straight is not appearing,if suppose no route thats is later part – kumar Mar 21 '14 at 12:40
  • What are you talk in about _if 1 route is available between 2 points straight is not appearing_ ? explain this sentence again – M D Mar 21 '14 at 12:42
  • if only 1 route is available between source and destination then straight not comming,if more than one routes available then only straight line occuring along with orginal routes – kumar Mar 21 '14 at 12:47
  • but what i thought before drawing the second Route clear the first Route. – M D Mar 21 '14 at 12:49
  • but i have requirement like display all possible routes except straight line, please let me know any.. any solution to do this – kumar Mar 21 '14 at 12:53

2 Answers2

2

Fallow this How to draw free hand polygon in Google map V2 in Android?

There's deep discussion about same over there ...

Kindly check out the list part that how things happened over there.

Your logic can be to check for source and destination point regularly. After that you just need to create a common method that will draw path on map.

Community
  • 1
  • 1
AndroidHacker
  • 3,596
  • 1
  • 25
  • 45
1

The issue is you are getting all the steps from all the routes into a single ArrayList, so last point of first route is followed by first point of second route.

MaciejGórski
  • 22,187
  • 7
  • 70
  • 94
  • thanks for response @MaciejGórski can u please tell me how to solve this problem – kumar Mar 24 '14 at 04:28
  • @kumar Modify your algotithm to put every route into a separate `ArrayList`. – MaciejGórski Mar 24 '14 at 11:23
  • thanks @MaciejGórski, i am agree with u,but i unable to do this,i am new for android,if possible will u please change my code – kumar Mar 24 '14 at 11:42
  • @kumar This is not how programming works. If you don't understand your own code and are unable to change it yourself, doing that for you makes almost no sense (unless of course someone is hired to do exactly that). – MaciejGórski Mar 24 '14 at 15:22