2010-02-01 113 views
97

我一直很忙,很長時間瞭解如何在HelloMapView中的地圖上的兩個(GPS)點之間繪製線條,但沒有運氣。在谷歌地圖上繪製線條/路徑

任何人都可以請告訴我該怎麼做。

假設我使用擴展MapView的HelloMapView。我是否需要使用疊加層?如果是這樣,我必須重寫覆蓋的onDraw()方法並在此處畫一條線?我實際上嘗試過這些東西,但沒有結果。

預先感謝您!

+4

您可以重寫MapView的onDraw方法(並且不要忘記調用基類onDraw),但它使用覆蓋更清晰。也許你可以向我們展示overlay類的onDraw代碼,以便我們看到會發生什麼? – 2010-02-01 13:27:06

回答

109

謝謝您的幫助。最後我可以在地圖上劃一條線。 這是我如何做它:

/** Called when the activity is first created. */ 
private List<Overlay> mapOverlays; 

private Projection projection; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    linearLayout = (LinearLayout) findViewById(R.id.zoomview); 
    mapView = (MapView) findViewById(R.id.mapview); 
    mapView.setBuiltInZoomControls(true); 

    mapOverlays = mapView.getOverlays();   
    projection = mapView.getProjection(); 
    mapOverlays.add(new MyOverlay());   

} 

@Override 
protected boolean isRouteDisplayed() { 
    return false; 
} 

class MyOverlay extends Overlay{ 

    public MyOverlay(){ 

    } 

    public void draw(Canvas canvas, MapView mapv, boolean shadow){ 
     super.draw(canvas, mapv, shadow); 

     Paint mPaint = new Paint(); 
     mPaint.setDither(true); 
     mPaint.setColor(Color.RED); 
     mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(2); 

     GeoPoint gP1 = new GeoPoint(19240000,-99120000); 
     GeoPoint gP2 = new GeoPoint(37423157, -122085008); 

     Point p1 = new Point(); 
     Point p2 = new Point(); 
     Path path = new Path(); 

     Projection projection=mapv.getProjection(); 
     projection.toPixels(gP1, p1); 
     projection.toPixels(gP2, p2); 

     path.moveTo(p2.x, p2.y); 
     path.lineTo(p1.x,p1.y); 

     canvas.drawPath(path, mPaint); 
    } 
+22

根據文檔,draw()方法被調用兩次 - 第一次使用shadow = true,以允許Overlay繪製標記的陰影,然後再次使用shadow = false。所以如果你的覆蓋層沒有陰影,當shadow == true時,你應該簡單地返回並畫任何東西。 – Ridcully 2011-09-23 07:33:03

+3

如果添加更多點以形成封閉區域,則可以繪製填充Color.RED的多邊形。 – user538565 2011-12-06 03:19:53

+0

我自己遇到了充氣異常。可能是什麼原因? – Satheesh 2012-03-26 06:59:27

3

是的,你需要使用覆蓋。

您需要獲取MapView的疊加層並在其上添加新的疊加層。

您的課程延伸Overlay,它是一個透明畫布,您可以像其他任何畫布一樣在其上繪製畫布。

您可以使用mapView.getProjection()來獲取地圖視圖的投影。

...

更多信息請訪問:http://blogoscoped.com/archive/2008-12-15-n14.html

+0

我正在嘗試你在這裏解釋的代碼。但我在這一行出現錯誤。String pairs [] = getDirectionData(「ahmedab​​ad」,「vadodara」);和應用程序將會強制關閉。 Plz能幫你解決這個問題。 – 2012-08-08 10:15:50

1

你可以從中傳遞到draw()方法的MapView對象的投影: mapv.getProjection()toPixels(GP1,P1)。

20
// This Activity will draw a line between two selected points on Map 

public class MainActivity extends MapActivity { 
MapView myMapView = null; 
MapController myMC = null; 
GeoPoint geoPoint = null; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 


    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    myMapView = (MapView) findViewById(R.id.mapview); 
    geoPoint = null; 
    myMapView.setSatellite(false); 

    String pairs[] = getDirectionData("ahmedabad", "vadodara"); 
    String[] lngLat = pairs[0].split(","); 

