/// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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
            });
        }