/// <summary> /// Geocodes the origins and destinations. /// </summary> /// <returns>A task for geocoding the origins and destinations.</returns> public async Task GeocodeWaypoints() { //Ensure all the origins are geocoded. if (Origins != null) { await SimpleWaypoint.TryGeocodeWaypoints(Origins, this); } //Ensure all the destinations are geocoded. if (Destinations != null) { await SimpleWaypoint.TryGeocodeWaypoints(Destinations, this); } }
/// <summary> /// Creates a NxN distance matrix with straight line distances. /// </summary> /// <param name="waypoints">The waypoints to generate a matrix for.</param> /// <param name="distanceUnits">The distance units to calculate the distances in.</param> /// <param name="bingMapsKey">A bing maps key that can be used to geocode waypoints, if needed.</param> /// <returns>A NxN distance matrix with straight line distances.</returns> public static async Task <DistanceMatrix> CreateStraightLineNxNMatrix(List <SimpleWaypoint> waypoints, DistanceUnitType distanceUnits, string bingMapsKey) { //Ensure all the waypoints are geocoded. if (waypoints == null || waypoints.Count < 2) { throw new Exception("Not enough Waypoints specified."); } if (!string.IsNullOrEmpty(bingMapsKey)) { await SimpleWaypoint.TryGeocodeWaypoints(waypoints, bingMapsKey); } var numWaypoints = waypoints.Count; var cells = new DistanceMatrixCell[numWaypoints * numWaypoints]; await Task.Run(() => Parallel.For(0, numWaypoints, i => { for (var j = 0; j < numWaypoints; j++) { double distance = -1; if (i != j && waypoints[i].Coordinate != null && waypoints[j].Coordinate != null) { distance = SpatialTools.HaversineDistance(waypoints[i].Coordinate, waypoints[j].Coordinate, distanceUnits); } cells[i * numWaypoints + j] = new DistanceMatrixCell() { OriginIndex = i, DestinationIndex = j, TravelDistance = distance }; } })); return(new DistanceMatrix() { Origins = waypoints, Destinations = waypoints, Results = cells }); }