Ejemplo n.º 1
0
        /// <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;
        }