From 2bd9f577d0426480bf130baa7e91ca814311f171 Mon Sep 17 00:00:00 2001 From: Yury Kanetski Date: Thu, 21 Oct 2021 16:59:48 +0300 Subject: [PATCH] RouteOptions and Directions API: add `avoidManeuverRadius` ("avoid_maneuver_radius") param --- .../directions/v5/models/RouteOptions.java | 41 +++++++++++++++++++ .../v5/models/RouteOptionsTest.java | 4 +- .../src/test/resources/route_options_v5.json | 1 + .../api/directions/v5/DirectionsService.java | 4 ++ .../api/directions/v5/MapboxDirections.java | 2 + 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java index 7b939e554..db69d6807 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java @@ -201,6 +201,25 @@ public List bearingsList() { return ParseUtils.parseBearings(bearings()); } + + /** + * A radius around a starting point where the routes' provider tries to avoid any + * significant maneuvers. Use this option when the vehicle is traveling at a significant + * speed to avoid dangerous maneuvers when re-routing. If a route is not found using + * the specified value, it will be ignored. Note that if a large radius is used, the routers' + * provider may ignore an important turn and return a long straight path before the first + * maneuver. + *

+ * Note: the param cannot be used with {@link #departAt()} and {@link #arriveBy()}, + * since these modes are used for reference requests, not for real-time routing. + * + * @return a radius around a starting point where router's provider tries to avoid any + * significant maneuvers. Possible range is [0, 1000] in meters. + */ + @SerializedName("avoid_maneuver_radius") + @Nullable + public abstract Integer avoidManeuverRadius(); + /** * Influences layer of road from where route starts from a waypoint. Useful in ambiguous * cases when there are multiple roads at the same point and only layer allows @@ -882,6 +901,9 @@ public URL toUrl(@NonNull String accessToken) { if (steps() != null) { sb.append(String.format("&steps=%s", steps())); } + if (avoidManeuverRadius() != null) { + sb.append(String.format("&avoid_maneuver_radius=%s", avoidManeuverRadius())); + } if (bearings() != null) { sb.append(String.format("&bearings=%s", bearings())); } @@ -1178,6 +1200,25 @@ public Builder bearingsList(@Nullable List bearings) { return this; } + /** + * A radius around a starting point where the routes' provider tries to avoid any + * significant maneuvers. Use this option when the vehicle is traveling at a significant + * speed to avoid dangerous maneuvers when re-routing. If a route is not found using + * the specified value, it will be ignored. Note that if a large radius is used, the routers' + * provider may ignore an important turn and return a long straight path before the first + * maneuver. + *

+ * Note: the param cannot be used with {@link #departAt(String)} and {@link #arriveBy(String)}, + * since these modes are used for reference requests, not for real-time routing. + * + * @param avoidManeuverRadius avoid maneuver radius, in meters. Possible range is [0, 1000]. + * @return this builder for chaining options together + */ + @NonNull + public abstract Builder avoidManeuverRadius( + @Nullable Integer avoidManeuverRadius + ); + /** * Influences layer of road from where route starts from a waypoint. Useful in ambiguous * cases when there are multiple roads at the same point and only layer allows diff --git a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java index 04874f33e..8006ce1d4 100644 --- a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java +++ b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java @@ -18,7 +18,7 @@ public class RouteOptionsTest extends TestUtils { * Always update this file when new option is introduced. */ private static final String ROUTE_OPTIONS_JSON = "route_options_v5.json"; - private static final String ROUTE_OPTIONS_URL = "https://api.mapbox.com/directions/v5/mapbox/driving/-122.4003312,37.7736941;-122.4187529,37.7689715;-122.4255172,37.7775835?access_token=pk.token&geometries=polyline6&alternatives=false&overview=full&radiuses=;unlimited;5.1&steps=true&bearings=0,90;90,0;&layers=-42;;0&continue_straight=false&annotations=congestion,distance,duration&language=ru&roundabout_exits=false&voice_instructions=true&banner_instructions=true&voice_units=metric&exclude=toll,ferry&include=hot,hov2&approaches=;curb;&waypoints=0;1;2&waypoint_names=;two;&waypoint_targets=;12.2,21.2;&enable_refresh=true&walking_speed=5.11&walkway_bias=-0.2&alley_bias=0.75&snapping_include_closures=;false;true&arrive_by=2021-01-01'T'01:01&depart_at=2021-02-02'T'02:02&max_height=1.5&max_width=1.4&metadata=true"; + private static final String ROUTE_OPTIONS_URL = "https://api.mapbox.com/directions/v5/mapbox/driving/-122.4003312,37.7736941;-122.4187529,37.7689715;-122.4255172,37.7775835?access_token=pk.token&geometries=polyline6&alternatives=false&overview=full&radiuses=;unlimited;5.1&steps=true&avoid_maneuver_radius=200&bearings=0,90;90,0;&layers=-42;;0&continue_straight=false&annotations=congestion,distance,duration&language=ru&roundabout_exits=false&voice_instructions=true&banner_instructions=true&voice_units=metric&exclude=toll,ferry&include=hot,hov2&approaches=;curb;&waypoints=0;1;2&waypoint_names=;two;&waypoint_targets=;12.2,21.2;&enable_refresh=true&walking_speed=5.11&walkway_bias=-0.2&alley_bias=0.75&snapping_include_closures=;false;true&arrive_by=2021-01-01'T'01:01&depart_at=2021-02-02'T'02:02&max_height=1.5&max_width=1.4&metadata=true"; private static final String ACCESS_TOKEN = "pk.token"; private final String optionsJson = loadJsonFixture(ROUTE_OPTIONS_JSON); @@ -435,6 +435,7 @@ private RouteOptions routeOptions() { .alternatives(false) .annotations("congestion,distance,duration") .bearings("0,90;90,0;") + .avoidManeuverRadius(200) .layers("-42;;0") .continueStraight(false) .exclude(DirectionsCriteria.EXCLUDE_TOLL + "," + DirectionsCriteria.EXCLUDE_FERRY) @@ -490,6 +491,7 @@ private RouteOptions routeOptionsList() { add(Bearing.builder().angle(90.0).degrees(0.0).build()); add(null); }}) + .avoidManeuverRadius(200) .layersList(new ArrayList() {{ add(-42); add(null); diff --git a/services-directions-models/src/test/resources/route_options_v5.json b/services-directions-models/src/test/resources/route_options_v5.json index ea3ddcd1c..8a96bc225 100644 --- a/services-directions-models/src/test/resources/route_options_v5.json +++ b/services-directions-models/src/test/resources/route_options_v5.json @@ -7,6 +7,7 @@ "language": "ru", "radiuses": ";unlimited;5.1", "bearings": "0,90;90,0;", + "avoid_maneuver_radius": 200, "layers": "-42;;0", "continue_straight": false, "roundabout_exits": false, diff --git a/services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsService.java b/services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsService.java index 332c7945a..92e9371a3 100644 --- a/services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsService.java +++ b/services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsService.java @@ -31,6 +31,7 @@ interface DirectionsService { * @param radiuses {@link RouteOptions#radiuses()} * @param steps {@link RouteOptions#steps()} * @param bearings {@link RouteOptions#bearings()} + * @param avoidManeuverRadius {@link RouteOptions#avoidManeuverRadius()} * @param layers {@link RouteOptions#layers()} * @param continueStraight {@link RouteOptions#continueStraight()} * @param annotations {@link RouteOptions#annotations()} @@ -70,6 +71,7 @@ Call getCall( @Query("radiuses") String radiuses, @Query("steps") Boolean steps, @Query("bearings") String bearings, + @Query("avoid_maneuver_radius") Integer avoidManeuverRadius, @Query("layers") String layers, @Query("continue_straight") Boolean continueStraight, @Query("annotations") String annotations, @@ -110,6 +112,7 @@ Call getCall( * @param radiuses {@link RouteOptions#radiuses()} * @param steps {@link RouteOptions#steps()} * @param bearings {@link RouteOptions#bearings()} + * @param avoidManeuverRadius {@link RouteOptions#avoidManeuverRadius()} * @param layers {@link RouteOptions#layers()} * @param continueStraight {@link RouteOptions#continueStraight()} * @param annotations {@link RouteOptions#annotations()} @@ -150,6 +153,7 @@ Call postCall( @Field("radiuses") String radiuses, @Field("steps") Boolean steps, @Field("bearings") String bearings, + @Query("avoid_maneuver_radius") Integer avoidManeuverRadius, @Field("layers") String layers, @Field("continue_straight") Boolean continueStraight, @Field("annotations") String annotations, diff --git a/services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java b/services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java index 2426e4d3a..97743859e 100644 --- a/services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java +++ b/services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java @@ -86,6 +86,7 @@ private Call get() { routeOptions().radiuses(), routeOptions().steps(), routeOptions().bearings(), + routeOptions().avoidManeuverRadius(), routeOptions().layers(), routeOptions().continueStraight(), routeOptions().annotations(), @@ -126,6 +127,7 @@ private Call post() { routeOptions().radiuses(), routeOptions().steps(), routeOptions().bearings(), + routeOptions().avoidManeuverRadius(), routeOptions().layers(), routeOptions().continueStraight(), routeOptions().annotations(),