SpeedLimitData.java
package org.opentrafficsim.road.network.sampling.data;
import java.util.Optional;
import org.djunits.unit.SpeedUnit;
import org.djunits.value.vfloat.scalar.FloatSpeed;
import org.opentrafficsim.kpi.sampling.data.ExtendedDataSpeed;
import org.opentrafficsim.road.gtu.LaneBasedGtu;
import org.opentrafficsim.road.network.sampling.GtuDataRoad;
import org.opentrafficsim.road.network.speed.SpeedLimits;
/**
* Speed limit for trajectories.
* <p>
* Copyright (c) 2013-2026 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
* BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
* </p>
* @author Alexander Verbraeck
* @author Peter Knoppers
* @author Wouter Schakel
*/
public class SpeedLimitData extends ExtendedDataSpeed<GtuDataRoad>
{
/**
* Constructor.
*/
public SpeedLimitData()
{
super("speedLimit", "Speed limit");
}
@Override
public final Optional<FloatSpeed> getValue(final GtuDataRoad gtu)
{
LaneBasedGtu laneGtu = gtu.getGtu();
SpeedLimits speedLimit = laneGtu.getLane().getSpeedLimits(laneGtu.getType());
if (speedLimit.laneSpeedLimit() == null)
{
if (speedLimit.gtuTypeSpeedLimit() == null)
{
return Optional.empty();
}
return Optional.of(new FloatSpeed(speedLimit.gtuTypeSpeedLimit().speed().si, SpeedUnit.SI));
}
if (speedLimit.gtuTypeSpeedLimit() == null)
{
return Optional.of(new FloatSpeed(speedLimit.laneSpeedLimit().speed().si, SpeedUnit.SI));
}
double v = Math.min(speedLimit.laneSpeedLimit().speed().si, speedLimit.gtuTypeSpeedLimit().speed().si);
return Optional.of(new FloatSpeed(v, SpeedUnit.SI));
}
@Override
public final String toString()
{
return "SpeedLimit";
}
}