    // STARTING POINT 
    GeoPoint startGP = new GeoPoint(
    (int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double 
     .parseDouble(lngLat[0]) * 1E6)); 

    myMC = myMapView.getController(); 
    geoPoint = startGP; 
    myMC.setCenter(geoPoint); 
    myMC.setZoom(15); 
    myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP)); 

    // NAVIGATE THE PATH 

    GeoPoint gp1; 
    GeoPoint gp2 = startGP; 

    for (int i = 1; i < pairs.length; i++) { 
    lngLat = pairs[i].split(","); 
    gp1 = gp2; 
    // watch out! For GeoPoint, first:latitude, second:longitude 

    gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), 
    (int) (Double.parseDouble(lngLat[0]) * 1E6)); 
    myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2)); 
    Log.d("xxx", "pair:" + pairs[i]); 
    } 

    // END POINT 
    myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2)); 

    myMapView.getController().animateTo(startGP); 
    myMapView.setBuiltInZoomControls(true); 
    myMapView.displayZoomControls(true); 

} 

@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 

private String[] getDirectionData(String srcPlace, String destPlace) { 

    String urlString = "http://maps.google.com/maps?f=d&hl=en&saddr=" 
    + srcPlace + "&daddr=" + destPlace 
    + "&ie=UTF8&0&om=0&output=kml"; 

    Log.d("URL", urlString); 
    Document doc = null; 
    HttpURLConnection urlConnection = null; 
    URL url = null; 
    String pathConent = ""; 

    try { 

    url = new URL(urlString.toString()); 
    urlConnection = (HttpURLConnection) url.openConnection(); 
    urlConnection.setRequestMethod("GET"); 
    urlConnection.setDoOutput(true); 
    urlConnection.setDoInput(true); 
    urlConnection.connect(); 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    doc = db.parse(urlConnection.getInputStream()); 

    } catch (Exception e) { 
    } 

    NodeList nl = doc.getElementsByTagName("LineString"); 
    for (int s = 0; s < nl.getLength(); s++) { 
    Node rootNode = nl.item(s); 
    NodeList configItems = rootNode.getChildNodes(); 
    for (int x = 0; x < configItems.getLength(); x++) { 
    Node lineStringNode = configItems.item(x); 
    NodeList path = lineStringNode.getChildNodes(); 
    pathConent = path.item(0).getNodeValue(); 
    } 
    } 
    String[] tempContent = pathConent.split(" "); 
    return tempContent; 
} 

} 


//***************************************************************************** 

DirectionPathOverlay 

public class DirectionPathOverlay extends Overlay { 

    private GeoPoint gp1; 
    private GeoPoint gp2; 

    public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) { 
     this.gp1 = gp1; 
     this.gp2 = gp2; 
    } 

    @Override 
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
      long when) { 
     // TODO Auto-generated method stub 
     Projection projection = mapView.getProjection(); 
     if (shadow == false) { 

      Paint paint = new Paint(); 
      paint.setAntiAlias(true); 
      Point point = new Point(); 
      projection.toPixels(gp1, point); 
      paint.setColor(Color.BLUE); 
      Point point2 = new Point(); 
      projection.toPixels(gp2, point2); 
      paint.setStrokeWidth(2); 
      canvas.drawLine((float) point.x, (float) point.y, (float) point2.x, 
        (float) point2.y, paint); 
     } 
     return super.draw(canvas, mapView, shadow, when); 
    } 

    @Override 
    public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
     // TODO Auto-generated method stub 

     super.draw(canvas, mapView, shadow); 
    } 

} 
+1

我一直在做這樣的事情,因爲在我擴展覆蓋,但使用繪製點之間畫線。不同之處在於我使用GPS跟蹤我的移動,並且每次找到新位置時,都會將其添加到ArrayList,然後從ArrayList中的2個最新位置創建一個新的DirectionPathOverlay。我的問題是,除非我與地圖交互,否則線條不會出現在地圖上,例如,如果我觸摸屏幕並移動以平移地圖,則會出現最後10秒的線條繪製,任何想法爲什麼它不是隻有當我進行互動時,我纔會活動繪畫嗎? – 2010-11-27 18:56:37

+0

@Infiniti:您應該將其作爲新問題發佈,而不是作爲評論。 – Jonas 2010-12-01 15:04:11

