2013-04-25 162 views
-1

我試圖讓駕駛在兩個位置之間的方向 -Android的谷歌地圖V2方向

經緯度(15.244,45.85555)和 經緯度(78.459,97.4666)。

,我已經嘗試的代碼 -

Polyline line = mMap.addPolyline(new PolylineOptions(). 
    add(new LatLng(15.244,45.85555), 
    new LatLng(78.459,97.4666)) 
    .width(5).color(Color.RED)); 

但由此得出兩點之間的直線。

是否有任何其他方法/方法來獲得這兩點之間的駕駛方向。

回答

1

嘗試像這樣:

創建GMapV2Direction

public class GMapV2Direction { 
public final static String MODE_DRIVING = "driving"; 
public final static String MODE_WALKING = "walking"; 
public final static String MODE_BICYCLING = "bicycling"; 

ArrayList<String> str=new ArrayList<String>(); 


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="+mode; 


    System.out.print(url); 

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

}

Activity

public final String MODE_DRIVING = "driving"; 
public final String MODE_WALKING = "walking"; 
public final String MODE_BICYCLING = "bicycling"; 
這個定義現在

,實現AsyncTask這樣的:

class AsyncTask1 extends AsyncTask<String, String, Void> { 
    String mode_in = ""; 
    int duration ; 
    String distance; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     mProgressDialog = new ProgressDialog(Main2.this); 
     mProgressDialog.setMessage("Please wait.."); 
     mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(String... aurl) { 

     try { 
      try { 

       mode_in = aurl[0]; 

       Document doc = md.getDocument(fromPosition, toPosition,aurl[0]); 

       duration = md.getDurationValue(doc); 
       distance = md.getDistanceText(doc); 
       String start_address = md.getStartAddress(doc); 
       String copy_right = md.getCopyRights(doc); 


        System.out.print(duration + distance + start_address 
          + copy_right); 

        directionPoint = md.getDirection(doc); 

        rectLine = new PolylineOptions().width(2); 


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

     } catch (Exception e) { 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     mProgressDialog.dismiss(); 

     if (directionPoint.size() > 0) { 
      try { 
       for (int i = 0; i < directionPoint.size(); i++) { 
        rectLine.add(directionPoint.get(i)); 
       } 

       if (rbDriving.isChecked()) { 
        mode = MODE_DRIVING; 
        rectLine.color(Color.RED); 
       } else if (rbBiCycling.isChecked()) { 
        mode = MODE_BICYCLING; 
        rectLine.color(Color.GREEN); 
       } else if (rbWalking.isChecked()) { 
        mode = MODE_WALKING; 
        rectLine.color(Color.BLUE); 
       } 

       tv_distance_time.setText("Duration: "+duration 
         +" ,Distance: "+distance); 

       mMap.addPolyline(rectLine); 

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

     } else { 
      AlertDialog.Builder builder = new AlertDialog.Builder(
        getParent()); 
      builder.setTitle("No route found"); 
      builder.setMessage("No route found"); 
      builder.setPositiveButton("OK", 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, 
           int which) { 
          dialog.dismiss(); 
         } 
        }); 

      builder.create().show(); 
     } 

    } 
} 

AsyncTask

new AsyncTask1().execute(mode); 

希望這是你的作品。