Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中行走/驾驶时更新位置标记并在谷歌地图上绘制路径_Android_Google Maps_Geolocation_Gps_Directions - Fatal编程技术网

在Android中行走/驾驶时更新位置标记并在谷歌地图上绘制路径

在Android中行走/驾驶时更新位置标记并在谷歌地图上绘制路径,android,google-maps,geolocation,gps,directions,Android,Google Maps,Geolocation,Gps,Directions,我想创建一个类似谷歌地图的功能。每当有人开始步行/驾驶时,我想更新我的位置标记。我正在考虑使用LocationListner的onLocationChange方法,但我不确定。我还喜欢在谷歌地图上用更新的位置绘制路径 欢迎提出所有建议 项目化覆盖:- public class LocationOverlay extends ItemizedOverlay<OverlayItem>{ private List<OverlayItem> myOverlays;

我想创建一个类似谷歌地图的功能。每当有人开始步行/驾驶时,我想更新我的位置标记。我正在考虑使用LocationListner的onLocationChange方法,但我不确定。我还喜欢在谷歌地图上用更新的位置绘制路径

欢迎提出所有建议

项目化覆盖:-

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);
    }
}
public class LocationOverlay扩展了ItemizedOverlay{
私人名单;
路径;
静态int cnt=-1;
公共位置覆盖(可绘制默认标记){
super(boundCenterBottom(defaultMarker));
System.out.println(“正常…”);
myOverlays=新的ArrayList();
}
公共void addOverlay(OverlayItem overlay){
System.out.println(“添加覆盖调用”);
添加(覆盖);
填充();
cnt++;
}
@凌驾
受保护的OverlayItem createItem(int i){
返回myOverlays.get(i);
}
公共无效删除项(int i){
删除(i);
填充();
}
@凌驾
公共整数大小(){
返回myOverlays.size();
}
@凌驾
公共空白绘制(画布、最终地图视图、地图视图、布尔阴影){
如果(阴影){
绘制。设置抖动(真);
油漆。设置颜色(颜色。红色);
绘制.设置样式(绘制.样式.笔划);
绘制.设置行程连接(绘制.连接.圆形);
油漆固定行程盖(油漆固定行程盖圆形);
油漆。设置行程宽度(4);
路径=新路径();
点1=新点();
Projection=mapView.getProjection();
如果(myOverlays.size()>1){
System.out.println(“>>>>>>>”);
for(inti=0,j=i;i>>>>>>”);
toPixels(myOverlays.get(j++).getPoint(),point2);
System.out.println(“点==”+j);
移动到(点2.x,点2.y);
lineTo(point1.x,point1.y);
画布.绘制路径(路径,绘制);
super.draw(画布、地图视图、阴影);
}   
}
}
画布.绘制路径(路径,绘制);
super.draw(画布、地图视图、阴影);
}
}
注意-对单个位置更改多次调用draw方法。

编辑:-

我能够在任何地点发生火灾时绘制路线,但我在那里遇到了一个小问题。它还可以每次从根绘制路径。我希望从最后一个位置开始绘制路径(即从最后一个位置连接到下一个位置)。我附上一个更好的理解图像


从图像中,您可以看到起点也连接到最后一个点。我不要这个。任何关于这个的想法。

当前位置都可以轻松绘制。您需要做的是将此覆盖添加到地图视图中。比如:

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

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

这条路线有点棘手,但仍然没有火箭科学。您需要做的是扩展Overlay类并实现
draw()
逻辑。您需要跟踪所旅行的地理点并将其投影到地图上(在覆盖的
draw()
中,您可以向mapView请求
投影
实例-
getProjection()
。您可以使用此投影将地理点映射到地图坐标)。 一旦有了地质点列表,您就可以创建一个图形并在画布上绘制此路径

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


默认位置点将自动绘制,并在移动后立即更新,但如何更新?我知道通过实现LocationListner它已经完成了,但我想知道它是如何更新的?是否基于LocationManager的requestUpdateLocation?在更新其调用onLocationChange方法时,对吗?内部-是。它使用GPS或网络接收最后一个已知位置,当位置更新时-onLocationChanged回调触发。您能告诉我您使用RouteEntity&RoutePoint的目的吗?我被困在那个点上了。这只是我对GeoPoint的内部包装。我只需要几个字段来存储额外的信息(本例中没有使用)。因此,为了简单起见,您可以假设
RouteEntity.RoutePoint
=
GeoPoint
mPoints
=
ArrayList
我得到了路径,但它没有正确绘制。我已经编辑了我的问题,并在其中添加了draw方法。请看一下。。
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);
    }
}