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); } } } }
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(); } } }