1 package org.opentrafficsim.kpi.sampling.indicator;
2
3 import java.util.HashSet;
4 import java.util.Set;
5
6 import org.djunits.unit.LengthUnit;
7 import org.djunits.value.vdouble.scalar.Duration;
8 import org.djunits.value.vdouble.scalar.Length;
9 import org.djunits.value.vdouble.scalar.Time;
10 import org.opentrafficsim.kpi.interfaces.LinkDataInterface;
11 import org.opentrafficsim.kpi.sampling.Query;
12 import org.opentrafficsim.kpi.sampling.TrajectoryGroup;
13
14
15
16
17
18
19
20
21
22
23
24
25 public class MeanTravelTimePerKm extends AbstractIndicator<Duration>
26 {
27
28
29 private final MeanSpeed meanSpeed;
30
31
32
33
34 public MeanTravelTimePerKm(final MeanSpeed meanSpeed)
35 {
36 this.meanSpeed = meanSpeed;
37 }
38
39
40 @Override
41 public final Duration calculate(final Query query, final Time startTime, final Time endTime)
42 {
43 Length cumulLength = Length.ZERO;
44 Set<LinkDataInterface> links = new HashSet<>();
45 for (TrajectoryGroup trajectoryGroup : query.getTrajectoryGroups(startTime, endTime))
46 {
47 if (!links.contains(trajectoryGroup.getLaneDirection().getLaneData().getLinkData()))
48 {
49 cumulLength = cumulLength.plus(trajectoryGroup.getLength());
50 links.add(trajectoryGroup.getLaneDirection().getLaneData().getLinkData());
51 }
52 }
53 return cumulLength.divideBy(this.meanSpeed.getValue(query, startTime, endTime)).divideBy(cumulLength.getInUnit(LengthUnit.KILOMETER));
54 }
55
56
57 @Override
58 @SuppressWarnings("checkstyle:designforextension")
59 public String toString()
60 {
61 return "MeanTravelTime [meanTravelTime=" + this.meanSpeed + " (per km)]";
62 }
63
64 }