using System.Drawing; using System.Drawing.Imaging; using OSMDatastructure; using OSMDatastructure.Graph; using Pathfinding; using RenderPath; using Region = OSMDatastructure.Region; namespace Server; public class Server { public static void Main(string[] args) { ConsoleWriter newConsole = new(); Console.SetOut(newConsole); Console.SetError(newConsole); string workingDir = "D:/stuttgart-regbez-latest"; //RegionConverter.ConvertXMLToRegions("D:/stuttgart-regbez-latest.osm", "D:/stuttgart-regbez-latest"); //RegionConverter.ConvertXMLToRegions("D:/map.osm", "D:/map"); //RegionConverter.ConvertXMLToRegions("D:/germany-latest.osm", "D:/germany-latest"); Coordinates start = new (48.7933798f, 9.8275859f); Coordinates finish = new (48.795918f, 9.021618f); TestVariables(workingDir, start, finish, 16); GetShortestRoute("D:"); /* ValueTuple area = RenderAreaBaseImage(workingDir, start, finish); area.Item1.Save(@"D:\Base.png", ImageFormat.Png); ValueTuple areaDistance = Renderer.DrawPath( PathResult.PathresultFromFile(@"D:\angle0,140_level0,020_same0,160.result"), Image.FromFile(@"D:\Base.png"), area.Item2); areaDistance.Item1.Save(@"D:\Distance.png", ImageFormat.Png); ValueTuple areaWeight = Renderer.DrawPath( PathResult.PathresultFromFile(@"D:\angle0,160_level0,020_same0,020.result"), Image.FromFile(@"D:\Base.png"), area.Item2); areaWeight.Item1.Save(@"D:\Weight.png", ImageFormat.Png); */ /* string parentFolder = new DirectoryInfo(workingDir).Parent!.FullName; Pathfinder result = new Pathfinder(workingDir, 0.002, 0, 0, 1, 30).AStar(start, finish, Tag.SpeedType.car); Console.WriteLine($"Calc-time {result.pathResult!.calcTime} Path-length: {result.pathResult.pathNodes.Count} Visited-nodes: {result.gScore!.Count}"); string fileName = DateTime.Now.ToFileTime().ToString(); string resultFileName = $"{new DirectoryInfo(workingDir).Name}-{fileName}.result"; result.SaveResult(Path.Join(parentFolder, resultFileName)); string renderFileName = $"{new DirectoryInfo(workingDir).Name}-{fileName}.render.png"; Image render = Renderer.DrawPathfinder(result); #pragma warning disable CA1416 render.Save(Path.Join(parentFolder, renderFileName), ImageFormat.Png); #pragma warning restore CA1416*/ Console.Beep(400, 100); } private static void GetShortestRoute(string directory) { DateTime start = DateTime.Now; HashSet allFiles = Directory.GetFiles(directory).Where(file => file.EndsWith(".result")).ToHashSet(); PathResult first = PathResult.PathresultFromFile(allFiles.First()); KeyValuePair shortest = new(first, allFiles.First()); KeyValuePair fastest = new(first, allFiles.First()); KeyValuePair calcTime = new(first, allFiles.First()); int loaded = 0; foreach (string filePath in allFiles) { PathResult result = PathResult.PathresultFromFile(filePath); Console.WriteLine($"{loaded++}/{allFiles.Count()} {filePath} " + $"Time elapsed: {DateTime.Now - start} " + $"Remaining {((DateTime.Now - start)/loaded)*(allFiles.Count-loaded)}"); if (shortest.Key.distance > result.distance) shortest = new KeyValuePair(result, filePath); if (fastest.Key.weight > result.weight) fastest = new KeyValuePair(result, filePath); if (calcTime.Key.calcTime > result.calcTime) calcTime = new KeyValuePair(result, filePath); } Console.WriteLine($"Shortest: {shortest.Key.distance} {shortest.Value}\nFastest: {shortest.Key.weight} {fastest.Value}\nCalcTime: {calcTime.Key.calcTime} {calcTime.Value}"); } private static ValueTuple RenderAreaBaseImage(string workingDir, Coordinates c1, Coordinates c2) { float minLat = c1.latitude < c2.latitude ? c1.latitude : c2.latitude; float minLon = c1.longitude < c2.longitude ? c1.longitude : c2.longitude; float maxLat = c1.latitude > c2.latitude ? c1.latitude : c2.latitude; float maxLon = c1.longitude > c2.longitude ? c1.longitude : c2.longitude; RegionManager allRegions = new(workingDir); for (float lat = minLat - Region.RegionSize; lat < maxLat + Region.RegionSize; lat += Region.RegionSize / 2) { for (float lon = minLon - Region.RegionSize; lon < maxLon + Region.RegionSize; lon += Region.RegionSize / 2) { allRegions.GetRegion(new Coordinates(lat, lon)); } } Console.WriteLine("Regions Loaded. Rendering."); ValueTuple baseRender = Renderer.DrawArea(allRegions); return baseRender; } private static void TestVariables(string workingDir, Coordinates start, Coordinates finish, int threads) { string parentFolder = new DirectoryInfo(workingDir).Parent!.FullName; RegionManager rm = new (workingDir); Queue calcThreads = new(); for (double roadLevelPriority = 0.02; roadLevelPriority > 0; roadLevelPriority -= 0.001) { for (double maxAngle = 5; maxAngle < 45; maxAngle += 5) { double priority = roadLevelPriority; double angle = maxAngle; calcThreads.Enqueue(new Thread(() => { Pathfinder testresult = new Pathfinder(rm, priority, angle).AStar(start, finish, Tag.SpeedType.car); string fileName = $"angle{angle:0.000}_level{priority:0.000}.result"; testresult.SaveResult(Path.Join(parentFolder, fileName)); })); } } int totalTasks = calcThreads.Count; int completedTasks = 0; DateTime startTime = DateTime.Now; HashSet runningThreads = new(); while (calcThreads.Count > 0) { while (runningThreads.Count < threads && calcThreads.Count > 0) { Thread t = calcThreads.Dequeue(); runningThreads.Add(t); t.Start(); } int newCompletedTasks = runningThreads.RemoveWhere(thread => !thread.IsAlive); completedTasks += newCompletedTasks; if (newCompletedTasks > 0) { TimeSpan elapsedTime = DateTime.Now - startTime; Console.WriteLine($"To calculate: {calcThreads.Count}/{totalTasks} Time Average: {(elapsedTime)/(completedTasks)} Elapsed: {elapsedTime} Remaining: {(elapsedTime)/(completedTasks)*calcThreads.Count}"); } } } }