コード例 #1
0
        public static void FindNodesInXML(XmlReader reader, ref RequestHandler request, int fileIndex, bool onlyBuildings)
        {
            string currentNodeId       = "";
            double currentLat          = 0;
            double currentLon          = 0;
            var    currentNodeMetaData = new Dictionary <string, string>();
            var    xli            = (IXmlLineInfo)reader; // Used to track read progress
            var    nodesCollected = 0;

            // Loop (linearly) through all tags. Keep track of each node's metadata and coords while looping through its tags.
            // When encountering the next node add the tracked data.
            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    if (reader.Name == "node")
                    {
                        currentNodeId = reader.GetAttribute("id");
                        currentLat    = Convert.ToDouble(reader.GetAttribute("lat"), CI);
                        currentLon    = Convert.ToDouble(reader.GetAttribute("lon"), CI);
                    }
                    else if (reader.Name == "tag")
                    {
                        currentNodeMetaData[reader.GetAttribute("k").ToLower(CI)] = reader.GetAttribute("v");
                    }
                    else if (reader.Name == "way")
                    {
                        break;
                    }
                }
                else if (reader.Name == "node") // Closing out a node tag
                {
                    request.AddNodeIfMatchesRequest(currentNodeId, currentNodeMetaData, currentLat, currentLon);
                    currentNodeMetaData.Clear();
                    nodesCollected++;
                    if (nodesCollected % 3000 == 0) // roughly every half a second
                    {
                        ProgressReporting.Ping(xli.LineNumber, fileIndex, request);
                    }
                }
            }
        }
コード例 #2
0
        public static void FindWaysInXML(XmlReader reader, ref RequestHandler request, int fileIndex, bool onlyBuildings)
        {
            string currentWayId       = "";
            var    currentWayMetaData = new Dictionary <string, string>();
            var    currentWayNodes    = new List <Coord>();
            var    allNodes           = new Dictionary <string, Coord>();
            var    inANode            = false;           // Only needed for ways
            var    xli           = (IXmlLineInfo)reader; // Used to track read progress
            var    waysCollected = 0;

            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    if (reader.Name == "way")
                    {
                        currentWayId = reader.GetAttribute("id");
                        inANode      = true; // Add tag data
                    }
                    else if (reader.Name == "node")
                    {
                        var nodeId = reader.GetAttribute("id");
                        allNodes[nodeId] = new Coord(
                            Convert.ToDouble(reader.GetAttribute("lat"), CI),
                            Convert.ToDouble(reader.GetAttribute("lon"), CI));
                    }
                    else if (inANode && reader.Name == "nd")
                    {
                        var ndId = reader.GetAttribute("ref");
                        currentWayNodes.Add(allNodes[ndId]);
                    }
                    else if (inANode && reader.Name == "tag")
                    {
                        currentWayMetaData[reader.GetAttribute("k").ToLower(CI)] = reader.GetAttribute("v");
                    }
                    else if (reader.Name == "relation")
                    {
                        break;
                    }
                }
                else
                {
                    inANode = false;
                    if (reader.Name == "way") // Closing out a way tag
                    {
                        // If finished looping over a prior node
                        if (onlyBuildings)
                        {
                            request.AddBuildingIfMatchesRequest(currentWayId, currentWayMetaData, currentWayNodes);
                        }
                        else
                        {
                            request.AddWayIfMatchesRequest(currentWayId, currentWayMetaData, currentWayNodes);
                        }

                        waysCollected += 1;
                        if (waysCollected % 2000 == 0)
                        {
                            ProgressReporting.Ping(xli.LineNumber, fileIndex, request);
                        }
                    }

                    currentWayMetaData.Clear();
                    currentWayNodes.Clear();
                }
            }
        }