private List <GeoPlacemark> FindShortestPath(GeoPoint source, GeoPoint destination)
        {
            List <GeoPlacemark> route = new List <GeoPlacemark>();

            foreach (GeoGraphPoint point in pointsByID.Values)
            {
                point.IsVisited          = false;
                point.PreviousPoint      = null;
                point.DistanceFromSource = double.PositiveInfinity;
            }

            GeoGraphPoint sourcePoint = pointsByID[source.ID];

            sourcePoint.DistanceFromSource = 0;
            sourcePoint.PreviousPoint      = null;

            unvisitedNodes.Add(sourcePoint);

            GeoGraphPoint currentPoint, neighbour;
            double        dist;

            while (unvisitedNodes.Count != 0)
            {
                currentPoint = unvisitedNodes.ElementAt(0);

                for (int i = 0; i < allPoints.Count; i++)
                {
                    neighbour = pointsByID.ElementAt(i).Value;
                    if (!neighbour.IsVisited)
                    {
                        if ((dist = distanceMatrix[pointsIndex[currentPoint.ID], i]) > 0)
                        {
                            if (currentPoint.DistanceFromSource + dist < neighbour.DistanceFromSource)
                            {
                                neighbour.DistanceFromSource = currentPoint.DistanceFromSource + dist;
                                neighbour.PreviousPoint      = currentPoint;

                                int count = unvisitedNodes.Count, j;
                                for (j = 0; j < count; j++)
                                {
                                    if (unvisitedNodes.ElementAt(j).DistanceFromSource >= neighbour.DistanceFromSource)
                                    {
                                        unvisitedNodes.Insert(j, neighbour);
                                        break;
                                    }
                                }
                                if (j == count)
                                {
                                    unvisitedNodes.Insert(j, neighbour);
                                }
                            }
                        }
                    }
                }

                currentPoint.IsVisited = true;
                unvisitedNodes.Remove(currentPoint);
            }

            currentPoint = pointsByID[destination.ID];
            while (currentPoint != null)
            {
                route.Insert(0, new GeoPlacemark(currentPoint));
                currentPoint = currentPoint.PreviousPoint;
            }
            return(route);
        }
 public GeoPlacemark(GeoPoint point)
 {
     this.ID       = point.ID;
     this.Name     = point.Name;
     this.Position = point.Position;
 }