2012-07-31 63 views
2

我想創建一個像谷歌地圖功能時,谷歌地圖繪製路徑。每當有人開始行走/駕駛時,我都想更新自己的位置標記。我正在考慮使用LocationListner的onLocationChange方法,但我不確定。我還想在Google地圖上繪製更新位置的路徑。更新位置標記和步行/驅動的Android

所有的建議是最歡迎的。

ItemizedOverlay: -

public class LocationOverlay extends ItemizedOverlay<OverlayItem>{ 

    private List<OverlayItem> myOverlays; 
    Path path; 
    static int cnt = -1; 
    public LocationOverlay(Drawable defaultMarker) { 
     super(boundCenterBottom(defaultMarker)); 
     System.out.println("Normal..."); 
     myOverlays = new ArrayList<OverlayItem>(); 
    } 


    public void addOverlay(OverlayItem overlay) { 
     System.out.println("Add Overlay called"); 
     myOverlays.add(overlay); 
     populate(); 
      cnt++; 
    } 

    @Override 
    protected OverlayItem createItem(int i) { 
     return myOverlays.get(i); 
    } 

    public void removeItem(int i) { 
     myOverlays.remove(i); 
     populate(); 
    } 

    @Override 
    public int size() { 
     return myOverlays.size(); 
    } 

    @Override 
    public void draw(Canvas canvas, final MapView mapView, boolean shadow) { 


      if (shadow) { 
      paint.setDither(true); 
      paint.setColor(Color.RED); 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setStrokeJoin(Paint.Join.ROUND); 
      paint.setStrokeCap(Paint.Cap.ROUND); 
      paint.setStrokeWidth(4); 

      path = new Path(); 
      Point point1 = new Point(); 
      Projection projection = mapView.getProjection(); 
      if (myOverlays.size() > 1) { 

       System.out.println(">>>>>>>>>>>"); 

       for (int i = 0, j=i; i < myOverlays.size(); i++) { 
       Point point1 = new Point(); 
       Point point2 = new Point(); 
       projection.toPixels(myOverlays.get(i).getPoint(), point1); 

       System.out.println(">>>>>>>>>>>"); 

       projection.toPixels(myOverlays.get(j++).getPoint(), point2); 
       System.out.println("Point == " + j); 

       path.moveTo(point2.x, point2.y); 
       path.lineTo(point1.x, point1.y); 
       canvas.drawPath(path, paint); 
       super.draw(canvas, mapView, shadow); 
      } 
      } 
     } 
     canvas.drawPath(path, paint); 
     super.draw(canvas, mapView, shadow); 
    } 
} 

注 - 繪製方法被稱爲多時間單locationChanged。

編輯: -

我能畫出路線,只要有任何的位置發生改變,事件火,但我有面臨一個小問題。它每次都從根節點繪製路徑。我希望從最後一個地方開始繪製路徑(即從最後一個位置連接到下一個位置)。我附上一張圖片以便更好地理解。

enter image description here

從圖像中可以看到的出發點也被連接到最後一個點。我不想要這個。對此有任何想法。

回答

2

當前位置可以用MyLocationOverlay很容易得出。你需要做的是將這個疊加層添加到你的MapView中。喜歡的東西:

mapView.addOverlay(new MyLocationOverlay(context, mapView)); 

的默認位置點會自動繪製,並會盡快您移動

隨着路線是有點棘手更新,但仍然沒有火箭科學在那裏。你需要做的是擴展Overlay類並實現draw()邏輯。你需要跟蹤你走遍GeoPoints的項目和他們在地圖上(在覆蓋的draw()你可以問你的MapView的一個Projection實例 - getProjection()您可以使用此投影到您的地圖座標映射GeoPoints)。 只要你有地理點列表 - 你可以創建一個Path並在畫布上繪製此路徑

簡化示例如何在地圖上繪製路徑(在我的項目中使用了一些自定義類,但是您應該有一個想法):

Path path; 

@Override 
public void draw(Canvas canvas, final MapView mapView, boolean shadow) 
{ 
    Projection proj = mapView.getProjection(); 
    updatePath(mapView,proj); 
    canvas.drawPath(path, mPaint); 
} 

protected void updatePath(final MapView mapView, Projection proj) 
{ 
    path = new Path(); 

    proj.toPixels(mPoints.get(0).point, p); 
    path.moveTo(p.x, p.y); 

    for(RouteEntity.RoutePoint rp : mPoints) 
    { 
     proj.toPixels(rp.point, mPoint); 
     path.lineTo(mPoint.x, mPoint.y); 
    } 
} 
+0

默認位置點會自動繪製,並會在您移動後立即更新bu如何更新?我知道通過實現LocationListner它已完成,但我想知道它的更新如何?它是否基於LocationManager的requestUpdateLocation?並在更新時調用onLocationChange方法的權利? – Scorpion 2012-08-01 03:35:28

+0

內部 - 是的。它採用GPS或網絡收到最後已知位置信息和位置被更新 - onLocationChanged觸發回調 – 2012-08-01 06:15:28

+0

好吧。感謝您的發佈。我會試試這個... – Scorpion 2012-08-01 09:19:09