Я реализовал, кстати, у меня есть созданный внутренний класс, который расширяет класс 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);
Теперь я должен нарисовать путь, когда пользователь нажимает на кнопку, чтобы записать трек и найти общее расстояние и время для этого, у меня есть метод update, который будет вызываться из метода locationChange (), когда gps получит новое местоположение, это местоположение будет быть переданы в действие карты и сохранены в объект ломаной линии класса 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)
мой метод создания, который вычислял расстояние между двумя точками, и при получении новой точки устанавливали точку курсора и курсора. точка будет присвоена предыдущей точке. Таким же образом время для расчета общего времени. а также найти скорость для этого, используя
speed = total distance/total time