+0

@ richa123我正在嘗試你在這裏解釋的相同的代碼。但我在這一行出現錯誤。String pairs [] = getDirectionData(「ahmedab​​ad」,「vadodara」);和應用程序將會強制關閉。 Plz能幫你解決這個問題。 – 2012-08-08 10:13:32

11

這是完整的源代碼來繪製從源經緯度到目標經緯度的方向路徑。我改變了上面的代碼,以適應經度和緯度,而不是源和目的地。 所以任何通過他的gps訪問他的緯度和經度的人都可以從他的GPS設備到目的地座標。

感謝上面的答案,我們可以做出這樣的改變,並獲得路徑的方向。

public class DrawMapActivity extends MapActivity { 
    MapView myMapView = null; 
    MapController myMC = null; 
    GeoPoint geoPoint = null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     myMapView = (MapView) findViewById(R.id.mapview); 

     geoPoint = null; 
     myMapView.setSatellite(false); 
     double fromLat = 12.303534; 
     double fromLong = 76.64611; 
     double toLat = 12.9715987; 
     double toLong = 77.5945627; 

     String sourceLat = Double.toString(fromLat); 
     String sourceLong = Double.toString(fromLong); 
     String destinationLat = Double.toString(toLat); 
     String destinationLong = Double.toString(toLong); 

     String pairs[] = getDirectionData(sourceLat,sourceLong, destinationLat, destinationLong); 
     String[] lngLat = pairs[0].split(","); 

     // STARTING POINT 
     GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6)); 

     myMC = myMapView.getController(); 
     geoPoint = startGP; 
     myMC.setCenter(geoPoint); 
     myMC.setZoom(10); 
     myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP)); 

     // NAVIGATE THE PATH 

     GeoPoint gp1; 
     GeoPoint gp2 = startGP; 

     for (int i = 1; i < pairs.length; i++) { 
     lngLat = pairs[i].split(","); 
     gp1 = gp2; 
     // watch out! For GeoPoint, first:latitude, second:longitude 

     gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),(int) (Double.parseDouble(lngLat[0]) * 1E6)); 
     myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2)); 
     Log.d("xxx", "pair:" + pairs[i]); 
     } 

     // END POINT 
     myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2)); 

     myMapView.getController().animateTo(startGP); 
     myMapView.setBuiltInZoomControls(true); 
     myMapView.displayZoomControls(true); 

    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    private String[] getDirectionData(String sourceLat, String sourceLong, String destinationLat, String destinationLong) { 


     String urlString = "http://maps.google.com/maps?f=d&hl=en&" +"saddr="+sourceLat+","+sourceLong+"&daddr="+destinationLat+","+destinationLong + "&ie=UTF8&0&om=0&output=kml"; 
     Log.d("URL", urlString); 
     Document doc = null; 
     HttpURLConnection urlConnection = null; 
     URL url = null; 
     String pathConent = ""; 

     try { 

     url = new URL(urlString.toString()); 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setRequestMethod("GET"); 
     urlConnection.setDoOutput(true); 
     urlConnection.setDoInput(true); 
     urlConnection.connect(); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     doc = db.parse(urlConnection.getInputStream()); 

     } catch (Exception e) { 
     } 

     NodeList nl = doc.getElementsByTagName("LineString"); 
     for (int s = 0; s < nl.getLength(); s++) { 
     Node rootNode = nl.item(s); 
     NodeList configItems = rootNode.getChildNodes(); 
     for (int x = 0; x < configItems.getLength(); x++) { 
     Node lineStringNode = configItems.item(x); 
     NodeList path = lineStringNode.getChildNodes(); 
     pathConent = path.item(0).getNodeValue(); 
     } 
     } 
     String[] tempContent = pathConent.split(" "); 
     return tempContent; 
    } 

    } 


    //***************************************************************************** 



    class DirectionPathOverlay extends Overlay { 

     private GeoPoint gp1; 
     private GeoPoint gp2; 

     public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) { 
      this.gp1 = gp1; 
      this.gp2 = gp2; 
     } 

     @Override 
     public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
       long when) { 
      // TODO Auto-generated method stub 
      Projection projection = mapView.getProjection(); 
      if (shadow == false) { 

       Paint paint = new Paint(); 
       paint.setAntiAlias(true); 
       Point point = new Point(); 
       projection.toPixels(gp1, point); 
       paint.setColor(Color.BLUE); 
       Point point2 = new Point(); 
       projection.toPixels(gp2, point2); 
       paint.setStrokeWidth(2); 
       canvas.drawLine((float) point.x, (float) point.y, (float) point2.x,(float) point2.y, paint); 
      } 
      return super.draw(canvas, mapView, shadow, when); 
     } 

     @Override 
     public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
      // TODO Auto-generated method stub 

      super.draw(canvas, mapView, shadow); 
     } 

    } 

