отслеживать расстояние и время на основе моих данных трека - PullRequest
1 голос
/ 01 сентября 2011

Я работаю над отслеживанием GPS в Android, чтобы отслеживать местоположение пользователя и предоставить функцию для записи трека. Теперь я могу нарисовать путь, я хочу рассчитать расстояние и время на треке, например, предположим, что пользователь начинает запись трекинга ипереместиться в другое место, теперь я хочу рассчитать общее расстояние и время в пути от начальной до конечной позиции (с обновлением местоположения пользователя) на карте Google.У меня есть функция, которая рассчитывает расстояние для 2-х позиций, но не подходит для моего маршрута, потому что маршрут в полилинии и это гибкая широта / долгота.это их любые API или любые функции или услуги, предоставляемые Google для этого.Любая помощь или предложение приветствуются.

Ответы [ 3 ]

6 голосов
/ 14 сентября 2011

Я бы создал класс с именем waypoint

class WayPoint
{
   DateTime depart; //some date time container
   DateTime arrive; //some date time container
   Coordinate position; //some gps coordinate
}

Затем создайте список этих классов, который позволяет вставлять элементы в любую позицию, что полезно при изменении маршрута:

List<WayPoint> journey = new ArrayList<WayPoint>();

//just add your waypoints

journey.add(startWayPoint);
journey.add(wayPoint_1);
journey.add(wayPoint_2);
//...
journey.add(wayPoint_n_minus_2);
journey.add(wayPoint_n_minus_1);
journey.add(endWayPoint);

Затем преобразовать в массив и вычислить итоги:

WayPoint[] wayPoints = journey.toArray();

double total_distance = 0.0f; //distance in metres
double total_travel_time = 0.0f; // time in hours

//start at index 1 because there are n-1 segments
if(wayPoints.length>1)
foreach(int i=1; i<wayPoints.length;i++)
{
  total_distance += calcDistanceBetween(
      wayPoints[i-1].position,
      wayPoints[i].position);

  total_time += calcTimeInHoursBetween(
      wayPoints[i-1].depart,
      wayPoints[i].arrive);
}

log.d("Total Distance",String.valueOf(total_distance));
log.d("Total Travel Time",String.valueOf(total_travel_time));
2 голосов
/ 14 сентября 2011

Я реализовал, кстати, у меня есть созданный внутренний класс, который расширяет класс 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
1 голос
/ 13 сентября 2011

Если у вас есть набор данных широты / долготы на временной шкале, вы можете рассчитать общее расстояние на сумму расстояния между каждым набором на этой временной шкале.

Я не знаю, какую формулу выИспользуется для расчета расстояния, но приятно взглянуть здесь .

Это довольно разумная тема, поскольку вы рассчитываете расстояние на поверхности чего-то, что напоминает ... как я могу сказать, что ... персик.

Чтобы проиллюстрировать идею:

  • 01: 00 вечера = 50 21 50N, 004 09 25 Вт
  • 05: 00 вечера = 45 21 50N, 008 09 25 Вт
  • 10: 00 вечера = 42 2104N, 009 02 27W

Общее время: 9 часов

Общее расстояние: (a-> b + b-> c) = 630 км + 342,4 км = 972,4 км

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...