/// <summary>
        /// Make a vehicle state from a sim vehicle state
        /// </summary>
        /// <param name="simState"></param>
        /// <returns></returns>
        public VehicleState VehicleStateFromSim(SimVehicleState simState)
        {
            // vehicle state
            VehicleState vs = new VehicleState();

            // area
            vs.Area = new List<AreaEstimate>();

            // ae
            AreaEstimate ae = new AreaEstimate();
            ae.Probability = 1;

            // get string id
            string id = "";

            // set id
            ae.AreaId = id;
            ae.AreaType = StateAreaType.Interconnect;

            // get area
            IAreaSubtypeId iasi = this.GetAreaId(simState);

            if (iasi is ArbiterPerimeterId)
            {
                id = ((ArbiterPerimeterId)iasi).ToString();
                ae.AreaType = StateAreaType.Zone;
            }
            else if (iasi is ArbiterLaneId)
            {
                ae.AreaId = ((ArbiterLaneId)iasi).ToString() + ".1";
                ae.AreaType = StateAreaType.Lane;
            }

            // add ae
            vs.Area.Add(ae);

            // set others
            vs.Heading = simState.Heading;
            vs.Position = simState.Position;

            // return
            return vs;
        }
        private AreaEstimate[] GetAreaEstimates(SimVehicleState svs)
        {
            List<AreaEstimate> estimates = new List<AreaEstimate>();

            foreach (IVehicleArea iva in this.RoadNetwork.VehicleAreas)
            {
                if (iva.ContainsVehicle(svs.Position, svs.Length, svs.Width, svs.Heading))
                {
                    AreaEstimate ae = new AreaEstimate();
                    ae.AreaId = iva.DefaultAreaId();
                    if(iva is ArbiterInterconnect)
                        ae.AreaType = StateAreaType.Interconnect;
                    else if(iva is ArbiterLane)
                        ae.AreaType = StateAreaType.Lane;
                    else
                        ae.AreaType = StateAreaType.Zone;
                    ae.Probability = 1;
                    estimates.Add(ae);
                }
            }

            return estimates.ToArray();
        }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="id"></param>
 /// <param name="length"></param>
 /// <param name="width"></param>
 /// <param name="absolutePosition"></param>
 /// <param name="heading"></param>
 /// <param name="speed"></param>
 /// <param name="observationState"></param>
 /// <param name="observationStatus"></param>
 public ObservedVehicle(int id, double length, double width, Coordinates absolutePosition,
     Coordinates heading, double speed, ObservedVehicleState observationState,
     ObservedVehicleStatus observationStatus, AreaEstimate[] areaEstimates, bool isStopped)
 {
     this.Id = id;
     this.Length = length;
     this.Width = width;
     this.AbsolutePosition = absolutePosition;
     this.Heading = heading;
     this.Speed = speed;
     this.ObservationState = observationState;
     this.ObservationStatus = observationStatus;
     this.AreaEstimates = areaEstimates;
     this.IsStopped = isStopped;
 }