public MapData LocateWaypointWithLineOfSight(WaypointDetectionMethod method, List <GPSLocation> history, int waypointIndex = 0, int viewArc = 0, double distance = 1.0) { MapData waypoint = null; var location = history.Last(); var sortedMAPPoints = GLOSAHelper.SortMAPDataByDistanceFromCurrentLocation(_mapDataCache, location.Latitude, location.Longitude); if (sortedMAPPoints != null && sortedMAPPoints.Count > 0) { switch (method) { case WaypointDetectionMethod.ShortestDistance: waypoint = sortedMAPPoints.First(); break; case WaypointDetectionMethod.GPSHistoryDirection: GPSLocation to = history[history.Count - 1]; double? vehicleHeading = LocationHelper.HeadingFromGPSTrail(history); List <IntersectionNode> listOfMAPDataWaypoints = IntersectionNode.IntersectionNodesFromMAPData(_mapDataCache).ToList(); var filtered = IntersectionNode.Filter(listOfMAPDataWaypoints, vehicleHeading, history); var sortedByBearingAndDistance = IntersectionNode.SortIntersectionNodes(filtered, to, vehicleHeading, viewArc, distance).ToList(); if (sortedByBearingAndDistance.Count() > waypointIndex) { var tn = sortedByBearingAndDistance.ToList()[waypointIndex]; waypoint = tn.MapData; } break; default: throw new Exception("Waypoint Detection Method not implemented."); break; } } return(waypoint); }