在Android中步行/驾车时,更新位置标记并在Google地图上绘制路径

时间:2012-07-31 17:38:48

标签: android google-maps geolocation gps directions

我想创建一个像谷歌地图这样的功能。我想在每个人开始步行/开车时更新我的​​位置标记。我正在考虑使用LocationListner的onLocationChange方法,但我不确定。我还想在Google地图上绘制更新位置的路径。

欢迎所有建议。

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,多次调用draw方法。

编辑: -

每当有任何位置改变事件发生时,我都可以绘制路线,但我在那里面临一个小问题。它也是每次从根开始的绘制路径。我想从最后一个位置开始绘制路径(即从最后到下一个位置连接)。我附上一张图片以便更好地理解。

enter image description here

从图像中可以看出起点也连接到最后一点。我不想要这个。对此有任何想法。

1 个答案:

答案 0 :(得分:2)

可以使用MyLocationOverlay轻松绘制当前位置。您需要做的是将此叠加层添加到MapView中。类似的东西:

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

默认位置点将自动绘制,并在您移动后立即更新

有了路线,它有点棘手,但仍然没有火箭科学。您需要做的是扩展Overlay类并实现draw()逻辑。您需要跟踪您旅行的GeoPoints并将其投影到地图上(在您的叠加层draw()中,您可以向mapView查询Projection实例 - getProjection()。您可以使用此投影来将GeoPoints映射到地图坐标)。 只要您有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);
    }
}