From 1ca3ab609cc77706178a9784287272555d577382 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 22 Dec 2020 21:22:06 -0800 Subject: Fix average speed (fix #4616) --- src/main/java/org/traccar/reports/Summary.java | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'src/main/java/org/traccar/reports/Summary.java') diff --git a/src/main/java/org/traccar/reports/Summary.java b/src/main/java/org/traccar/reports/Summary.java index 83fe9caf7..d576ac1e6 100644 --- a/src/main/java/org/traccar/reports/Summary.java +++ b/src/main/java/org/traccar/reports/Summary.java @@ -28,6 +28,7 @@ import java.util.Date; import org.jxls.util.JxlsHelper; import org.traccar.Context; +import org.traccar.helper.UnitsConverter; import org.traccar.model.Position; import org.traccar.reports.model.SummaryReport; @@ -43,13 +44,11 @@ public final class Summary { if (positions != null && !positions.isEmpty()) { Position firstPosition = null; Position previousPosition = null; - double speedSum = 0; for (Position position : positions) { if (firstPosition == null) { firstPosition = position; } previousPosition = position; - speedSum += position.getSpeed(); if (position.getSpeed() > result.getMaxSpeed()) { result.setMaxSpeed(position.getSpeed()); } @@ -57,13 +56,22 @@ public final class Summary { boolean ignoreOdometer = Context.getDeviceManager() .lookupAttributeBoolean(deviceId, "report.ignoreOdometer", false, false, true); result.setDistance(ReportUtils.calculateDistance(firstPosition, previousPosition, !ignoreOdometer)); - result.setAverageSpeed(speedSum / positions.size()); result.setSpentFuel(ReportUtils.calculateFuel(firstPosition, previousPosition)); + long durationMilliseconds; if (firstPosition.getAttributes().containsKey(Position.KEY_HOURS) && previousPosition.getAttributes().containsKey(Position.KEY_HOURS)) { - result.setEngineHours( - previousPosition.getLong(Position.KEY_HOURS) - firstPosition.getLong(Position.KEY_HOURS)); + durationMilliseconds = + previousPosition.getLong(Position.KEY_HOURS) - firstPosition.getLong(Position.KEY_HOURS); + result.setEngineHours(durationMilliseconds); + } else { + durationMilliseconds = + previousPosition.getFixTime().getTime() - firstPosition.getFixTime().getTime(); + } + + if (durationMilliseconds > 0) { + result.setAverageSpeed( + UnitsConverter.knotsFromMps(result.getDistance() * 1000 / durationMilliseconds)); } if (!ignoreOdometer @@ -77,7 +85,7 @@ public final class Summary { } result.setStartTime(firstPosition.getFixTime()); - result.setEndTime(previousPosition.getServerTime()); + result.setEndTime(previousPosition.getFixTime()); } return result; } -- cgit v1.2.3