public Geometry ReadAndClean(string fileName) { var deserializer = new OsmDeserializer(); var fileHandle = File.OpenText(fileName); var geometry = deserializer.ReadFile(fileHandle); fileHandle.Close(); LogSize(geometry, "raw"); // strip parking lot aisles geometry = new DropParkingAisle().Transform(geometry); LogSize(geometry, "parkingaisle"); // strip buildings geometry = new DropBuildings().Transform(geometry); LogSize(geometry, "buildings"); // strip city boundaries geometry = new DropMunicipalBoundaries().Transform(geometry); LogSize(geometry, "boundaries"); // strip city boundaries geometry = new DropTrees().Transform(geometry); LogSize(geometry, "trees"); // strip tiger geometry = new DropTigerTags().Transform(geometry); LogSize(geometry, "tiger"); // strip tiger geometry = new DropNodeTags().Transform(geometry); LogSize(geometry, "nodetags"); // strip driveways geometry = new DropDriveways().Transform(geometry); LogSize(geometry, "driveways"); // strip underground (lol) geometry = new DropUnderground().Transform(geometry); LogSize(geometry, "underground"); return(geometry); }
/// <summary> /// Find optimal running route through cougar /// </summary> /// <param name="geometry"></param> private static void RunCougarFinder(Geometry geometry) { geometry = new DropBuildings().Transform(geometry); geometry = new DropWater().Transform(geometry); OutputPolygons("275765", geometry); geometry = new OnlyTraversable().Transform(geometry); geometry = new CollapseParkingLots().Transform(geometry); var cougar = geometry.Relations.First(x => x.Id == "275765"); var ways = new LabelWaysInRelation().Transform(cougar, geometry); ways = new SplitBisectedWays().Transform(ways); DebugOut(ways, "labeledWays.json"); var targetNodes = new HashSet <Node>(); foreach (var way in ways) { if (way.Tags["rfInPolygon"] == "in") { targetNodes.Add(way.Nodes.First()); targetNodes.Add(way.Nodes.Last()); } } var graph = new GraphBuilder(new RequiredEdgeGraphFilter(), new ReasonablyEnjoyableRunningCost()).BuildGraph(ways.ToArray(), out var originalEdgeWays); new GraphSummaryOutputter(outputLocation).OutputGraph(graph, originalEdgeWays, "reducedGraph.json"); var requiredCost = graph.RequiredEdgeCost(); // lazy route var lazyRouteFinder = new RouteFinder <Node>(new LazyGraphAugmenter <Node>()); var lazyRoute = lazyRouteFinder.GetRoute(graph); var lazyRouteCost = lazyRoute.Select(x => x.Distance).Sum(); // do regular route (rebuilds graph) graph = new GraphBuilder(new RequiredEdgeGraphFilter(), new ReasonablyEnjoyableRunningCost()).BuildGraph(ways.ToArray(), out originalEdgeWays); var greedRouteFinder = new RouteFinder <Node>(new GreedyGraphAugmenter <Node>()); var route = greedRouteFinder.GetRoute(graph); var routeCost = route.Select(x => x.Distance).Sum(); //new RouteCoverageOutputter(outputLocation).OutputGraph(route, originalEdgeWays, "greedyRouteCoverage.json"); new RouteDetailOutputter(ways, outputLocation, "lazyRouteCoverage.json", "instructions.txt").DescribeRoutesAsWays(lazyRoute); Console.WriteLine($"Required running: {requiredCost}"); Console.WriteLine($"Lazy Route: {lazyRouteCost}"); Console.WriteLine($"Greedy Route: {routeCost}"); Console.Read(); }