/// <summary> /// Build graph from OSM elements. May contains duplicated elements (from multiple calls) /// </summary> /// <param name="elements"></param> /// <returns></returns> private static RoadGraph BuildGraph(List <Element> elements, bool ignoreOneWays) { RoadGraph result = new RoadGraph(); IEnumerable <Way> ways = elements.Where(x => x is Way).Select(x => x as Way).Distinct(); var nodeLookup = new Dictionary <long, OsmNode>(); foreach (var node in elements.Where(x => x is OsmNode).Select(x => x as OsmNode)) { nodeLookup[node.Id] = node; } var intersectionCounter = ways.Select(x => x.Nodes).CountRepeatedIds(); foreach (var way in ways) { string wayName = way.ParseName(); var subways = way.Nodes.InclusivePartitioning(id => intersectionCounter[id] > 1); foreach (var subway in subways) { // TODO : why are ids not in dictinoary sometimes? Data problem? var roadShape = subway.Where(id => nodeLookup.ContainsKey(id)).Select(id => nodeLookup[id].ToCoord()).ToList(); DirectedRoad road = new DirectedRoad(subway.First().ToString(), subway.Last().ToString(), roadShape, wayName); result.AddRoad(road); if (!way.IsOneWay() || ignoreOneWays) { DirectedRoad reverseRoad = road.Reverse(); result.AddRoad(reverseRoad); } } } return(result); }
public MapMatcher(List <T> data, Func <T, DirectedRoad> dataToRoad, MapMatcherParameters parameters, bool useSearchGrid = true, BoundingBox boundingBox = null) { // Initialize parameters Parameters = parameters; //Build graph _dataByRoadId = new Dictionary <string, T>(); var graph = new RoadGraph(); foreach (var datum in data) { var road = dataToRoad(datum); graph.AddRoad(road); _dataByRoadId[road.Squid] = datum; } Graph = graph; // Compute search grid (for accessing nearby roads) if (useSearchGrid) { // Compute bounding box if not given if (boundingBox == null) { boundingBox = graph.Nodes.Values.GetBoundingBox(); } SearchGrid = SearchGridFactory.ComputeSearchGrid(graph, parameters.NearbyRoadsThreshold, boundingBox); } // Initialize state State = MapMatchState.InitialState(); }
public static RoadGraph BuildGraph1() { RoadGraph result = new RoadGraph(); DirectedRoad roadAB = new DirectedRoad("1000", "1001", GeometryAB().ToCoordList(), "AB"); DirectedRoad roadAC = new DirectedRoad("1000", "1002", GeometryAC().ToCoordList(), "AC"); DirectedRoad roadAD = new DirectedRoad("1000", "1003", GeometryAD().ToCoordList(), "AD"); DirectedRoad roadDB = new DirectedRoad("1003", "1001", GeometryDB().ToCoordList(), "DB"); result.AddRoad(roadAB); result.AddRoad(roadAC); result.AddRoad(roadAD); result.AddRoad(roadDB); return result; }
//////////////// // Graph where A->B, B->C is shorter than going A->C public static RoadGraph BuildGraphTwoShortRoadsOneLong() { RoadGraph result = new RoadGraph(); // Two short roads DirectedRoad roadAB = new DirectedRoad("1000", "1001", StraightAB().ToCoordList(), "AB"); DirectedRoad roadBC = new DirectedRoad("1001", "1002", StraightBC().ToCoordList(), "BC"); //Long road DirectedRoad roadAC = new DirectedRoad("1000", "1002", BigTriangleAC().ToCoordList(), "AC"); result.AddRoad(roadAB); result.AddRoad(roadBC); result.AddRoad(roadAC); return result; }