using System.Globalization; using System.Xml; using OSMDatastructure; namespace Server; public class RegionConverter { private static readonly XmlReaderSettings ReaderSettings = new() { IgnoreWhitespace = true, IgnoreComments = true }; private static readonly NumberFormatInfo decimalInfo = new() { NumberDecimalSeparator = "." }; public static HashSet ImportXml(string filePath) { if (!File.Exists(filePath)) throw new FileNotFoundException(); Console.WriteLine("Getting highwayNodeIds..."); FileStream xmlFileStream = new FileStream(filePath, FileMode.Open); Dictionary nodeIdRegionDict = GetNodesAndRegions(XmlReader.Create(xmlFileStream, ReaderSettings)); xmlFileStream.Position = 0; Console.WriteLine("Importing Nodes..."); Dictionary nodes = GetHighwayNodesFromIds(XmlReader.Create(xmlFileStream, ReaderSettings), requiredNodeIds); requiredNodeIds.Clear(); xmlFileStream.Position = 0; Console.WriteLine("Importing Ways..."); HashSet retNodes = ConnectNodes(XmlReader.Create(xmlFileStream, ReaderSettings), nodes); nodes.Clear(); return retNodes; } private static Dictionary GetNodesAndRegions(XmlReader xmlReader) { bool isHighway = false; while (xmlReader.ReadToFollowing("way")) { isHighway = false; currentIds.Clear(); XmlReader wayReader = xmlReader.ReadSubtree(); while (wayReader.Read()) { if (xmlReader.Name == "tag" && xmlReader.GetAttribute("k")!.Equals("highway")) { isHighway = true; } else if (xmlReader.Name == "nd") { try { currentIds.Add(Convert.ToUInt64(xmlReader.GetAttribute("ref"))); } catch (FormatException) { }; } } if (isHighway) { retSet.UnionWith(currentIds); } wayReader.Close(); } xmlReader.Close(); } }