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)); }
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); }
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); } }