/// <summary>
        /// Returns an edge with a forward weight.
        /// </summary>
        /// <param name="graph"></param>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        protected override bool GetEdge(IGraphReadOnly <CHEdgeData> graph, uint from, uint to, out CHEdgeData data)
        {
            var lowestWeight = float.MaxValue;

            data = new CHEdgeData();
            var edges = graph.GetEdges(from, to);

            while (edges.MoveNext())
            {
                var edgeData = edges.EdgeData;
                if (edgeData.CanMoveForward &&
                    edgeData.Weight < lowestWeight)
                {
                    data         = edgeData;
                    lowestWeight = edgeData.Weight;
                }
            }
            edges = graph.GetEdges(to, from);
            while (edges.MoveNext())
            {
                var edgeData = edges.EdgeData;
                if (edgeData.CanMoveBackward &&
                    edgeData.Weight < lowestWeight)
                {
                    data         = edgeData;
                    lowestWeight = edgeData.Weight;
                }
            }
            return(lowestWeight < float.MaxValue);
        }
        /// <summary>
        /// Gets the location of the given vertex.
        /// </summary>
        /// <returns></returns>
        public static GeoCoordinateSimple GetLocation <TEdgeData>(this IGraphReadOnly <TEdgeData> graph, uint vertex)
            where TEdgeData : struct, IGraphEdgeData
        {
            float latitude, longitude;

            if (!graph.GetVertex(vertex, out latitude, out longitude))
            {
                throw new Exception("Vertex not found.");
            }
            return(new GeoCoordinateSimple()
            {
                Latitude = latitude,
                Longitude = longitude
            });
        }
        /// <summary>
        /// Returns a shape between the given vertices.
        /// </summary>
        /// <param name="graph"></param>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        protected override bool GetEdgeShape(IGraphReadOnly <CHEdgeData> graph, uint from, uint to, out Collections.Coordinates.Collections.ICoordinateCollection data)
        {
            var lowestWeight = float.MaxValue;

            data = null;
            var edges = graph.GetEdges(from, to);

            while (edges.MoveNext())
            {
                var edgeData = edges.EdgeData;
                if (edgeData.CanMoveForward &&
                    edgeData.RepresentsNeighbourRelations &&
                    edgeData.Weight < lowestWeight)
                {
                    data         = edges.Intermediates;
                    lowestWeight = edgeData.Weight;
                }
            }
            edges = graph.GetEdges(to, from);
            while (edges.MoveNext())
            {
                var edgeData = edges.EdgeData;
                if (edgeData.CanMoveBackward &&
                    edgeData.RepresentsNeighbourRelations &&
                    edgeData.Weight < lowestWeight)
                {
                    if (edges.Intermediates != null)
                    {
                        data = edges.Intermediates.Reverse();
                    }
                    else
                    {
                        data = null;
                    }
                    lowestWeight = edgeData.Weight;
                }
            }
            return(lowestWeight < float.MaxValue);
        }