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 Transition(double onRoadDistanceInMeters, double haversineDistanceInMeters, DirectedRoad from, DirectedRoad to, MapMatcherParameters parameters) { OnRoadDistInMeters = onRoadDistanceInMeters; HaversineDistInMeters = haversineDistanceInMeters; From = from; To = to; // COMPUTE TRANSITION PROBABILITY double diffInMeters = Math.Abs(haversineDistanceInMeters - onRoadDistanceInMeters); if (diffInMeters > parameters.TransitionDiffThreshold) { Probability = 0; } else { Probability = ProbabilityFunctions.ExponentialDistribution(diffInMeters, parameters.Beta); } }
public static Transition TransitionProbability(RoadGraph graph, ProjectToRoad projection1, ProjectToRoad projection2, MapMatcherParameters parameters) { DirectedRoad road1 = projection1.Road; DirectedRoad road2 = projection2.Road; //calculate on road distance double onRoadDistanceInMeters; Distance startingDist = projection1.DistanceToEnd; Distance endDist = projection2.DistanceFromStart; // Roads are the same: if (road1.Equals(road2)) { //negative if going backwards along road onRoadDistanceInMeters = projection2.DistanceFromStart.DistanceInMeters - projection1.DistanceFromStart.DistanceInMeters; } // Road start or end on the same node else if (road1.End == road2.End || road1.Start == road2.Start) { //make this transition impossible return(Transition.ImpossibleTransition(road1, road2)); } // Roads are connected (can be same road in opposite direction) else if (road1.End == road2.Start) { onRoadDistanceInMeters = startingDist.DistanceInMeters + endDist.DistanceInMeters; } // Try connect roads using Dijstra else { List <DirectedRoad> path; if (PathFinding.DijstraTryFindPath(graph, road1.End, road2.Start, parameters.DijstraUpperSearchLimit, out path)) { Distance connectingDist = Distance.Zero; foreach (var road in path) { connectingDist += road.Length; } onRoadDistanceInMeters = startingDist.DistanceInMeters + connectingDist.DistanceInMeters + endDist.DistanceInMeters; } else { //cannot connect up roads. transition probability is zero return(Transition.ImpossibleTransition(road1, road2)); } } Distance haversineDistance = projection1.Coordinate.HaversineDistance(projection2.Coordinate); return(new Transition(onRoadDistanceInMeters, haversineDistance.DistanceInMeters, road1, road2, parameters)); }