diff --git a/Server/RegionConverter.cs b/Server/RegionConverter.cs new file mode 100644 index 0000000..7d639fc --- /dev/null +++ b/Server/RegionConverter.cs @@ -0,0 +1,73 @@ +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(); + } +} \ No newline at end of file