/// <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); }