2

I am drawing route between one location to another location successfully using http://iamvijayakumar.blogspot.in/2013/04/android-draw-route-between-two-geo.html this link, now I am trying to draw routes between current location to all locations what I have my arrylist.But here add one route only from current location to last element of arrylist. But I want to draw routes from my current location to all locations.

Below is the code :

public class ShowAllRoutesFromCurrentLoc extends FragmentActivity implements LocationListener {

GoogleMap _googlemap;
LocationManager locationManager;
private LatLng myPosition;
private LatLng dabaseLocations;
Document document;
private GMapV2Direction v2GetRouteDirection;
private ArrayList<HashMap<String, String>> arl;
private ArrayList<LatLng> dbList;


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

    _googlemap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(
            R.id.mapRotes)).getMap(); 
    v2GetRouteDirection = new GMapV2Direction();
    locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String provider = locationManager.getBestProvider(criteria, true);
    locationManager.requestLocationUpdates(provider, 0, 0, this);
    arl=(ArrayList<HashMap<String, String>>) 
            getIntent().getSerializableExtra("arrayList");
    dbList = new ArrayList<LatLng>();
    Log.e("SHOW LOGIN", arl.toString());
      if(arl.size()!=0){


          for(int j = 0;j<arl.size();j++){

        String lat =arl.get(j).get("lat").toString();
        String lng =arl.get(j).get("lng").toString();
        if ( !lat.trim().equals("") && !lng.trim().equals("") ) {
        double Hlat = Double.parseDouble(lat.trim());
        double Hlong= Double.parseDouble(lng.trim());

         dabaseLocations =new LatLng(Hlat, Hlong);
         dbList.add(dabaseLocations);
      Log.e("ARRAY1",""+dbList.size());

           }
         }

   }


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater()
            .inflate(R.menu.shoe_all_routes_from_current_loc, menu);
    return true;
}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

    //_googlemap.clear();



            if(location!=null){
                double latitude = location.getLatitude();
                double langitude = location.getLongitude();


                myPosition = new LatLng(latitude, langitude);

            }


                 (new GetRouteAsync()).execute();


}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}
private class GetRouteAsync extends AsyncTask<String, Void, String>{

    private ArrayList<String> alter;
    private ArrayList<LatLng> directionPoint;
    private PolylineOptions rectLine;
    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
           Log.e("ARRAY2",""+dbList.size());
        for(int k=0;k<dbList.size();k++){
        document = v2GetRouteDirection.getDocument(myPosition, 
    dbList.get(k),GMapV2Direction.MODE_DRIVING,dbList.size());
        }
        return null;
    }
    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        _googlemap.clear();

          for(int k=0;k<dbList.size();k++){
             directionPoint =v2GetRouteDirection.getSingleDirection(document);
             rectLine = new 
    PolylineOptions().width(5).color(Color.RED).geodesic(true);

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

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

                }



        _googlemap.addPolyline(rectLine);
         _googlemap.moveCamera(CameraUpdateFactory.newLatLngZoom(myPosition,10)); 
           Log.e("ARRAY3",""+dbList.size());

        Marker HYD = _googlemap.addMarker(new MarkerOptions()

                               .position(dbList.get(k))
                              .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))
                               .flat(true));


        // Show current location with database locations


         Marker m=_googlemap.addMarker(new MarkerOptions()
                          .position(myPosition).title("start")

    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
                        //   HYD.setPosition(new LatLng(5,5));



           }

}

   }

 }

GMapV2GetRouteDirection.java

public class GMapV2GetRouteDirection {
public final static String MODE_DRIVING = "driving";
public final static String MODE_WALKING = "walking";

public GMapV2GetRouteDirection() { }

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

    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(0);
    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(0);
    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 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));
        }
    }

    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;
}
}
Lucifer
  • 29,392
  • 25
  • 90
  • 143
DurgaPrasad Ganti
  • 1,008
  • 4
  • 20
  • 41

1 Answers1

2

To begin you will have to understand that with each new location you must call a XML request. Each request will be its own set of points in which Android uses to draw poly lines between Point A and Point B.

I would start by using a 2-D ArrayList to that stores each of the XML returns and then iterating though the lists to draw the lines. You will have to look at each set of point connections and then call the function to draw the lines between those points and then move to the next set of points.

Hank G
  • 379
  • 3
  • 16