希望它可以幫助其他堆棧溢出用戶

+0

我正在嘗試你在這裏解釋的相同的代碼。但我在這一行出現錯誤。String pairs [] = getDirectionData(「ahmedab​​ad」,「vadodara」);和應用程序將會強制關閉。 Plz能幫你解決這個問題。 – 2012-08-08 10:15:25

+0

@KAREEMMAHAMMED如果你能正確地看到我的代碼,我正在傳遞源和目的地的經緯度,我不通過城市名稱。 richa123正在通過城市名稱來獲取兩個城市之間的方向。謝謝。 – Mukunda 2012-08-08 11:21:24

+0

我也嘗試了你的代碼。我得到相同的錯誤。 String pairs [] = getDirectionData(sourceLat,sourceLong,destinationLat,destinationLong); 我在這條線上越來越接近力量。你可以給我一個示例代碼 – 2012-08-09 05:35:39

8

這可以通過使用意圖也這樣做:

final Intent intent = new Intent(Intent.ACTION_VIEW, 
    Uri.parse(
      "http://maps.google.com/maps?" + 
      "saddr="+YOUR_START_LONGITUDE+","+YOUR_START_LATITUDE+"&daddr="YOUR_END_LONGITUDE+","+YOUR_END_LATITUDE)); 
     intent.setClassName(
      "com.google.android.apps.maps", 
      "com.google.android.maps.MapsActivity"); 
    startActivity(intent); 
+1

緯度應該在longiturde之前url params – user606669 2012-11-29 11:08:53

0

只是我會發現在mapview一些矩形畫只是我們要改變塗料因爲我們喜歡

EmptyOverlay.java

public class EmptyOverlay extends Overlay { 
private float x1,y1; 
private MapExampleActivity mv = null; 
private Overlay overlay = null; 

public EmptyOverlay(MapExampleActivity mapV){ 
    mv = mapV; 
} 

@Override 
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
     long when) { 
    // TODO Auto-generated method stub 
    return super.draw(canvas, mapView, shadow, when); 
} 

@Override 
public boolean onTouchEvent(MotionEvent e, MapView mapView) { 
    if(mv.isEditMode()){ 
     if(e.getAction() == MotionEvent.ACTION_DOWN){ 
      //when user presses the map add a new overlay to the map 
      //move events will be catched by newly created overlay 
      x1 = y1 = 0; 
      x1 = e.getX(); 
      y1 = e.getY(); 

      overlay = new MapOverlay(mv, x1, y1); 
      mapView.getOverlays().add(overlay); 

     } 
     if(e.getAction() == MotionEvent.ACTION_MOVE){ 
     } 
     //---when user lifts his finger--- 
     if (e.getAction() == MotionEvent.ACTION_UP) {     

     }  
     return true; 
    } 
    return false; 
} 
} 

MapExampleActivity.java

public class MapExampleActivity extends MapActivity { 
private MapView mapView; 
private boolean isEditMode = false; 
private Button toogle; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    toogle = (Button)findViewById(R.id.toogleMap);   
    toogle.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      toogleEditMode(); 

     } 
    }); 

    mapView = (MapView)findViewById(R.id.mapview); 
    mapView.setBuiltInZoomControls(true); //display zoom controls 
    //add one empty overlay acting as a overlay loader. This will catch press events and will add the actual overlays 
    mapView.getOverlays().add(new EmptyOverlay(this)); 
    mapView.postInvalidate(); 
} 
//toogle edit mode for drawing or navigating the map 
private void toogleEditMode(){ 
    isEditMode = !isEditMode; 
} 

