/// <summary> /// Returns the maximum speed. /// </summary> /// <returns></returns> public KilometerPerHour MaxSpeed(VehicleEnum vehicle, IDictionary<string, string> tags) { // THESE ARE THE MAX SPEEDS FOR BELGIUM. // TODO: Find a way to make this all configurable. KilometerPerHour speed = 5; KilometerPerHour pedestrian_speed = 5; KilometerPerHour bike_speed = 15; // get max-speed tag if any. double? max_speed_value = tags.GetNumericValue("maxspeed"); if (max_speed_value.HasValue) { return max_speed_value.Value; } string highway_type; if (tags.TryGetValue("highway", out highway_type)) { switch (highway_type) { case "services": case "proposed": switch (vehicle) { case VehicleEnum.Bicycle: speed = pedestrian_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; default: speed = pedestrian_speed; break; } break; case "cycleway": case "pedestrian": case "steps": case "path": case "footway": case "living_street": switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; // TODO: improve speed calculations when using access tags. case VehicleEnum.Car: case VehicleEnum.Bus: speed = 30; break; } break; case "track": switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; case VehicleEnum.Car: case VehicleEnum.Bus: speed = 40; break; } break; case "residential": case "road": switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; case VehicleEnum.Car: case VehicleEnum.Bus: speed = 50; break; } break; case "motorway": switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; case VehicleEnum.Car: case VehicleEnum.Bus: speed = 120; break; } break; case "motorway_link": switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; case VehicleEnum.Car: case VehicleEnum.Bus: speed = 90; break; } break; case "trunk": case "trunk_link": case "primary": case "primary_link": switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; case VehicleEnum.Car: case VehicleEnum.Bus: speed = 75; break; } break; case "secondary": case "secondary_link": switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; case VehicleEnum.Car: case VehicleEnum.Bus: speed = 70; break; } break; case "tertiary": switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; case VehicleEnum.Car: case VehicleEnum.Bus: speed = 60; break; } break; case "unclassified": switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; case VehicleEnum.Car: case VehicleEnum.Bus: speed = 40; break; } break; default: switch (vehicle) { case VehicleEnum.Bicycle: speed = bike_speed; break; case VehicleEnum.Pedestrian: speed = pedestrian_speed; break; case VehicleEnum.Car: case VehicleEnum.Bus: speed = 50; break; } break; } } return speed; }