示例#1
0
        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();
        }
示例#2
0
        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));
        }