在 Android 中步行/驾驶时更新位置标记并在 Google 地图上绘制路径
Posted
技术标签:
【中文标题】在 Android 中步行/驾驶时更新位置标记并在 Google 地图上绘制路径【英文标题】:Update Location Marker and draw path on Google Maps when walking/driving in Android 【发布时间】:2012-07-29 13:29:24 【问题描述】:我想创建一个类似于 Google 地图的功能。每当有人开始步行/开车时,我都想更新我的位置标记。我正在考虑使用 LocationListner 的 onLocationChange 方法,但我不确定。我也喜欢在谷歌地图上绘制更新位置的路径。
欢迎所有建议。
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 方法会被多次调用。
编辑:-
每当发生任何位置更改事件触发时,我都可以绘制路线,但我在那里遇到了一个小问题。它也每次都从根目录绘制路径。我希望它从最后一个位置开始绘制路径(即从最后一个位置连接到下一个位置)。我附上一张图片以便更好地理解。
从图中可以看出,起点也与终点相连。我不想要这个。对此有任何想法。
【问题讨论】:
【参考方案1】:使用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);
【讨论】:
默认位置点会自动绘制,一动就更新 bu 怎么更新?我知道通过实现 LocationListner 就完成了,但我想知道它是如何更新的?是基于 LocationManager 的 requestUpdateLocation 吗?并且在更新时调用 onLocationChange 方法对吗? 内部 - 是的。它使用 GPS 或网络接收最后一个已知位置以及位置更新时 - 触发 onLocationChanged 回调 嘿,您能告诉我您使用 RouteEntity 和 RoutePoint 的目的是什么吗?我被困在这一点上。 这只是我对 GeoPoint 的内部包装。我只需要更多的字段来存储附加信息(本示例中未使用)。因此,为简单起见,您可以假设RouteEntity.RoutePoint
= GeoPoint
和 mPoints
= ArrayList<GeoPoint>
我得到了路径,但它没有正确绘制。我已经编辑了我的问题并在其中添加了 draw 方法。请看一下..以上是关于在 Android 中步行/驾驶时更新位置标记并在 Google 地图上绘制路径的主要内容,如果未能解决你的问题,请参考以下文章
Google maps android:如何通过单击按钮将驾驶或步行路线添加到特定地理点?
移动(步行/骑自行车/开车)时很少在 Android 设备上找到位置
如何在 Android 的 MapView 中更新当前位置的蓝点标记