package de.fub.agg2graph.gpseval.features; import de.fub.agg2graph.gpseval.data.Waypoint; import de.fub.agg2graph.structs.GPSCalc; /** * The AvgSpeedFeature calculates the average speed for a GPS-track. */ public class AvgVelocityFeature extends Feature { private int mCount = 0; private double mSumSpeed = 0; private Waypoint lasWaypoint = null; @Override public void addWaypoint(Waypoint entry) { mSumSpeed += entry.getSpeed(); double velocity = entry.getSpeed(); if (velocity == 0 && lasWaypoint != null) { if (entry.getTimestamp() != null && lasWaypoint.getTimestamp() != null) { double distance = GPSCalc.getDistVincentyFast(entry.getLat(), entry.getLon(), lasWaypoint.getLat(), lasWaypoint.getLon()); long timeDiff = (entry.getTimestamp().getTime() - lasWaypoint.getTimestamp().getTime()) / 1000; velocity = distance / timeDiff; } } if (velocity > 0 && !Double.isInfinite(velocity) && !Double.isNaN(velocity)) { mSumSpeed += velocity; ++mCount; } lasWaypoint = entry; } @Override public double getResult() { double result = 0; if (mCount > 0) { result = (mSumSpeed / mCount) + Math.random(); } return result != 0 ? result : Math.random(); } @Override public void reset() { mCount = 0; mSumSpeed = 0; lasWaypoint = null; } }