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

3
我想创建一个类似于谷歌地图的功能。我希望在一个人开始步行/驾驶时更新我的位置标记。我正在考虑使用LocationListner的onLocationChange方法,但我不确定。我还想在Google Maps上绘制路径以更新位置。
欢迎提出所有建议。
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);
    }
}

注意 - draw方法会在单个locationChanged事件中被多次调用。

编辑 :-

我能够在任何位置变化时绘制路径,但我遇到了一个小问题。它每次都从起点开始绘制路径。我希望从上一个地点开始绘制路径(即从上一个位置连接到下一个位置)。为了更好的理解,我附上一张图片。

enter image description here

从图片中可以看出,起点也连接到了终点。我不希望这样。有什么想法吗?

1个回答

2

您可以使用MyLocationOverlay轻松绘制当前位置。您需要做的是将此覆盖层添加到您的MapView中。示例代码如下:

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

默认位置点将自动绘制,并在您移动时更新。

使用路线有点棘手,但仍然没有什么难度。您需要做的是扩展Overlay类并实现draw()逻辑。您需要跟踪您行进的GeoPoints并将它们投影到地图上(在您的overlay的draw()中,您可以要求mapView提供一个Projection实例- getProjection()。您可以使用此投影将GeoPoints映射到您的地图坐标)。 一旦您拥有GeoPoints列表-您可以创建一个Path并在Canvas上绘制此路径。

如何在地图上绘制路径的简化示例(我在项目中使用了一些自定义类,但您应该能够理解):

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

这只是我对GeoPoint的内部包装器。我只需要几个额外的字段来存储其他信息(在此示例中未使用)。因此,为简单起见,您可以假设RouteEntity.RoutePoint = GeoPointmPoints = ArrayList<GeoPoint> - Pavel Dudka
我已经得到了路径,但是它的绘制不正确。我已经编辑了我的问题,并在其中添加了绘制方法。请您好心看一下。 - Scorpion
好的,我有几个意见: 1)最好使用单独的叠加层来绘制路径,但是我不知道为什么你的解决方案不起作用,所以这只是我的偏好 2)在 draw() 中分配内存是极其糟糕的想法 - 将您的Paint分配移开 draw() 3)将描边宽度增加至少10像素,这样您才能真正看到您的路径 :) 4)通过跳过阴影通道来优化 draw()。当 shadow == true 时,只需 return - Pavel Dudka
你是否在调用 close() 方法来关闭你的路径?如果是,这就是为什么最后一个点连接到第一个点的原因。 - Pavel Dudka
不,我没有调用close方法。同时我已经添加了我的整个ItemizedOverlay类。如果您发现任何问题或错误,请告诉我。 - Scorpion
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接