private void UpdateDirection(RouteDirection direction)
		{
			if (direction == null)
			{
				LayoutRoot.Visibility = Visibility.Collapsed;
				return;
			}
			LayoutRoot.Visibility = Visibility.Visible;
			LayoutRoot.DataContext = direction;
			var d = direction.GetLength(LinearUnits.Miles);
			if (d == 0)
				distance.Text = "";
			else if (d >= .25)
				distance.Text = d.ToString("0.0 mi");
			else
			{
				d = direction.GetLength(LinearUnits.Yards);
				distance.Text = d.ToString("0 yd");
			}
			if (direction.Time.TotalHours >= 1)
				time.Text = direction.Time.ToString("hh\\:mm");
			else if (direction.Time.TotalMinutes > 1)
				time.Text = direction.Time.ToString("mm\\:ss");
			else if (direction.Time.TotalSeconds > 0)
				time.Text = direction.Time.ToString("ss") + " sec";
			else
				time.Text = "";
		}
        private void UpdateDirection(RouteDirection direction)
        {
            if (direction == null)
            {
                LayoutRoot.Visibility = Visibility.Collapsed;
                return;
            }
            LayoutRoot.Visibility  = Visibility.Visible;
            LayoutRoot.DataContext = direction;
            var d = direction.GetLength(LinearUnits.Miles);

            if (d == 0)
            {
                distance.Text = "";
            }
            else if (d >= .25)
            {
                distance.Text = d.ToString("0.0 mi");
            }
            else
            {
                d             = direction.GetLength(LinearUnits.Yards);
                distance.Text = d.ToString("0 yd");
            }
            if (direction.Time.TotalHours >= 1)
            {
                time.Text = direction.Time.ToString("hh\\:mm");
            }
            else if (direction.Time.TotalMinutes > 1)
            {
                time.Text = direction.Time.ToString("mm\\:ss");
            }
            else if (direction.Time.TotalSeconds > 0)
            {
                time.Text = direction.Time.ToString("ss") + " sec";
            }
            else
            {
                time.Text = "";
            }
        }
        private Graphic GraphicFromRouteDirection(RouteDirection rd)
        {
            var graphic = new Graphic(rd.Geometry);

            graphic.Attributes.Add("Direction", rd);
            graphic.Attributes["Length"] = rd.GetLength(LinearUnits.Miles);
            if (rd.Geometry is MapPoint)
            {
                graphic.Symbol = _directionPointSymbol;
            }

            return(graphic);
        }
Beispiel #4
0
        private Graphic GraphicFromRouteDirection(RouteDirection rd)
        {
            var graphic = new Graphic(rd.Geometry);

            graphic.Attributes.Add("Direction", rd.Text);
            graphic.Attributes.Add("Time", string.Format("{0:h\\:mm\\:ss}", rd.Time));
            graphic.Attributes.Add("Length", string.Format("{0:0.00}", rd.GetLength(LinearUnits.Miles)));
            if (rd.Geometry is MapPoint)
            {
                graphic.Symbol = _directionPointSymbol;
            }

            return(graphic);
        }
        private Graphic GraphicFromRouteDirection(RouteDirection rd)
        {
            var graphic = new Graphic(rd.Geometry);
            graphic.Attributes.Add("Direction", rd.Text);
            graphic.Attributes.Add("Time", string.Format("{0:h\\:mm\\:ss}", rd.Time));
            graphic.Attributes.Add("Length", string.Format("{0:0.00}", rd.GetLength(LinearUnits.Miles)));
            if (rd.Geometry is MapPoint)
                graphic.Symbol = _directionPointSymbol;

            return graphic;
        }
        /// <summary>
        /// Call this to set your current location and update directions based on that.
        /// </summary>
        /// <param name="location"></param>
        public void SetCurrentLocation(MapPoint location)
        {
            RouteDirection closest         = null;
            double         distance        = double.NaN;
            MapPoint       snappedLocation = null;
            Route          direction       = null;

            // Find the route part that we are currently on by snapping to each segment and see which one is the closest
            foreach (var dir in m_route.Routes)
            {
                var closestCandidate = (from a in dir.RouteDirections
                                        where a.Geometry is Polyline
                                        select new { Direction = a, Proximity = GeometryEngine.NearestCoordinateInGeometry(a.Geometry, location) }).OrderBy(b => b.Proximity.Distance).FirstOrDefault();
                if (double.IsNaN(distance) || distance < closestCandidate.Proximity.Distance)
                {
                    distance        = closestCandidate.Proximity.Distance;
                    closest         = closestCandidate.Direction;
                    snappedLocation = closestCandidate.Proximity.Point;
                    direction       = dir;
                }
            }
            if (closest != null)
            {
                var directions = direction.RouteDirections.ToList();
                var idx        = directions.IndexOf(closest);
                if (idx < directions.Count)
                {
                    RouteDirection next = directions[idx + 1];

                    //calculate how much is left of current route segment
                    var      segment           = closest.Geometry as Polyline;
                    var      proximity         = GeometryEngine.NearestVertexInGeometry(segment, snappedLocation);
                    double   frac              = 1 - GetFractionAlongLine(segment, proximity, snappedLocation);
                    TimeSpan timeLeft          = new TimeSpan((long)(closest.Time.Ticks * frac));
                    double   segmentLengthLeft = (Convert.ToDouble(closest.GetLength(LinearUnits.Meters))) * frac;
                    //Sum up the time and lengths for the remaining route segments
                    TimeSpan totalTimeLeft = timeLeft;
                    double   totallength   = segmentLengthLeft;
                    for (int i = idx + 1; i < directions.Count; i++)
                    {
                        totalTimeLeft += directions[i].Time;
                        totallength   += directions[i].GetLength(LinearUnits.Meters);
                    }

                    //Update properties
                    TimeToWaypoint        = TimeSpan.FromSeconds(Math.Round(timeLeft.TotalSeconds));
                    TimeToDestination     = TimeSpan.FromSeconds(Math.Round(totalTimeLeft.TotalSeconds));
                    DistanceToWaypoint    = Math.Round(segmentLengthLeft);
                    DistanceToDestination = Math.Round(totallength);
                    SnappedLocation       = snappedLocation;
                    var maneuverType = next.ManeuverType;
#if NETFX_CORE || WINDOWS_PHONE
                    ManeuverImage = new Uri(string.Format("ms-appx:///Assets/Maneuvers/{0}.png", maneuverType));
#else
                    ManeuverImage = new Uri(string.Format("pack://application:,,,/Assets/Maneuvers/{0}.png", maneuverType));
#endif
                    NextManeuver = next.Text;

                    RaisePropertiesChanged(new string[] {
                        "NextManeuver", "SnappedLocation", "CurrentDirection", "TimeToWaypoint",
                        "DistanceToDestination", "DistanceToWaypoint", "TimeToDestination",
                        "MilesToDestination", "MilesToWaypoint", "ManeuverImage"
                    });
                }
            }
        }
        private Graphic GraphicFromRouteDirection(RouteDirection rd)
        {
            var graphic = new Graphic(rd.Geometry);
            graphic.Attributes.Add("Direction", rd);
            graphic.Attributes["Length"] = rd.GetLength(LinearUnits.Miles);
            if (rd.Geometry is MapPoint)
                graphic.Symbol = _directionPointSymbol;

            return graphic;
        }