Пример #1
0
        /// <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);
        }
Пример #2
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();
        }
Пример #3
0
        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;
        }
Пример #4
0
        ////////////////


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