コード例 #1
0
        private MovingVehicleInfo GetLocationOnPath(
            MovingVehicleInfo mvi,
            List <RouteSegmentPaths> path,
            double distance,
            RouteSegments routeSegment
            )
        {
            var nextDistance = distance;

            for (var i = 0; i < path.Count(); i++)
            {
                var currentDistance = path[i].Distance;
                var remainDistance  = nextDistance - currentDistance;
                if (remainDistance > 0)
                {
                    nextDistance -= currentDistance;
                }
                else
                {
                    var fraction = nextDistance / currentDistance;
                    if (fraction < 0.0 || fraction > 1.0)
                    {
                        return(IsInvalid(mvi, "fraction < 0.0 || fraction > 1.0"));
                    }
                    if (nextDistance < 0 && nextDistance > currentDistance)
                    {
                        return(IsInvalid(mvi, "nextDistance < 0 && nextDistance > currentDistance"));
                    }
                    return(CalculateLocationOnPath(mvi, path[i], nextDistance, routeSegment));
                }
            }
            return(CalculateLocationOnPath(mvi, path[path.Count() - 1], 1.0, routeSegment));
        }
コード例 #2
0
        private MovingVehicleInfo CalculateLocationOnPath(
            MovingVehicleInfo mvi,
            RouteSegmentPaths path,
            double distance,
            RouteSegments routeSegment
            )
        {
            var fraction = distance / path.Distance;
            var lat1     = path.StartPoint.Y / 180 * pi;
            var lng1     = path.StartPoint.X / 180 * pi;
            var lat2     = path.EndPoint.Y / 180 * pi;
            var lng2     = path.EndPoint.X / 180 * pi;
            var lng      = lng1 + (lng2 - lng1) * fraction;

            if (lng2 == lng1)
            {
                lng2 += Math.Pow(10.0, -15.0);
            }
            var lat = Math.Atan(
                (Math.Tan(lat1) * Math.Sin(lng2 - lng) +
                 Math.Tan(lat2) * Math.Sin(lng - lng1)) / Math.Sin(lng2 - lng1)
                );
            var normalized = new Point(lng * 180 / pi, lat * 180 / pi);

            mvi.MovingVehicle.Normalized           = normalized;
            mvi.MovingVehicle.RouteSegmentId       = routeSegment.Id;
            mvi.MovingVehicle.LastPathPosition     = path.Position;
            mvi.MovingVehicle.DistanceFromLastPath = distance;
            mvi.MovingVehicle.UpdatedAt            = _nextTime;
            return(mvi);
        }
コード例 #3
0
        private void RenderMapOverlay()
        {
            Map.Pins.Clear();
            Map.MapElements.Clear();

            foreach (var stop in Stops)
            {
                var pin = new CustomPin()
                {
                    Position = new Position(decimal.ToDouble(stop.XCoordinate), decimal.ToDouble(stop.YCoordinate)),
                    Label    = stop.Name,
                    Type     = PinType.Place
                };
                Map.Pins.Add(pin);
            }

            foreach (var bus in Buses)
            {
                var pin = new CustomPin
                {
                    Position = new Position(decimal.ToDouble(bus.XCoordinate), decimal.ToDouble(bus.YCoordinate)),
                    Label    = bus.BusId.ToString(),
                    Type     = PinType.Generic
                };
                Map.Pins.Add(pin);
            }

            foreach (var routeSegment in RouteSegments)
            {
                var startPosition    = new Position(decimal.ToDouble(routeSegment.StartXCoordinate), decimal.ToDouble(routeSegment.StartYCoordinate));
                var nextRouteSegment = RouteSegments.Where(r => r.RouteSegmentId == routeSegment.NextRouteSegmentId).First();
                var endPosition      = new Position(decimal.ToDouble(nextRouteSegment.StartXCoordinate), decimal.ToDouble(nextRouteSegment.StartYCoordinate));

                var polyline = new Polyline
                {
                    StrokeWidth = 12,
                    Geopath     =
                    {
                        startPosition,
                        endPosition
                    }
                };

                switch (routeSegment.RouteId)
                {
                case 1:
                    polyline.StrokeColor = Color.Blue;
                    break;

                case 2:
                    polyline.StrokeColor = Color.Green;
                    break;

                case 3:
                    polyline.StrokeColor = Color.Red;
                    break;
                }

                Map.MapElements.Add(polyline);
            }
        }