我已经实现了,我创建了内部类,它扩展了 Overlay 类以在地图上绘制路径/路线
private class TrackOverlay extends Overlay {
private List<GeoPoint> polyline;
private Paint mPaint;
private Point p1;
public TrackOverlay() {
polyline = new ArrayList<GeoPoint>();
mPaint = new Paint();
mPaint.setDither(true);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(5);
mPaint.setARGB(150, 62, 184, 240);
p1 = new Point();
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, shadow);
if (drawTrack && polyline.size() > 0) {
mPaint.setARGB(120, 212, 51, 51);
drawTrackPath(canvas);
}
if (showTrack && polyline.size() > 0) {
mPaint.setARGB(150, 62, 184, 240);
drawTrackPath(canvas);
}
}
private void drawTrackPath(Canvas canvas) {
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
for (GeoPoint gp : polyline) {
mapView.getProjection().toPixels(gp, p1);
x2 = p1.x;
y2 = p1.y;
if (x1 != 0 && y1 != 0) {
canvas.drawLine(x1, y1, x2, y2, mPaint);
}
x1 = x2;
y1 = y2;
}
}
void addTrackPoint(GeoPoint geoPoint) {
polyline.add(geoPoint);
}
List<GeoPoint> getPolylineTrack() {
return polyline;
}
}
创建这个类的新对象并像这样添加到地图覆盖中
trackOverlay = new TrackOverlay();
mapView.getOverlays().add(trackOverlay);
现在我已经绘制了路径,当用户单击按钮以记录轨迹并找到总距离和时间时,我创建了更新方法,当 gps 获取新位置时,该方法将从 locationChange() 方法调用该位置传递给地图活动并存储到 TrackOverlay 类的折线对象中。
public static void updateMap() {
if (ServiceLocation.curLocation != null) {
curTime = ServiceLocation.curLocation.getTime();
curLat = ServiceLocation.curLocation.getLatitude();
curLng = ServiceLocation.curLocation.getLongitude();
if (mapView != null) {
point = new GeoPoint((int) (curLat * 1e6), (int) (curLng * 1e6));
mc.animateTo(point);
if (drawTrack && trackOverlay != null) {
trackOverlay.addTrackPoint(point);
if(prevTime>0)
totalSec += (curTime-prevTime);
double x1 = 0, x2 = 0, y1 = 0, y2 = 0, temp_dist=0,temp_speed=0;
if(trackOverlay.polyline.size()>1){
x1 = trackOverlay.polyline.get(trackOverlay.polyline.size()-2).getLatitudeE6()/1e6;
y1 = trackOverlay.polyline.get(trackOverlay.polyline.size()-2).getLongitudeE6()/1e6;
x2 = trackOverlay.polyline.get(trackOverlay.polyline.size()-1).getLatitudeE6()/1e6;
y2 = trackOverlay.polyline.get(trackOverlay.polyline.size()-1).getLongitudeE6()/1e6;
dist += (Geo_Class.distFrom(x1, y1, x2, y2) / METER_KILOMETER);
double totalMeter = dist * METER_KILOMETER;
double total_sec = (totalSec/1000) * KILOMETER_HOUR;
speed = totalMeter/total_sec;
txt_msg.setText("Distance " + round(dist,5,BigDecimal.ROUND_HALF_UP) + " km");
speed_msg.setText("Speed " + round(speed,3,BigDecimal.ROUND_HALF_UP) + " kmph \n time " +(totalSec/1000) + " sec");
}
}else{
totalSec = 0;
}
mapView.invalidate();
prevTime = curTime;
}
}
}
好的,每次调用此方法并使用新点更新地图时,我使用了Geo_Class.distFrom(x1, y1, x2, y2) my create 方法,该方法计算两点之间的距离以及将新点设置为当前点和当前点时点将分配给上一个点。时间计算总时间的方法相同。并找到使用这个的速度
speed = total distance/total time