@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 
@Override 
protected boolean isLocationDisplayed() { 
    return false; 
} 

public boolean isEditMode(){ 
    return this.isEditMode; 
} 

public MapView getMapView(){ 
    return this.mapView; 
} 
} 

MapOverlay。java的

public class MapOverlay extends Overlay { 

private float x1,y1,x2,y2; 
private GeoPoint p1=null,p2=null; 
private MapExampleActivity mv = null; 
private Paint paint = new Paint(); 
private boolean isUp = false; 

//constructor receiving the initial point 
public MapOverlay(MapExampleActivity mapV,float x,float y){ 
    paint.setStrokeWidth(2.0f); 
    x1 = x; 
    y1 = y; 
    mv = mapV; 
    p1 = mapV.getMapView().getProjection().fromPixels((int)x1,(int)y1); 
} 
//override draw method to add our custom drawings 
@Override 
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
     long when) { 

    if(p1 != null && p2 != null){ 
     //get the 2 geopoints defining the area and transform them to pixels 
     //this way if we move or zoom the map rectangle will follow accordingly 
     Point screenPts1 = new Point(); 
     mapView.getProjection().toPixels(p1, screenPts1); 
     Point screenPts2 = new Point(); 
     mapView.getProjection().toPixels(p2, screenPts2); 

     //draw inner rectangle 
     paint.setColor(0x4435EF56); 
     paint.setStyle(Style.FILL); 
     canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint); 
     //draw outline rectangle 
     paint.setColor(0x88158923); 
     paint.setStyle(Style.STROKE); 
     canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint); 
    } 
    return true; 
} 

@Override 
public boolean onTouchEvent(MotionEvent e, MapView mapView) { 
    if(mv.isEditMode() && !isUp){ 
     if(e.getAction() == MotionEvent.ACTION_DOWN){ 
      x1 = y1 = 0; 
      x1 = e.getX(); 
      y1 = e.getY(); 
      p1 = mapView.getProjection().fromPixels((int)x1,(int)y1); 

     } 
     //here we constantly change geopoint p2 as we move out finger 
     if(e.getAction() == MotionEvent.ACTION_MOVE){ 
      x2 = e.getX(); 
      y2 = e.getY(); 
      p2 = mapView.getProjection().fromPixels((int)x2,(int)y2); 

     } 
     //---when user lifts his finger--- 
     if (e.getAction() == MotionEvent.ACTION_UP) {     
      isUp = true; 
     }  
     return true; 
    } 
    return false; 
} 
} 

看到這個http://n3vrax.wordpress.com/2011/08/13/drawing-overlays-on-android-map-view/

0
Try this one: 
Add itemizedOverlay class: 

public class AndroidGoogleMapsActivity extends MapActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Displaying Zooming controls 
     MapView mapView = (MapView) findViewById(R.id.mapview); 
     mapView.setBuiltInZoomControls(true); 


     MapController mc = mapView.getController(); 
     double lat = Double.parseDouble("48.85827758964043"); 
     double lon = Double.parseDouble("2.294543981552124"); 
     GeoPoint geoPoint = new GeoPoint((int)(lat * 1E6), (int)(lon * 1E6)); 
     mc.animateTo(geoPoint); 
     mc.setZoom(15); 
     mapView.invalidate(); 


     /** 
     * Placing Marker 
     * */ 
     List<Overlay> mapOverlays = mapView.getOverlays(); 
     Drawable drawable = this.getResources().getDrawable(R.drawable.mark_red); 
     AddItemizedOverlay itemizedOverlay = 
      new AddItemizedOverlay(drawable, this); 


     OverlayItem overlayitem = new OverlayItem(geoPoint, "Hello", "Sample Overlay item"); 

     itemizedOverlay.addOverlay(overlayitem); 
     mapOverlays.add(itemizedOverlay); 

    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     return false; 
    } 
} 
2

它與谷歌地圖的Android API V2很容易

就在例如從Developer documentation

(當然,你必須初始化你的複製地圖第一)

GoogleMap map; 
// ... get a map. 
// Add a thin red line from London to New York. 
Polyline line = map.addPolyline(new PolylineOptions() 
    .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0)) 
    .width(5) 
    .color(Color.RED)); 
