/// <summary>
        /// Distance to the next stop line
        /// </summary>
        /// <param name="simVehicleState"></param>
        /// <returns></returns>
        public double?DistanceToNextStop(SimVehicleState simVehicleState)
        {
            if (this.RoadNetwork == null)
            {
                return(null);
            }
            else
            {
                IAreaSubtypeId iasi = this.GetAreaId(simVehicleState);

                if (iasi == null)
                {
                    return(null);
                }
                else if (iasi is ArbiterPerimeterId)
                {
                    return(null);
                }
                else
                {
                    ArbiterLaneId ali = (ArbiterLaneId)iasi;

                    // get closest
                    ArbiterLanePartition alp = this.RoadNetwork.ArbiterSegments[ali.SegmentId].Lanes[ali].GetClosestPartition(simVehicleState.Position);

                    ArbiterWaypoint waypoint;
                    double          distance;

                    RoadNetworkTools.NextStop(alp.Lane, alp, simVehicleState.Position, out waypoint, out distance);

                    if (waypoint == null)
                    {
                        return(null);
                    }
                    else
                    {
                        return(distance);
                    }
                }
            }
        }
 /// <summary>
 /// Gets area id of a vehicle's integer area id
 /// </summary>
 /// <param name="vehicleState"></param>
 /// <returns></returns>
 public IAreaSubtypeId GetAreaId(SimVehicleState vehicleState)
 {
     return(RoadNetworkTools.GetClosest(this.RoadNetwork, vehicleState.Position));
 }