在当前位置之间绘制路线到android中的其他位置?

时间:2014-04-02 11:55:54

标签: android google-maps routes google-direction

我正在使用http://iamvijayakumar.blogspot.in/2013/04/android-draw-route-between-two-geo.html此链接成功地在一个位置到另一个位置之间绘制路线,现在我正在尝试在当前位置之间绘制路线到我所拥有的arrylist的所有位置。但是这里仅从当前添加一个路线arrylist的最后一个元素的位置。但我想从当前位置绘制路线到所有位置。

以下是代码:

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

1 个答案:

答案 0 :(得分:2)

首先,您必须了解每个新位置都必须调用XML请求。每个请求都是它自己的一组点,Android用它们在点A和点B之间绘制多边形线。

我首先使用2-D ArrayList来存储每个XML返回,然后迭代列表以绘制线条。您将不得不查看每组点连接,然后调用该函数在这些点之间绘制线条,然后移动到下一组点。