+0

如何在地圖中添加此代碼以及 – 2017-05-03 06:39:49

1
public class MainActivity extends FragmentActivity { 


    List<Overlay> mapOverlays; 
    GeoPoint point1, point2; 
    LocationManager locManager; 
    Drawable drawable; 
    Document document; 
    GMapV2GetRouteDirection v2GetRouteDirection; 
    LatLng fromPosition; 
    LatLng toPosition; 
    GoogleMap mGoogleMap; 
    MarkerOptions markerOptions; 
    Location location ; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     v2GetRouteDirection = new GMapV2GetRouteDirection(); 
     SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager() 
     .findFragmentById(R.id.map); 
     mGoogleMap = supportMapFragment.getMap(); 

     // Enabling MyLocation in Google Map 
     mGoogleMap.setMyLocationEnabled(true); 
     mGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
     mGoogleMap.getUiSettings().setCompassEnabled(true); 
     mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true); 
     mGoogleMap.getUiSettings().setAllGesturesEnabled(true); 
     mGoogleMap.setTrafficEnabled(true); 
     mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); 
     markerOptions = new MarkerOptions(); 
     fromPosition = new LatLng(11.663837, 78.147297); 
     toPosition = new LatLng(11.723512, 78.466287); 
     GetRouteTask getRoute = new GetRouteTask(); 
     getRoute.execute(); 
    } 
    /** 
    * 
    * @author VIJAYAKUMAR M 
    * This class Get Route on the map 
    * 
    */ 
    private class GetRouteTask extends AsyncTask<String, Void, String> { 

     private ProgressDialog Dialog; 
     String response = ""; 
     @Override 
     protected void onPreExecute() { 
       Dialog = new ProgressDialog(MainActivity.this); 
       Dialog.setMessage("Loading route..."); 
       Dialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... urls) { 
       //Get All Route values 
         document = v2GetRouteDirection.getDocument(fromPosition, toPosition,   GMapV2GetRouteDirection.MODE_DRIVING); 
        response = "Success"; 
       return response; 

     } 

     @Override 
     protected void onPostExecute(String result) { 
       mGoogleMap.clear(); 
       if(response.equalsIgnoreCase("Success")){ 
       ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document); 
       PolylineOptions rectLine = new PolylineOptions().width(10).color(
          Color.RED); 

       for (int i = 0; i < directionPoint.size(); i++) { 
        rectLine.add(directionPoint.get(i)); 
       } 
       // Adding route on the map 
       mGoogleMap.addPolyline(rectLine); 
       markerOptions.position(toPosition); 
       markerOptions.draggable(true); 
       mGoogleMap.addMarker(markerOptions); 

       } 

       Dialog.dismiss(); 
     } 
    } 
    @Override 
    protected void onStop() { 
     super.onStop(); 
     finish(); 
    } 
} 

路線Helper類

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

對於那些誰真的只想畫一個簡單的線條 - 確實是有也是短短的版本。

GoogleMap map; 
// ... get a map. 
// Add a thin red line from London to New York. 
Polyline line = map.addPolyline(new PolylineOptions() 
    .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0)) 
    .width(5) 
    .color(Color.RED)); 

https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/model/Polyline

+1

不要以爲Polyline線需要在那裏,謝謝,雖然完美地工作 – Ben 2015-03-10 11:56:49

-1

這爲我工作。使用這裏提到的方法,我可以在Google Maps V2上繪製多段線。每當用戶位置發生變化時我畫了一條新線,所以折線看起來就像用戶在地圖上所遵循的路徑。

源代碼在。 Github: prasang7/eTaxi-Meter

如果您對它們不感興趣,請忽略此項目中與距離計算和用戶界面相關的其他模塊。

+3

只有鏈接的答案不是SO的方式。有一天鏈接可能已經過時。請編輯您的答案,以包括重要信息! – jogo 2015-12-14 19:32:35

+0

嗨jogo,感謝您的反饋,但很抱歉,我沒有得到。你能否詳細說明這個問題。 :) – prasang7 2015-12-14 19:36:12

+0

最好在Stack Overflow中包含相關的代碼,因爲與Github的鏈接可能有一天會變壞。 – user3071284 2015-12-14 19:57:18