コード例 #1
0
        /// <summary>
        /// Builds a path from the given referenced line start and the first referenced point and ending at the last.
        /// </summary>
        public static EdgePath <float> BuildPathFromLine(this ReferencedLine referencedLine, RouterDb routerDb, out RouterPoint source, out float postiveOffsetInMeters,
                                                         out RouterPoint target, out float negativeOffsetInMeters)
        {
            source = referencedLine.GetPositiveOffsetRouterPoint(routerDb);
            target = referencedLine.GetNegativeOffsetRouterPoint(routerDb);
            negativeOffsetInMeters = 0;
            postiveOffsetInMeters  = 0;

            var started = false;
            var path    = new EdgePath <float>();

            for (var e = 0; e < referencedLine.Edges.Length; e++)
            {
                var directedEdgeId = referencedLine.Edges[e];
                var edge           = routerDb.Network.GetEdge(directedEdgeId);

                var to = edge.To;
                if (directedEdgeId < 0)
                {
                    to = edge.From;
                }

                if (!started)
                {
                    if (edge.Id != source.EdgeId)
                    {
                        continue;
                    }
                    negativeOffsetInMeters = (source.Offset / (float)ushort.MaxValue) * edge.Data.Distance;
                    if (directedEdgeId < 0)
                    {
                        negativeOffsetInMeters = edge.Data.Distance - negativeOffsetInMeters;
                    }
                    path    = new EdgePath <float>(to, edge.Data.Distance - negativeOffsetInMeters, directedEdgeId, path);
                    started = true;
                    continue;
                }

                if (edge.Id == target.EdgeId)
                {
                    postiveOffsetInMeters = (target.Offset / (float)ushort.MaxValue) * edge.Data.Distance;
                    if (directedEdgeId > 0)
                    {
                        postiveOffsetInMeters = edge.Data.Distance - postiveOffsetInMeters;
                    }
                    path = new EdgePath <float>(Constants.NO_VERTEX, path.Weight + edge.Data.Distance - postiveOffsetInMeters, directedEdgeId, path);
                    break;
                }
                else
                {
                    path = new EdgePath <float>(to, path.Weight + edge.Data.Distance, directedEdgeId, path);
                }
            }

            return(path);
        }