Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 49c4df0617 | |||
| db869786a4 | |||
| a3a46c20c4 | |||
| 9500facd9c | |||
| 615e015700 | |||
| 02922ecf5e | |||
| bae1b9c5e2 | |||
| 4c35352707 | |||
| c362a3d46d | |||
| 293a7177d0 | |||
| 8af54ffe83 | |||
| 253c2dc570 | |||
| 0c6bb534fd | |||
| 2d02fad09b | |||
| 361e6b998f |
@@ -1,3 +1,13 @@
|
|||||||
|
# 5.9.2
|
||||||
|
- API:
|
||||||
|
- `annotations=durations,weights,speeds` values no longer include turn penalty values ([#4330](https://github.com/Project-OSRM/osrm-backend/issues/4330))
|
||||||
|
|
||||||
|
# 5.9.1
|
||||||
|
- Changes from 5.9.0:
|
||||||
|
- #4322: Deprecated `UseLane`. Use the intersections array if you require lanes between steps
|
||||||
|
- #4321: Fixes a potential crash in the MLD alternative code path when not even a shortest path can be found
|
||||||
|
- #4324: STXXL is not required by default
|
||||||
|
|
||||||
# 5.9.0
|
# 5.9.0
|
||||||
- Changes from 5.8:
|
- Changes from 5.8:
|
||||||
- Algorithm:
|
- Algorithm:
|
||||||
|
|||||||
+2
-2
@@ -21,7 +21,7 @@ option(BUILD_PACKAGE "Build OSRM package" OFF)
|
|||||||
option(ENABLE_ASSERTIONS "Use assertions in release mode" OFF)
|
option(ENABLE_ASSERTIONS "Use assertions in release mode" OFF)
|
||||||
option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF)
|
option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF)
|
||||||
option(ENABLE_SANITIZER "Use memory sanitizer for Debug build" OFF)
|
option(ENABLE_SANITIZER "Use memory sanitizer for Debug build" OFF)
|
||||||
option(ENABLE_STXXL "Use STXXL library" ON)
|
option(ENABLE_STXXL "Use STXXL library" OFF)
|
||||||
option(ENABLE_LTO "Use LTO if available" OFF)
|
option(ENABLE_LTO "Use LTO if available" OFF)
|
||||||
option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF)
|
option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF)
|
||||||
option(ENABLE_GOLD_LINKER "Use GNU gold linker if available" ON)
|
option(ENABLE_GOLD_LINKER "Use GNU gold linker if available" ON)
|
||||||
@@ -56,7 +56,7 @@ endif()
|
|||||||
project(OSRM C CXX)
|
project(OSRM C CXX)
|
||||||
set(OSRM_VERSION_MAJOR 5)
|
set(OSRM_VERSION_MAJOR 5)
|
||||||
set(OSRM_VERSION_MINOR 9)
|
set(OSRM_VERSION_MINOR 9)
|
||||||
set(OSRM_VERSION_PATCH 0)
|
set(OSRM_VERSION_PATCH 2)
|
||||||
set(OSRM_VERSION "${OSRM_VERSION_MAJOR}.${OSRM_VERSION_MINOR}.${OSRM_VERSION_PATCH}")
|
set(OSRM_VERSION "${OSRM_VERSION_MAJOR}.${OSRM_VERSION_MINOR}.${OSRM_VERSION_PATCH}")
|
||||||
|
|
||||||
add_definitions(-DOSRM_PROJECT_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
|
add_definitions(-DOSRM_PROJECT_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
|||||||
+3
-3
@@ -539,10 +539,10 @@ Annotation of the whole route leg with fine-grained information about each segme
|
|||||||
**Properties**
|
**Properties**
|
||||||
|
|
||||||
- `distance`: The distance, in metres, between each pair of coordinates
|
- `distance`: The distance, in metres, between each pair of coordinates
|
||||||
- `duration`: The duration between each pair of coordinates, in seconds
|
- `duration`: The duration between each pair of coordinates, in seconds. Does not include the duration of any turns.
|
||||||
- `datasources`: The index of the datasource for the speed between each pair of coordinates. `0` is the default profile, other values are supplied via `--segment-speed-file` to `osrm-contract`
|
- `datasources`: The index of the datasource for the speed between each pair of coordinates. `0` is the default profile, other values are supplied via `--segment-speed-file` to `osrm-contract`
|
||||||
- `nodes`: The OSM node ID for each coordinate along the route, excluding the first/last user-supplied coordinates
|
- `nodes`: The OSM node ID for each coordinate along the route, excluding the first/last user-supplied coordinates
|
||||||
- `weight`: The weights between each pair of coordinates
|
- `weight`: The weights between each pair of coordinates. Does not include any turn costs.
|
||||||
- `speed`: Convenience field, calculation of `distance / duration` rounded to one decimal place
|
- `speed`: Convenience field, calculation of `distance / duration` rounded to one decimal place
|
||||||
|
|
||||||
#### Example
|
#### Example
|
||||||
@@ -655,7 +655,7 @@ step.
|
|||||||
| `off ramp` | take a ramp to exit a highway (direction given my `modifier`) |
|
| `off ramp` | take a ramp to exit a highway (direction given my `modifier`) |
|
||||||
| `fork` | take the left/right side at a fork depending on `modifier` |
|
| `fork` | take the left/right side at a fork depending on `modifier` |
|
||||||
| `end of road` | road ends in a T intersection turn in direction of `modifier`|
|
| `end of road` | road ends in a T intersection turn in direction of `modifier`|
|
||||||
| `use lane` | going straight on a specific lane |
|
| `use lane` | **Deprecated** replaced by lanes on all intersection entries |
|
||||||
| `continue` | Turn in direction of `modifier` to stay on the same road |
|
| `continue` | Turn in direction of `modifier` to stay on the same road |
|
||||||
| `roundabout` | traverse roundabout, has additional property `exit` with NR if the roundabout is left. The modifier specifies the direction of entering the roundabout. |
|
| `roundabout` | traverse roundabout, has additional property `exit` with NR if the roundabout is left. The modifier specifies the direction of entering the roundabout. |
|
||||||
| `rotary` | a traffic circle. While very similar to a larger version of a roundabout, it does not necessarily follow roundabout rules for right of way. It can offer `rotary_name` and/or `rotary_pronunciation` parameters (located in the RouteStep object) in addition to the `exit` parameter (located on the StepManeuver object). |
|
| `rotary` | a traffic circle. While very similar to a larger version of a roundabout, it does not necessarily follow roundabout rules for right of way. It can offer `rotary_name` and/or `rotary_pronunciation` parameters (located in the RouteStep object) in addition to the `exit` parameter (located on the StepManeuver object). |
|
||||||
|
|||||||
@@ -26,6 +26,12 @@ var osrm = new OSRM('network.osrm');
|
|||||||
- `options.shared_memory` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Connects to the persistent shared memory datastore.
|
- `options.shared_memory` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Connects to the persistent shared memory datastore.
|
||||||
This requires you to run `osrm-datastore` prior to creating an `OSRM` object.
|
This requires you to run `osrm-datastore` prior to creating an `OSRM` object.
|
||||||
- `options.path` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** The path to the `.osrm` files. This is mutually exclusive with setting {options.shared_memory} to true.
|
- `options.path` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** The path to the `.osrm` files. This is mutually exclusive with setting {options.shared_memory} to true.
|
||||||
|
- `options.max_locations_trip` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. locations supported in trip query (default: unlimited).
|
||||||
|
- `options.max_locations_viaroute` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. locations supported in viaroute query 9default: unlimited).
|
||||||
|
- `options.max_locations_distance_table` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. locations supported in distance table query (default: unlimited).
|
||||||
|
- `options.max_locations_map_matching` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. locations supported in map matching query (default: unlimited).
|
||||||
|
- `options.max_results_nearest` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. results supported in nearest query (default: unlimited).
|
||||||
|
- `options.max_alternatives` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. number of alternative routes supported (default: 3).
|
||||||
|
|
||||||
### route
|
### route
|
||||||
|
|
||||||
|
|||||||
@@ -35,10 +35,10 @@ Feature: Turn Lane Guidance
|
|||||||
| restriction | bc | cd | c | no_right_turn |
|
| restriction | bc | cd | c | no_right_turn |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,e | in,cross,cross | depart,turn left,arrive | ,left:true straight:false, |
|
| a,e | in,cross,cross | depart,turn left,arrive | ;,left:true straight:false, |
|
||||||
| a,g | in,straight,straight | depart,new name straight,arrive | ,left:false straight:true, |
|
| a,g | in,straight,straight | depart,new name straight,arrive | ;,left:false straight:true, |
|
||||||
| a,f | in,cross,cross | depart,continue right,arrive | ,, |
|
| a,f | in,cross,cross | depart,continue right,arrive | ,;right:true, |
|
||||||
|
|
||||||
@sliproads
|
@sliproads
|
||||||
Scenario: Separate Turn Lanes
|
Scenario: Separate Turn Lanes
|
||||||
@@ -68,10 +68,10 @@ Feature: Turn Lane Guidance
|
|||||||
| restriction | bc | cd | c | no_right_turn |
|
| restriction | bc | cd | c | no_right_turn |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,e | in,cross,cross | depart,turn left,arrive | ,left:true straight:false right:false, |
|
| a,e | in,cross,cross | depart,turn left,arrive | ;,left:true straight:false right:false, |
|
||||||
| a,g | in,straight,straight | depart,new name straight,arrive | ,left:false straight:true right:false, |
|
| a,g | in,straight,straight | depart,new name straight,arrive | ;,left:false straight:true right:false, |
|
||||||
| a,f | in,cross,cross | depart,turn right,arrive | ,left:false straight:false right:true, |
|
| a,f | in,cross,cross | depart,turn right,arrive | ,left:false straight:false right:true;left:false straight:false right:true, |
|
||||||
|
|
||||||
|
|
||||||
@sliproads
|
@sliproads
|
||||||
@@ -109,12 +109,12 @@ Feature: Turn Lane Guidance
|
|||||||
| restriction | bc | cd | c | no_right_turn |
|
| restriction | bc | cd | c | no_right_turn |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,e | in,cross,cross | depart,turn left,arrive | ,left:true straight:false right:false, |
|
| a,e | in,cross,cross | depart,turn left,arrive | ;,left:true straight:false right:false, |
|
||||||
| a,g | in,straight,straight | depart,new name straight,arrive | ,left:false straight:true right:false, |
|
| a,g | in,straight,straight | depart,new name straight,arrive | ;,left:false straight:true right:false, |
|
||||||
| a,f | in,cross,cross | depart,turn right,arrive | ,left:false straight:false right:true, |
|
| a,f | in,cross,cross | depart,turn right,arrive | ,left:false straight:false right:true;left:false straight:false right:true, |
|
||||||
| a,j | in,turn,other,other | depart,turn right,turn left,arrive | ,,left:true right:false, |
|
| a,j | in,turn,other,other | depart,turn right,turn left,arrive | ,,left:true right:false, |
|
||||||
| a,i | in,turn,other,other | depart,turn right,turn right,arrive | ,,left:false right:true, |
|
| a,i | in,turn,other,other | depart,turn right,turn right,arrive | ,,left:false right:true, |
|
||||||
|
|
||||||
|
|
||||||
@todo @2654 @none
|
@todo @2654 @none
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Feature: Turn Lane Guidance
|
|||||||
|
|
||||||
Background:
|
Background:
|
||||||
Given the profile "car"
|
Given the profile "car"
|
||||||
Given a grid size of 20 meters
|
Given a grid size of 100 meters
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: Anticipate Lane Change for subsequent multi-lane intersections
|
Scenario: Anticipate Lane Change for subsequent multi-lane intersections
|
||||||
@@ -151,9 +151,9 @@ Feature: Turn Lane Guidance
|
|||||||
| cj | | 1 | motorway_link | yes | xbcj |
|
| cj | | 1 | motorway_link | yes | xbcj |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,i | ab,ci,ci | depart,turn slight right,arrive | ,none:false slight right:true, |
|
| a,i | ab,ci,ci | depart,turn slight right,arrive | ;,none:false slight right:true, |
|
||||||
| a,j | ab,xbcj | depart,arrive | , |
|
| a,j | ab,xbcj | depart,arrive | ;;none:true slight right:false, |
|
||||||
|
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
@@ -308,8 +308,8 @@ Feature: Turn Lane Guidance
|
|||||||
| di | | off | | yes |
|
| di | | off | | yes |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | destinations | lanes | locations |
|
| waypoints | route | turns | destinations | locations | lanes |
|
||||||
| a,e | main,main,main | depart,use lane straight,arrive | One,Two,Three | ,left:false straight:false straight:true straight:false right:false, | a,c,e |
|
| a,e | main,main | depart,arrive | One,Three | a,e | ;left:false straight:false straight:true straight:false right:false;left:false straight:true right:false, |
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: Anticipate Lanes for through and collapse multiple use lanes
|
Scenario: Anticipate Lanes for through and collapse multiple use lanes
|
||||||
@@ -335,9 +335,9 @@ Feature: Turn Lane Guidance
|
|||||||
| dj | | off |
|
| dj | | off |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,c | main,main | depart,arrive | , |
|
| a,c | main,main | depart,arrive | ;left:false straight:true straight:true right:false, |
|
||||||
| a,d | main,main | depart,arrive | , |
|
| a,d | main,main | depart,arrive | ;left:false straight:true straight:true right:false;left:false straight:true straight:true right:false, |
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: Anticipate Lanes for through followed by left/right
|
Scenario: Anticipate Lanes for through followed by left/right
|
||||||
@@ -363,17 +363,17 @@ Feature: Turn Lane Guidance
|
|||||||
| ci | | off |
|
| ci | | off |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,d | main,main,main,left,left | depart,use lane straight,use lane straight,turn left,arrive | ,left:false straight:false straight:true straight:false straight:false right:false,left:false straight:true straight:false right:false,left:true right:false, |
|
| a,d | main,left,left | depart,end of road left,arrive | ;left:false straight:false straight:true straight:false straight:false right:false;left:false straight:true straight:false right:false,left:true right:false, |
|
||||||
| a,e | main,main,main,right,right | depart,use lane straight,use lane straight,turn right,arrive | ,left:false straight:false straight:false straight:true straight:false right:false,left:false straight:false straight:true right:false,left:false right:true, |
|
| a,e | main,right,right | depart,end of road right,arrive | ;left:false straight:false straight:false straight:true straight:false right:false;left:false straight:false straight:true right:false,left:false right:true, |
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: Anticipate Lanes for through with turn before / after
|
Scenario: Anticipate Lanes for through with turn before / after
|
||||||
Given the node map
|
Given the node map
|
||||||
"""
|
"""
|
||||||
c g l
|
c g l
|
||||||
b – d – e – h - i
|
b d e h i
|
||||||
a f j
|
a f j
|
||||||
"""
|
"""
|
||||||
|
|
||||||
And the ways
|
And the ways
|
||||||
@@ -390,15 +390,15 @@ Feature: Turn Lane Guidance
|
|||||||
| il | | il | |
|
| il | | il | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes | # |
|
| waypoints | route | turns | lanes | # |
|
||||||
| a,f | ab,bdehi,ef,ef | depart,turn right,turn right,arrive | ,right:false right:false right:true right:true,left:false left:false straight:false straight:false straight:false straight:false right:true right:true, | |
|
| a,f | ab,bdehi,ef,ef | depart,turn right,turn right,arrive | ,right:false right:false right:true right:true,left:false left:false straight:false straight:false straight:false straight:false right:true right:true, | |
|
||||||
| a,g | ab,bdehi,eg,eg | depart,turn right,turn left,arrive | ,right:true right:true right:false right:false,left:true left:true straight:false straight:false straight:false straight:false right:false right:false, | |
|
| a,g | ab,bdehi,eg,eg | depart,turn right,turn left,arrive | ,right:true right:true right:false right:false,left:true left:true straight:false straight:false straight:false straight:false right:false right:false, | |
|
||||||
| a,j | ab,bdehi,bdehi,ij,ij | depart,turn right,use lane straight,turn right,arrive | ,right:true right:true right:false right:false,left:false left:false straight:false straight:false straight:true straight:true right:false right:false,left:false left:false right:true right:true, | |
|
| a,j | ab,bdehi,ij,ij | depart,turn right,end of road right,arrive | ,right:true right:true right:false right:false;left:false left:false straight:false straight:false straight:true straight:true right:false right:false,left:false left:false right:true right:true, | |
|
||||||
| a,l | ab,bdehi,bdehi,il,il | depart,turn right,use lane straight,turn left,arrive | ,right:false right:false right:true right:true,left:false left:false straight:true straight:true straight:false straight:false right:false right:false,left:true left:true right:false right:false, | not perfect |
|
| a,l | ab,bdehi,il,il | depart,turn right,end of road left,arrive | ,right:false right:false right:true right:true;left:false left:false straight:true straight:true straight:false straight:false right:false right:false,left:true left:true right:false right:false, | not perfect |
|
||||||
| c,g | cb,bdehi,eg,eg | depart,turn left,turn left,arrive | ,left:true left:true left:false left:false,left:true left:true straight:false straight:false straight:false straight:false right:false right:false, | |
|
| c,g | cb,bdehi,eg,eg | depart,turn left,turn left,arrive | ,left:true left:true left:false left:false,left:true left:true straight:false straight:false straight:false straight:false right:false right:false, | |
|
||||||
| c,f | cb,bdehi,ef,ef | depart,turn left,turn right,arrive | ,left:false left:false left:true left:true,left:false left:false straight:false straight:false straight:false straight:false right:true right:true, | |
|
| c,f | cb,bdehi,ef,ef | depart,turn left,turn right,arrive | ,left:false left:false left:true left:true,left:false left:false straight:false straight:false straight:false straight:false right:true right:true, | |
|
||||||
| c,l | cb,bdehi,bdehi,il,il | depart,turn left,use lane straight,turn left,arrive | ,left:false left:false left:true left:true,left:false left:false straight:true straight:true straight:false straight:false right:false right:false,left:true left:true right:false right:false, | |
|
| c,l | cb,bdehi,il,il | depart,turn left,end of road left,arrive | ,left:false left:false left:true left:true;left:false left:false straight:true straight:true straight:false straight:false right:false right:false,left:true left:true right:false right:false, | |
|
||||||
| c,j | cb,bdehi,bdehi,ij,ij | depart,turn left,use lane straight,turn right,arrive | ,left:true left:true left:false left:false,left:false left:false straight:false straight:false straight:true straight:true right:false right:false,left:false left:false right:true right:true, | not perfect |
|
| c,j | cb,bdehi,ij,ij | depart,turn left,end of road right,arrive | ,left:true left:true left:false left:false;left:false left:false straight:false straight:false straight:true straight:true right:false right:false,left:false left:false right:true right:true, | not perfect |
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: Anticipate Lanes for turns with through before and after
|
Scenario: Anticipate Lanes for turns with through before and after
|
||||||
@@ -431,11 +431,11 @@ Feature: Turn Lane Guidance
|
|||||||
| jk | | bot | primary | yes |
|
| jk | | bot | primary | yes |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,i | top,main,main,top,top | depart,turn right,use lane straight,turn left,arrive | ,straight:false right:false right:true right:true,left:false straight:true straight:true straight:false straight:false right:false,left:true left:true right:false right:false, |
|
| a,i | top,main,top,top | depart,turn right,turn left,arrive | ,straight:false right:true right:true right:true;;left:false straight:true straight:true straight:false straight:false right:false,left:true left:true right:false right:false, |
|
||||||
| a,k | top,main,main,bot,bot | depart,turn right,use lane straight,turn right,arrive | ,straight:false right:true right:true right:false,left:false straight:false straight:false straight:true straight:true right:false,left:false left:false right:true right:true, |
|
| a,k | top,main,bot,bot | depart,turn right,turn right,arrive | ,straight:false right:true right:true right:true;;left:false straight:false straight:false straight:true straight:true right:false,left:false left:false right:true right:true, |
|
||||||
| c,i | bot,main,main,top,top | depart,turn left,use lane straight,turn left,arrive | ,left:false left:true left:true straight:false,left:false straight:true straight:true straight:false straight:false right:false,left:true left:true right:false right:false, |
|
| c,i | bot,main,top,top | depart,turn left,turn left,arrive | ,left:true left:true left:true straight:false;;left:false straight:true straight:true straight:false straight:false right:false,left:true left:true right:false right:false, |
|
||||||
| c,k | bot,main,main,bot,bot | depart,turn left,use lane straight,turn right,arrive | ,left:true left:true left:false straight:false,left:false straight:false straight:false straight:true straight:true right:false,left:false left:false right:true right:true, |
|
| c,k | bot,main,bot,bot | depart,turn left,turn right,arrive | ,left:true left:true left:true straight:false;;left:false straight:false straight:false straight:true straight:true right:false,left:false left:false right:true right:true, |
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: Anticipate Lanes for turn between throughs
|
Scenario: Anticipate Lanes for turn between throughs
|
||||||
@@ -462,8 +462,8 @@ Feature: Turn Lane Guidance
|
|||||||
| dt | | off |
|
| dt | | off |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,e | main,main,main,main | depart,use lane straight,continue right,arrive | ,left:false straight:false straight:false straight:false straight:true straight:true right:false,straight:false straight:false right:false right:true right:true, |
|
| a,e | main,main,main | depart,continue right,arrive | ;left:false straight:false straight:false straight:false straight:true straight:true right:false,straight:false straight:false right:false right:true right:true;left:false straight:true straight:true, |
|
||||||
|
|
||||||
@anticipate @todo @2661
|
@anticipate @todo @2661
|
||||||
Scenario: Anticipate with lanes in roundabout: roundabouts as the unit of anticipation
|
Scenario: Anticipate with lanes in roundabout: roundabouts as the unit of anticipation
|
||||||
@@ -520,8 +520,8 @@ Feature: Turn Lane Guidance
|
|||||||
| df | | primary | |
|
| df | | primary | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes | intersection_lanes |
|
||||||
| a,f | ab,df,df | depart,roundabout-exit-1,use lane slight right,arrive | ,,slight left:false slight left:false slight right:true, |
|
| a,f | ab,df,df | depart,roundabout-exit-1,arrive | ,, | |
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: No Lanes for Roundabouts, see #2626
|
Scenario: No Lanes for Roundabouts, see #2626
|
||||||
@@ -553,8 +553,8 @@ Feature: Turn Lane Guidance
|
|||||||
| fy | | primary | |
|
| fy | | primary | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,h | ab,gh,gh | depart,roundabout-exit-5,arrive | ,, |
|
| a,h | ab,gh,gh | depart,roundabout-exit-5,arrive | ,;;;;;, |
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: No Lanes for Roundabouts, see #2626
|
Scenario: No Lanes for Roundabouts, see #2626
|
||||||
@@ -576,9 +576,9 @@ Feature: Turn Lane Guidance
|
|||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| x,y | xb,dy,dy | depart,roundabout-exit-1,arrive | ,, |
|
| x,y | xb,dy,dy | depart,roundabout-exit-1,arrive | ,;, |
|
||||||
| x,c | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,, |
|
| x,c | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,, |
|
||||||
| x,a | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,, |
|
| x,a | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,;, |
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: No Lanes for Roundabouts, see #2626
|
Scenario: No Lanes for Roundabouts, see #2626
|
||||||
@@ -614,8 +614,8 @@ Feature: Turn Lane Guidance
|
|||||||
| fy | | primary | |
|
| fy | | primary | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,h | ab,ch,ch | depart,roundabout-exit-5,arrive | ,, |
|
| a,h | ab,ch,ch | depart,roundabout-exit-5,arrive | ,;;;;;, |
|
||||||
|
|
||||||
@anticipate
|
@anticipate
|
||||||
Scenario: No Lanes for Roundabouts, see #2626
|
Scenario: No Lanes for Roundabouts, see #2626
|
||||||
@@ -623,40 +623,11 @@ Feature: Turn Lane Guidance
|
|||||||
"""
|
"""
|
||||||
/a\
|
/a\
|
||||||
x – b d – y
|
x – b d – y
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
| |
|
||||||
| |
|
| |
|
||||||
| |
|
| |
|
||||||
| |
|
| |
|
||||||
| |
|
\ /
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
c
|
c
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -671,9 +642,9 @@ Feature: Turn Lane Guidance
|
|||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| x,y | xb,dy,dy | depart,roundabout-exit-1,arrive | ,, |
|
| x,y | xb,dy,dy | depart,roundabout-exit-1,arrive | ,;, |
|
||||||
| x,c | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,, |
|
| x,c | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,, |
|
||||||
| x,a | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,, |
|
| x,a | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,;, |
|
||||||
|
|
||||||
@anticipate @todo @2032
|
@anticipate @todo @2032
|
||||||
Scenario: No Lanes for Roundabouts, see #2626
|
Scenario: No Lanes for Roundabouts, see #2626
|
||||||
@@ -789,13 +760,6 @@ Feature: Turn Lane Guidance
|
|||||||
Given the node map
|
Given the node map
|
||||||
"""
|
"""
|
||||||
a – b – x
|
a – b – x
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
||||||
|
|
|
|
||||||
|
|
|
|
||||||
|
|
|
|
||||||
@@ -823,11 +787,9 @@ Feature: Turn Lane Guidance
|
|||||||
Scenario: Don't Overdo It
|
Scenario: Don't Overdo It
|
||||||
Given the node map
|
Given the node map
|
||||||
"""
|
"""
|
||||||
q r s t u v
|
q r s t u v
|
||||||
| | | | | |
|
a - - b - - c - - d - - e - - f - g - h - i
|
||||||
a - - - - - - - - - - b - - - - - - - - - - c - - - - - - - - - - d - - - - - - - - - - e - - - - - - - - - - f - - - - - - - - - - g - h - i
|
p o n m l k j
|
||||||
| | | | | | |
|
|
||||||
p o n m l k j
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
And the ways
|
And the ways
|
||||||
@@ -849,6 +811,6 @@ Feature: Turn Lane Guidance
|
|||||||
| hj | 7th | | no |
|
| hj | 7th | | no |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | locations | lanes |
|
| waypoints | route | turns | locations | lanes |
|
||||||
| a,i | road,road,road | depart,use lane straight,arrive | a,g,i | ,left:false none:true none:true none:false, |
|
| a,i | road,road | depart,arrive | a,i | ;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:false;none:true none:true right:false, |
|
||||||
| a,j | road,road,7th,7th | depart,use lane straight,turn right,arrive | a,f,h,j | ,left:false none:false none:false none:true,none:false none:false right:true, |
|
| a,j | road,7th,7th | depart,turn right,arrive | a,h,j | ;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:false none:false none:true;left:false none:false none:false none:true,none:false none:false right:true, |
|
||||||
|
|||||||
@@ -807,8 +807,8 @@ Feature: Collapse
|
|||||||
| di | | off |
|
| di | | off |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | locations |
|
| waypoints | route | turns | locations | lanes |
|
||||||
| a,e | main,main,main | depart,use lane straight,arrive | a,c,e |
|
| a,e | main,main | depart,arrive | a,e | ;left:false straight:false straight:true straight:false right:false;left:false straight:true right:false, |
|
||||||
|
|
||||||
Scenario: But _do_ collapse UseLane step when lanes stay the same
|
Scenario: But _do_ collapse UseLane step when lanes stay the same
|
||||||
Given the node map
|
Given the node map
|
||||||
|
|||||||
@@ -606,11 +606,11 @@ Feature: Basic Roundabout
|
|||||||
| ob | trunk | yes | roundabout | Europaplatz | |
|
| ob | trunk | yes | roundabout | Europaplatz | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns |
|
||||||
| a,d | ,Europastrasse,Europastrasse | depart,Europaplatz-exit-1,arrive | ,, |
|
| a,d | ,Europastrasse,Europastrasse | depart,Europaplatz-exit-1,arrive |
|
||||||
| a,h | ,Allee Cite,Allee Cite | depart,Europaplatz-exit-2,arrive | ,, |
|
| a,h | ,Allee Cite,Allee Cite | depart,Europaplatz-exit-2,arrive |
|
||||||
| a,l | ,Europastrasse,Europastrasse | depart,Europaplatz-exit-3,arrive | ,, |
|
| a,l | ,Europastrasse,Europastrasse | depart,Europaplatz-exit-3,arrive |
|
||||||
| a,p | ,, | depart,Europaplatz-exit-4,arrive | ,, |
|
| a,p | ,, | depart,Europaplatz-exit-4,arrive |
|
||||||
|
|
||||||
@turboroundabout
|
@turboroundabout
|
||||||
# http://www.openstreetmap.org/?mlat=50.180039&mlon=8.474939&zoom=16#map=19/50.17999/8.47506
|
# http://www.openstreetmap.org/?mlat=50.180039&mlon=8.474939&zoom=16#map=19/50.17999/8.47506
|
||||||
@@ -658,14 +658,14 @@ Feature: Basic Roundabout
|
|||||||
| wb | primary | yes | roundabout | | through\|through;right |
|
| wb | primary | yes | roundabout | | through\|through;right |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns |
|
||||||
| a,w | Le-Cannet-Rocheville-Strasse,, | depart,roundabout-exit-undefined,arrive | ,, |
|
| a,w | Le-Cannet-Rocheville-Strasse,, | depart,roundabout-exit-undefined,arrive |
|
||||||
| a,r | Le-Cannet-Rocheville-Strasse,, | depart,roundabout-exit-4,arrive | ,, |
|
| a,r | Le-Cannet-Rocheville-Strasse,, | depart,roundabout-exit-4,arrive |
|
||||||
| a,f | Le-Cannet-Rocheville-Strasse,Frankfurter Strasse,Frankfurter Strasse | depart,roundabout-exit-1,arrive | ,, |
|
| a,f | Le-Cannet-Rocheville-Strasse,Frankfurter Strasse,Frankfurter Strasse | depart,roundabout-exit-1,arrive |
|
||||||
| a,h | Le-Cannet-Rocheville-Strasse,Bischof-Kaller-Strasse,Bischof-Kaller-Strasse | depart,roundabout-exit-2,arrive | ,, |
|
| a,h | Le-Cannet-Rocheville-Strasse,Bischof-Kaller-Strasse,Bischof-Kaller-Strasse | depart,roundabout-exit-2,arrive |
|
||||||
| u,r | ,, | depart,roundabout-exit-5,arrive | ,, |
|
| u,r | ,, | depart,roundabout-exit-5,arrive |
|
||||||
| j,h | Bischof-Kaller-Strasse,Bischof-Kaller-Strasse,Bischof-Kaller-Strasse | depart,roundabout-exit-5,arrive | ,, |
|
| j,h | Bischof-Kaller-Strasse,Bischof-Kaller-Strasse,Bischof-Kaller-Strasse | depart,roundabout-exit-5,arrive |
|
||||||
| n,m | , | depart,arrive | , |
|
| n,m | , | depart,arrive |
|
||||||
|
|
||||||
@turboroundabout
|
@turboroundabout
|
||||||
# http://www.openstreetmap.org/?mlat=47.57723&mlon=7.796765&zoom=16#map=19/47.57720/7.79711
|
# http://www.openstreetmap.org/?mlat=47.57723&mlon=7.796765&zoom=16#map=19/47.57720/7.79711
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ Feature: Turn Lane Guidance
|
|||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,d | road,turn,turn | depart,turn right,arrive | ,straight:false right:true, |
|
| a,d | road,turn,turn | depart,turn right,arrive | ,straight:false right:true, |
|
||||||
| a,c | road,road | depart,arrive | , |
|
| a,c | road,road | depart,arrive | ;straight:true right:false, |
|
||||||
|
|
||||||
Scenario: Turn with Bus-Lane Left
|
Scenario: Turn with Bus-Lane Left
|
||||||
Given the node map
|
Given the node map
|
||||||
@@ -178,7 +178,7 @@ Feature: Turn Lane Guidance
|
|||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,d | road,turn,turn | depart,turn left,arrive | ,left:true straight:false, |
|
| a,d | road,turn,turn | depart,turn left,arrive | ,left:true straight:false, |
|
||||||
| a,c | road,road | depart,arrive | , |
|
| a,c | road,road | depart,arrive | ;left:false straight:true, |
|
||||||
|
|
||||||
# This tests whether empty/invalid PSV tags cause osrm-extract to crash
|
# This tests whether empty/invalid PSV tags cause osrm-extract to crash
|
||||||
Scenario: Turn with Bus-Lane
|
Scenario: Turn with Bus-Lane
|
||||||
@@ -248,23 +248,23 @@ Feature: Turn Lane Guidance
|
|||||||
| fl | cross | | yes |
|
| fl | cross | | yes |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes | intersection_lanes |
|
||||||
| a,j | road,cross,cross | depart,turn right,arrive | ,left:false straight:false right:true |
|
| a,j | road,cross,cross | depart,turn right,arrive | ,left:false straight:false right:true | ,left:false straight:false right:true |
|
||||||
| a,d | road,road,road | depart,use lane straight,arrive | ,left:false straight:true right:false, |
|
| a,d | road,road | depart,arrive | , | left:false straight:true right:false, |
|
||||||
| a,l | road,cross,cross | depart,turn left,arrive | ,left:true straight:false right:false, |
|
| a,l | road,cross,cross | depart,turn left,arrive | ,left:true straight:false right:false, | ,left:true straight:false right:false, |
|
||||||
| a,h | road,road,road | depart,continue uturn,arrive | ,left:true straight:false right:false, |
|
| a,h | road,road,road | depart,continue uturn,arrive | ,left:true straight:false right:false, | ,left:true straight:false right:false |
|
||||||
| k,d | cross,road,road | depart,turn right,arrive | ,left:false straight;right:true, |
|
| k,d | cross,road,road | depart,turn right,arrive | ,left:false straight;right:true, | ,left:false straight;right:true, |
|
||||||
| k,l | cross,cross,cross | depart,use lane straight,arrive | ,left:false straight;right:true, |
|
| k,l | cross,cross | depart,arrive | , | left:false straight;right:true, |
|
||||||
| k,h | cross,road,road | depart,turn left,arrive | ,left:true straight;right:false, |
|
| k,h | cross,road,road | depart,turn left,arrive | ,left:true straight;right:false, | ,left:true straight;right:false, |
|
||||||
| k,j | cross,cross,cross | depart,continue uturn,arrive | ,left:true straight;right:false, |
|
| k,j | cross,cross,cross | depart,continue uturn,arrive | ,left:true straight;right:false, | ,left:true straight;right:false, |
|
||||||
| e,l | road,cross,cross | depart,turn right,arrive | ,none:false straight:false straight;right:true, |
|
| e,l | road,cross,cross | depart,turn right,arrive | ,none:false straight:false straight;right:true, | ,none:false straight:false straight;right:true, |
|
||||||
| e,h | road,road | depart,arrive | ,none:false straight:true straight;right:true |
|
| e,h | road,road | depart,arrive | , | none:false straight:true straight;right:true, |
|
||||||
| e,j | road,cross,cross | depart,turn left,arrive | ,none:true straight:false straight;right:false, |
|
| e,j | road,cross,cross | depart,turn left,arrive | ,none:true straight:false straight;right:false, | ,none:true straight:false straight;right:false, |
|
||||||
| e,d | road,road,road | depart,continue uturn,arrive | ,none:true straight:false straight;right:false, |
|
| e,d | road,road,road | depart,continue uturn,arrive | ,none:true straight:false straight;right:false, | ,none:true straight:false straight;right:false, |
|
||||||
| i,h | cross,road,road | depart,turn right,arrive | ,, |
|
| i,h | cross,road,road | depart,turn right,arrive | ,, | |
|
||||||
| i,j | cross,cross,cross | depart,use lane straight,arrive | ,left:false straight:true, |
|
| i,j | cross,cross | depart,arrive | | left:false straight:true, |
|
||||||
| i,d | cross,road,road | depart,turn left,arrive | ,left:true straight:false, |
|
| i,d | cross,road,road | depart,turn left,arrive | ,left:true straight:false, | ,left:true straight:false, |
|
||||||
| i,l | cross,cross,cross | depart,continue uturn,arrive | ,left:true straight:false, |
|
| i,l | cross,cross,cross | depart,continue uturn,arrive | ,left:true straight:false, | ,left:true straight:false, |
|
||||||
|
|
||||||
#copy of former case to prevent further regression
|
#copy of former case to prevent further regression
|
||||||
@collapse @partition-lanes
|
@collapse @partition-lanes
|
||||||
@@ -295,13 +295,13 @@ Feature: Turn Lane Guidance
|
|||||||
| fl | cross | | yes |
|
| fl | cross | | yes |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,j | road,cross,cross | depart,turn right,arrive | ,left:false straight:false right:true, |
|
| a,j | road,cross,cross | depart,turn right,arrive | ,left:false straight:false right:true, |
|
||||||
| k,d | cross,road,road | depart,turn right,arrive | ,left:false straight;right:true, |
|
| k,d | cross,road,road | depart,turn right,arrive | ,left:false straight;right:true, |
|
||||||
| e,l | road,cross,cross | depart,turn right,arrive | ,none:false straight:false straight;right:true, |
|
| e,l | road,cross,cross | depart,turn right,arrive | ,none:false straight:false straight;right:true, |
|
||||||
| i,h | cross,road,road | depart,turn right,arrive | ,, |
|
| i,h | cross,road,road | depart,turn right,arrive | ,, |
|
||||||
| i,j | cross,cross | depart,arrive | , |
|
| i,j | cross,cross | depart,arrive | ;;left:false straight:true, |
|
||||||
| i,l | cross,cross,cross | depart,continue uturn,arrive | ,left:true straight:false, |
|
| i,l | cross,cross,cross | depart,continue uturn,arrive | ;,left:true straight:false;left:true straight:false;left:false straight:true, |
|
||||||
|
|
||||||
@partition-lanes
|
@partition-lanes
|
||||||
Scenario: Turn Lanes at Segregated Road
|
Scenario: Turn Lanes at Segregated Road
|
||||||
@@ -347,7 +347,7 @@ Feature: Turn Lane Guidance
|
|||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,e | road,turn,turn | depart,turn right,arrive | ,none:false right:true, |
|
| a,e | road,turn,turn | depart,turn right,arrive | ,none:false right:true, |
|
||||||
| a,d | road,road | depart,arrive | , |
|
| a,d | road,road | depart,arrive | ;none:true right:false, |
|
||||||
|
|
||||||
@2654 @previous-lanes
|
@2654 @previous-lanes
|
||||||
Scenario: Turn Lanes Given earlier than actual turn
|
Scenario: Turn Lanes Given earlier than actual turn
|
||||||
@@ -368,11 +368,11 @@ Feature: Turn Lane Guidance
|
|||||||
| hk | second-turn | | |
|
| hk | second-turn | | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,k | road,second-turn,second-turn | depart,turn right,arrive | ,none:false right:true, |
|
| a,k | road,second-turn,second-turn | depart,turn right,arrive | ;,none:false right:true, |
|
||||||
| a,i | road,road | depart,arrive | , |
|
| a,i | road,road | depart,arrive | ;;none:true right:false, |
|
||||||
| i,j | road,first-turn,first-turn | depart,turn left,arrive | ,left:true none:false, |
|
| i,j | road,first-turn,first-turn | depart,turn left,arrive | ;,left:true none:false, |
|
||||||
| i,a | road,road | depart,arrive | , |
|
| i,a | road,road | depart,arrive | ;;left:false none:true, |
|
||||||
|
|
||||||
@previous-lanes
|
@previous-lanes
|
||||||
Scenario: Passing a one-way street
|
Scenario: Passing a one-way street
|
||||||
@@ -390,8 +390,8 @@ Feature: Turn Lane Guidance
|
|||||||
| cf | turn | | |
|
| cf | turn | | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,f | road,turn,turn | depart,turn left,arrive | ,left:true straight:false, |
|
| a,f | road,turn,turn | depart,turn left,arrive | ;left:true straight:false,left:true straight:false, |
|
||||||
|
|
||||||
@partition-lanes
|
@partition-lanes
|
||||||
Scenario: Passing a one-way street, partly pulled back lanes
|
Scenario: Passing a one-way street, partly pulled back lanes
|
||||||
@@ -411,10 +411,10 @@ Feature: Turn Lane Guidance
|
|||||||
| bg | right | | no |
|
| bg | right | | no |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,f | road,turn,turn | depart,turn left,arrive | ,left:true straight;right:false, |
|
| a,f | road,turn,turn | depart,turn left,arrive | ;left:true straight;right:false,left:true straight;right:false, |
|
||||||
| a,d | road,road | depart,arrive | , |
|
| a,d | road,road | depart,arrive | ;left:false straight;right:true;left:false straight;right:true, |
|
||||||
| a,g | road,right,right | depart,turn right,arrive | ,left:false straight;right:true, |
|
| a,g | road,right,right | depart,turn right,arrive | ,left:false straight;right:true, |
|
||||||
|
|
||||||
@partition-lanes @previous-lanes
|
@partition-lanes @previous-lanes
|
||||||
Scenario: Passing a one-way street, partly pulled back lanes, no through
|
Scenario: Passing a one-way street, partly pulled back lanes, no through
|
||||||
@@ -434,9 +434,9 @@ Feature: Turn Lane Guidance
|
|||||||
| bg | right | | no |
|
| bg | right | | no |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,f | road,turn,turn | depart,turn left,arrive | ,left:true right:false, |
|
| a,f | road,turn,turn | depart,turn left,arrive | ,left:true right:false;left:true right:false, |
|
||||||
| a,g | road,right,right | depart,turn right,arrive | ,left:false right:true, |
|
| a,g | road,right,right | depart,turn right,arrive | ,left:false right:true, |
|
||||||
|
|
||||||
@todo @partition-lanes @previous-lanes
|
@todo @partition-lanes @previous-lanes
|
||||||
Scenario: Narrowing Turn Lanes
|
Scenario: Narrowing Turn Lanes
|
||||||
@@ -484,7 +484,7 @@ Feature: Turn Lane Guidance
|
|||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,d | road,road | depart,arrive | , |
|
| a,d | road,road | depart,arrive | ;straight:true right:false, |
|
||||||
| a,e | road,turn,turn | depart,turn right,arrive | ,straight:false right:true, |
|
| a,e | road,turn,turn | depart,turn right,arrive | ,straight:false right:true, |
|
||||||
|
|
||||||
@todo @roundabout
|
@todo @roundabout
|
||||||
@@ -554,9 +554,9 @@ Feature: Turn Lane Guidance
|
|||||||
| restriction | bc | dc | c | no_right_turn |
|
| restriction | bc | dc | c | no_right_turn |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,g | road,cross,cross | depart,turn left,arrive | ,left:true left:true straight:false straight:false right:false, |
|
| a,g | road,cross,cross | depart,turn left,arrive | ,left:true left:true straight:false straight:false right:false;left:true left:true straight:false straight:false right:false, |
|
||||||
| a,e | road,road | depart,arrive | , |
|
| a,e | road,road | depart,arrive | ;left:false left:false straight:true straight:true right:false;left:false left:false straight:true straight:true right:false, |
|
||||||
|
|
||||||
#NEEDS TO BE INVESTIGATED. Turn restriction shouldn't be here. See #2867
|
#NEEDS TO BE INVESTIGATED. Turn restriction shouldn't be here. See #2867
|
||||||
@reverse @previous-lanes
|
@reverse @previous-lanes
|
||||||
@@ -589,11 +589,11 @@ Feature: Turn Lane Guidance
|
|||||||
| restriction | de | ef | e | no_left_turn |
|
| restriction | de | ef | e | no_left_turn |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| from | to | bearings | route | turns | lanes |
|
| from | to | bearings | route | turns | lanes |
|
||||||
| a | g | 180,180 180,180 | road,cross,cross | depart,turn right,arrive | ,none:false straight:false right:true, |
|
| a | g | 180,180 180,180 | road,cross,cross | depart,turn right,arrive | ;none:false straight:false right:true,none:false straight:false right:true, |
|
||||||
| a | h | 180,180 180,180 | road,cross,cross | depart,turn left,arrive | ,none:true straight:false right:false, |
|
| a | h | 180,180 180,180 | road,cross,cross | depart,turn left,arrive | ;none:true straight:false right:false,none:true straight:false right:false;, |
|
||||||
| a | i | 180,180 180,180 | road,road | depart,arrive | , |
|
| a | i | 180,180 180,180 | road,road | depart,arrive | ;none:true straight:true right:false;none:true straight:true right:false, |
|
||||||
| b | a | 90,2 270,2 | road,road,road | depart,continue uturn,arrive | ,none:true straight:false right:false, |
|
| b | a | 90,2 270,2 | road,road,road | depart,continue uturn,arrive | ,none:true straight:false right:false;, |
|
||||||
|
|
||||||
@reverse
|
@reverse
|
||||||
Scenario: Segregated Intersection Merges With Lanes
|
Scenario: Segregated Intersection Merges With Lanes
|
||||||
@@ -681,7 +681,7 @@ Feature: Turn Lane Guidance
|
|||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,d | road,road | depart,arrive | , |
|
| a,d | road,road | depart,arrive | ;straight:true straight:true straight;slight right:true slight right:false, |
|
||||||
| a,e | road,cross,cross | depart,turn slight right,arrive | ,straight:false straight:false straight;slight right:true slight right:true, |
|
| a,e | road,cross,cross | depart,turn slight right,arrive | ,straight:false straight:false straight;slight right:true slight right:true, |
|
||||||
|
|
||||||
@ramp
|
@ramp
|
||||||
@@ -700,7 +700,7 @@ Feature: Turn Lane Guidance
|
|||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,d | hwy,hwy | depart,arrive | , |
|
| a,d | hwy,hwy | depart,arrive | ;straight:true straight:true straight;slight right:true slight right:false, |
|
||||||
| a,e | hwy,ramp,ramp | depart,off ramp slight right,arrive | ,straight:false straight:false straight;slight right:true slight right:true, |
|
| a,e | hwy,ramp,ramp | depart,off ramp slight right,arrive | ,straight:false straight:false straight;slight right:true slight right:true, |
|
||||||
|
|
||||||
@todo
|
@todo
|
||||||
@@ -745,7 +745,7 @@ Feature: Turn Lane Guidance
|
|||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,c | hwy,hwy | depart,arrive | , |
|
| a,c | hwy,hwy | depart,arrive | ;straight:true straight:true slight right:false, |
|
||||||
| a,d | hwy,ramp,ramp | depart,off ramp slight right,arrive | ,straight:false straight:false slight right:true, |
|
| a,d | hwy,ramp,ramp | depart,off ramp slight right,arrive | ,straight:false straight:false slight right:true, |
|
||||||
|
|
||||||
@reverse
|
@reverse
|
||||||
@@ -766,8 +766,8 @@ Feature: Turn Lane Guidance
|
|||||||
| fgh | road | | primary | yes |
|
| fgh | road | | primary | yes |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,h | road,road,road | depart,continue uturn,arrive | ,uturn:true straight:false straight:false,|
|
| a,h | road,road,road | depart,continue uturn,arrive | ,uturn:true straight:false straight:false;,|
|
||||||
|
|
||||||
@reverse
|
@reverse
|
||||||
Scenario: Reverse Lane in Segregated Road with none
|
Scenario: Reverse Lane in Segregated Road with none
|
||||||
@@ -787,8 +787,8 @@ Feature: Turn Lane Guidance
|
|||||||
| fgh | road | | primary | yes |
|
| fgh | road | | primary | yes |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,h | road,road,road | depart,continue uturn,arrive | ,uturn:true straight:false none:false, |
|
| a,h | road,road,road | depart,continue uturn,arrive | ,uturn:true straight:false none:false;, |
|
||||||
|
|
||||||
@reverse
|
@reverse
|
||||||
Scenario: Reverse Lane in Segregated Road with none, Service Turn Prior
|
Scenario: Reverse Lane in Segregated Road with none, Service Turn Prior
|
||||||
@@ -810,8 +810,8 @@ Feature: Turn Lane Guidance
|
|||||||
| ji | park | | service | no |
|
| ji | park | | service | no |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,h | road,road,road | depart,continue uturn,arrive | ,uturn:true straight:false none:false, |
|
| a,h | road,road,road | depart,continue uturn,arrive | ,uturn:true straight:false none:false;, |
|
||||||
|
|
||||||
@simple
|
@simple
|
||||||
Scenario: Don't collapse everything to u-turn / too wide
|
Scenario: Don't collapse everything to u-turn / too wide
|
||||||
@@ -873,9 +873,9 @@ Feature: Turn Lane Guidance
|
|||||||
| ab | on | motorway_link | |
|
| ab | on | motorway_link | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,j | on,xbcj | depart,arrive | , |
|
| a,j | on,xbcj | depart,arrive | ;;none:true slight right:false, |
|
||||||
| a,i | on,off,off | depart,turn right,arrive | ,none:false slight right:true, |
|
| a,i | on,off,off | depart,turn right,arrive | ;,none:false slight right:true, |
|
||||||
|
|
||||||
#http://www.openstreetmap.org/#map=17/52.47414/13.35712
|
#http://www.openstreetmap.org/#map=17/52.47414/13.35712
|
||||||
@todo @ramp @2645
|
@todo @ramp @2645
|
||||||
@@ -929,8 +929,8 @@ Feature: Turn Lane Guidance
|
|||||||
| cf | turn | primary | |
|
| cf | turn | primary | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| x,d | road,road | depart,arrive | , |
|
| x,d | road,road | depart,arrive | ;straight;right:true;straight;right:true, |
|
||||||
|
|
||||||
@partition-lanes
|
@partition-lanes
|
||||||
Scenario: Partitioned turn, Slight Curve - maxspeed
|
Scenario: Partitioned turn, Slight Curve - maxspeed
|
||||||
@@ -952,9 +952,9 @@ Feature: Turn Lane Guidance
|
|||||||
| dce | cross | primary | yes | | 1 |
|
| dce | cross | primary | yes | | 1 |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes | locations |
|
| waypoints | route | turns | lanes | locations |
|
||||||
| a,g | road,cross,cross | depart,turn right,arrive | ,left:false right:true, | a,b,g |
|
| a,g | road,cross,cross | depart,turn right,arrive | ,left:false right:true, | a,b,g |
|
||||||
| a,e | road,cross,cross | depart,end of road left,arrive | ,left:true right:false, | a,c,e |
|
| a,e | road,cross,cross | depart,end of road left,arrive | ;left:true right:false,left:true right:false, | a,c,e |
|
||||||
|
|
||||||
Scenario: Partitioned turn, Slight Curve
|
Scenario: Partitioned turn, Slight Curve
|
||||||
Given the node map
|
Given the node map
|
||||||
@@ -975,9 +975,9 @@ Feature: Turn Lane Guidance
|
|||||||
| dce | cross | primary | yes | |
|
| dce | cross | primary | yes | |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes | locations |
|
| waypoints | route | turns | lanes | locations |
|
||||||
| a,g | road,cross,cross | depart,turn right,arrive | ,left:false right:true, | a,b,g |
|
| a,g | road,cross,cross | depart,turn right,arrive | ,left:false right:true, | a,b,g |
|
||||||
| a,e | road,cross,cross | depart,end of road left,arrive | ,left:true right:false, | a,c,e |
|
| a,e | road,cross,cross | depart,end of road left,arrive | ;left:true right:false,left:true right:false, | a,c,e |
|
||||||
|
|
||||||
Scenario: Lane Parsing Issue #2694
|
Scenario: Lane Parsing Issue #2694
|
||||||
Given the node map
|
Given the node map
|
||||||
@@ -1193,7 +1193,7 @@ Feature: Turn Lane Guidance
|
|||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,e | road,cross,cross | depart,turn right,arrive | ,left:false none:false none:true, |
|
| a,e | road,cross,cross | depart,turn right,arrive | ,left:false none:false none:true, |
|
||||||
| a,c | road,road | depart,arrive | , |
|
| a,c | road,road | depart,arrive | ;left:false none:true none:true, |
|
||||||
|
|
||||||
@3379
|
@3379
|
||||||
Scenario: Don't Turn through potential through lanes
|
Scenario: Don't Turn through potential through lanes
|
||||||
@@ -1214,7 +1214,7 @@ Feature: Turn Lane Guidance
|
|||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes |
|
| waypoints | route | turns | lanes |
|
||||||
| a,d | road,cross,cross | depart,turn left,arrive | ,none:true none:false right:false, |
|
| a,d | road,cross,cross | depart,turn left,arrive | ,none:true none:false right:false, |
|
||||||
| a,c | road,road | depart,arrive | , |
|
| a,c | road,road | depart,arrive | ;none:true none:true right:false, |
|
||||||
|
|
||||||
@4189
|
@4189
|
||||||
Scenario: U-turn after a traffic light
|
Scenario: U-turn after a traffic light
|
||||||
@@ -1242,5 +1242,5 @@ Feature: Turn Lane Guidance
|
|||||||
| mdhk | road2 | 2 | | yes |
|
| mdhk | road2 | 2 | | yes |
|
||||||
|
|
||||||
When I route I should get
|
When I route I should get
|
||||||
| waypoints | route | turns | lanes | locations |
|
| waypoints | route | turns | lanes | locations |
|
||||||
| a,f | road1,road1,road1 | depart,continue uturn,arrive | ,left:true straight:false straight;right:false, | a,d,f |
|
| a,f | road1,road1,road1 | depart,continue uturn,arrive | ;left:false straight:true straight;right:false,left:true straight:false straight;right:false;;, | a,d,f |
|
||||||
|
|||||||
+18
-11
@@ -171,6 +171,24 @@ module.exports = function () {
|
|||||||
('out' in s.intersections[0] ? s.intersections[0].bearings[s.intersections[0].out] : 0));
|
('out' in s.intersections[0] ? s.intersections[0].bearings[s.intersections[0].out] : 0));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.lanesList = (instructions) => {
|
||||||
|
return this.extractInstructionList(instructions, s => {
|
||||||
|
return s.intersections.map( i => {
|
||||||
|
if(i.lanes)
|
||||||
|
{
|
||||||
|
return i.lanes.map( l => {
|
||||||
|
let indications = l.indications.join(';');
|
||||||
|
return indications + ':' + (l.valid ? 'true' : 'false');
|
||||||
|
}).join(' ');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}).join(';');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
this.approachList = (instructions) => {
|
this.approachList = (instructions) => {
|
||||||
return this.extractInstructionList(instructions, s => s.approaches || '');
|
return this.extractInstructionList(instructions, s => s.approaches || '');
|
||||||
};
|
};
|
||||||
@@ -197,17 +215,6 @@ module.exports = function () {
|
|||||||
return instructions.tracepoints.map(t => t.alternatives_count.toString()).join(',');
|
return instructions.tracepoints.map(t => t.alternatives_count.toString()).join(',');
|
||||||
};
|
};
|
||||||
|
|
||||||
this.lanesList = (instructions) => {
|
|
||||||
return this.extractInstructionList(instructions, instruction => {
|
|
||||||
if( 'lanes' in instruction.intersections[0] )
|
|
||||||
{
|
|
||||||
return instruction.intersections[0].lanes.map( p => { return (p.indications).join(';') + ':' + p.valid; } ).join(' ');
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
return '';
|
|
||||||
}});
|
|
||||||
};
|
|
||||||
|
|
||||||
this.turnList = (instructions) => {
|
this.turnList = (instructions) => {
|
||||||
return instructions.legs.reduce((m, v) => m.concat(v.steps), [])
|
return instructions.legs.reduce((m, v) => m.concat(v.steps), [])
|
||||||
.map(v => {
|
.map(v => {
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
@routing @speed @annotations @turn_penalty
|
||||||
|
Feature: Annotations
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Given the profile "turnbot"
|
||||||
|
Given a grid size of 100 meters
|
||||||
|
|
||||||
|
Scenario: Ensure that turn penalties aren't included in annotations
|
||||||
|
Given the node map
|
||||||
|
"""
|
||||||
|
h i
|
||||||
|
j k l m
|
||||||
|
"""
|
||||||
|
|
||||||
|
And the query options
|
||||||
|
| annotations | duration,speed,weight |
|
||||||
|
|
||||||
|
And the ways
|
||||||
|
| nodes | highway |
|
||||||
|
| hk | residential |
|
||||||
|
| il | residential |
|
||||||
|
| jk | residential |
|
||||||
|
| lk | residential |
|
||||||
|
| lm | residential |
|
||||||
|
|
||||||
|
When I route I should get
|
||||||
|
| from | to | route | a:speed | a:weight |
|
||||||
|
| h | j | hk,jk,jk | 6.7:6.7 | 15:15 |
|
||||||
|
| i | m | il,lm,lm | 6.7:6.7 | 15:15 |
|
||||||
|
| j | m | jk,lm | 6.7:6.7:6.7 | 15:15:15 |
|
||||||
@@ -174,14 +174,13 @@ class RouteAPI : public BaseAPI
|
|||||||
guidance::trimShortSegments(steps, leg_geometry);
|
guidance::trimShortSegments(steps, leg_geometry);
|
||||||
leg.steps = guidance::postProcess(std::move(steps));
|
leg.steps = guidance::postProcess(std::move(steps));
|
||||||
leg.steps = guidance::collapseTurnInstructions(std::move(leg.steps));
|
leg.steps = guidance::collapseTurnInstructions(std::move(leg.steps));
|
||||||
|
leg.steps = guidance::anticipateLaneChange(std::move(leg.steps));
|
||||||
leg.steps = guidance::buildIntersections(std::move(leg.steps));
|
leg.steps = guidance::buildIntersections(std::move(leg.steps));
|
||||||
leg.steps = guidance::suppressShortNameSegments(std::move(leg.steps));
|
leg.steps = guidance::suppressShortNameSegments(std::move(leg.steps));
|
||||||
leg.steps = guidance::assignRelativeLocations(std::move(leg.steps),
|
leg.steps = guidance::assignRelativeLocations(std::move(leg.steps),
|
||||||
leg_geometry,
|
leg_geometry,
|
||||||
phantoms.source_phantom,
|
phantoms.source_phantom,
|
||||||
phantoms.target_phantom);
|
phantoms.target_phantom);
|
||||||
leg.steps = guidance::anticipateLaneChange(std::move(leg.steps));
|
|
||||||
leg.steps = guidance::collapseUseLane(std::move(leg.steps));
|
|
||||||
leg_geometry = guidance::resyncGeometry(std::move(leg_geometry), leg.steps);
|
leg_geometry = guidance::resyncGeometry(std::move(leg_geometry), leg.steps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -78,11 +78,19 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade,
|
|||||||
}
|
}
|
||||||
|
|
||||||
prev_coordinate = coordinate;
|
prev_coordinate = coordinate;
|
||||||
geometry.annotations.emplace_back(
|
geometry.annotations.emplace_back(LegGeometry::Annotation{
|
||||||
LegGeometry::Annotation{current_distance,
|
current_distance,
|
||||||
path_point.duration_until_turn / 10.,
|
// NOTE: we want annotations to include only the duration/weight
|
||||||
path_point.weight_until_turn / facade.GetWeightMultiplier(),
|
// of the segment itself. For segments immediately before
|
||||||
path_point.datasource_id});
|
// a turn, the duration_until_turn/weight_until_turn values
|
||||||
|
// include the turn cost. To counter this, we subtract
|
||||||
|
// the duration_of_turn/weight_of_turn value, which is 0 for
|
||||||
|
// non-preceeding-turn segments, but contains the turn value
|
||||||
|
// for segments before a turn.
|
||||||
|
(path_point.duration_until_turn - path_point.duration_of_turn) / 10.,
|
||||||
|
(path_point.weight_until_turn - path_point.weight_of_turn) /
|
||||||
|
facade.GetWeightMultiplier(),
|
||||||
|
path_point.datasource_id});
|
||||||
geometry.locations.push_back(std::move(coordinate));
|
geometry.locations.push_back(std::move(coordinate));
|
||||||
geometry.osm_node_ids.push_back(facade.GetOSMNodeIDOfNode(path_point.turn_via_node));
|
geometry.osm_node_ids.push_back(facade.GetOSMNodeIDOfNode(path_point.turn_via_node));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace guidance
|
|||||||
// as separate maneuvers.
|
// as separate maneuvers.
|
||||||
OSRM_ATTR_WARN_UNUSED
|
OSRM_ATTR_WARN_UNUSED
|
||||||
std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps,
|
std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps,
|
||||||
const double min_duration_needed_for_lane_change = 10);
|
const double min_distance_needed_for_lane_change = 200);
|
||||||
|
|
||||||
} // namespace guidance
|
} // namespace guidance
|
||||||
} // namespace engine
|
} // namespace engine
|
||||||
|
|||||||
@@ -38,8 +38,12 @@ struct LegGeometry
|
|||||||
struct Annotation
|
struct Annotation
|
||||||
{
|
{
|
||||||
double distance; // distance in meters
|
double distance; // distance in meters
|
||||||
double duration; // duration in seconds
|
|
||||||
double weight; // weight value
|
// Total duration of a segment, in seconds, NOT including
|
||||||
|
// the turn penalty if the segment preceeds a turn
|
||||||
|
double duration;
|
||||||
|
double weight; // weight value, NOT including the turn weight
|
||||||
|
|
||||||
DatasourceID datasource;
|
DatasourceID datasource;
|
||||||
};
|
};
|
||||||
std::vector<Annotation> annotations;
|
std::vector<Annotation> annotations;
|
||||||
|
|||||||
@@ -20,16 +20,6 @@ namespace guidance
|
|||||||
OSRM_ATTR_WARN_UNUSED
|
OSRM_ATTR_WARN_UNUSED
|
||||||
std::vector<RouteStep> suppressShortNameSegments(std::vector<RouteStep> steps);
|
std::vector<RouteStep> suppressShortNameSegments(std::vector<RouteStep> steps);
|
||||||
|
|
||||||
// remove use lane information that is not actually a turn. For post-processing, we need to
|
|
||||||
// associate lanes with every turn. Some of these use-lane instructions are not required after lane
|
|
||||||
// anticipation anymore. This function removes all use lane instructions that are not actually used
|
|
||||||
// anymore since all lanes going straight are used anyhow.
|
|
||||||
// FIXME this is currently only a heuristic. We need knowledge on which lanes actually might become
|
|
||||||
// turn lanes. If a straight lane becomes a turn lane, this might be something to consider. Right
|
|
||||||
// now we bet on lane-anticipation to catch this.
|
|
||||||
OSRM_ATTR_WARN_UNUSED
|
|
||||||
std::vector<RouteStep> collapseUseLane(std::vector<RouteStep> steps);
|
|
||||||
|
|
||||||
} // namespace guidance
|
} // namespace guidance
|
||||||
} // namespace engine
|
} // namespace engine
|
||||||
} // namespace osrm
|
} // namespace osrm
|
||||||
|
|||||||
@@ -24,9 +24,17 @@ struct PathData
|
|||||||
// name of the street that leads to the turn
|
// name of the street that leads to the turn
|
||||||
unsigned name_id;
|
unsigned name_id;
|
||||||
// weight that is traveled on the segment until the turn is reached
|
// weight that is traveled on the segment until the turn is reached
|
||||||
|
// including the turn weight, if one exists
|
||||||
EdgeWeight weight_until_turn;
|
EdgeWeight weight_until_turn;
|
||||||
// duration that is traveled on the segment until the turn is reached
|
// If this segment immediately preceeds a turn, then duration_of_turn
|
||||||
|
// will contain the weight of the turn. Otherwise it will be 0.
|
||||||
|
EdgeWeight weight_of_turn;
|
||||||
|
// duration that is traveled on the segment until the turn is reached,
|
||||||
|
// including a turn if the segment preceeds one.
|
||||||
EdgeWeight duration_until_turn;
|
EdgeWeight duration_until_turn;
|
||||||
|
// If this segment immediately preceeds a turn, then duration_of_turn
|
||||||
|
// will contain the duration of the turn. Otherwise it will be 0.
|
||||||
|
EdgeWeight duration_of_turn;
|
||||||
// instruction to execute at the turn
|
// instruction to execute at the turn
|
||||||
extractor::guidance::TurnInstruction turn_instruction;
|
extractor::guidance::TurnInstruction turn_instruction;
|
||||||
// turn lane data
|
// turn lane data
|
||||||
|
|||||||
@@ -186,7 +186,9 @@ void annotatePath(const FacadeT &facade,
|
|||||||
unpacked_path.push_back(PathData{id_vector[segment_idx + 1],
|
unpacked_path.push_back(PathData{id_vector[segment_idx + 1],
|
||||||
name_index,
|
name_index,
|
||||||
weight_vector[segment_idx],
|
weight_vector[segment_idx],
|
||||||
|
0,
|
||||||
duration_vector[segment_idx],
|
duration_vector[segment_idx],
|
||||||
|
0,
|
||||||
extractor::guidance::TurnInstruction::NO_TURN(),
|
extractor::guidance::TurnInstruction::NO_TURN(),
|
||||||
{{0, INVALID_LANEID}, INVALID_LANE_DESCRIPTIONID},
|
{{0, INVALID_LANEID}, INVALID_LANE_DESCRIPTIONID},
|
||||||
travel_mode,
|
travel_mode,
|
||||||
@@ -200,10 +202,15 @@ void annotatePath(const FacadeT &facade,
|
|||||||
if (facade.HasLaneData(turn_id))
|
if (facade.HasLaneData(turn_id))
|
||||||
unpacked_path.back().lane_data = facade.GetLaneData(turn_id);
|
unpacked_path.back().lane_data = facade.GetLaneData(turn_id);
|
||||||
|
|
||||||
|
const auto turn_duration = facade.GetDurationPenaltyForEdgeID(turn_id);
|
||||||
|
const auto turn_weight = facade.GetWeightPenaltyForEdgeID(turn_id);
|
||||||
|
|
||||||
unpacked_path.back().entry_class = facade.GetEntryClass(turn_id);
|
unpacked_path.back().entry_class = facade.GetEntryClass(turn_id);
|
||||||
unpacked_path.back().turn_instruction = turn_instruction;
|
unpacked_path.back().turn_instruction = turn_instruction;
|
||||||
unpacked_path.back().duration_until_turn += facade.GetDurationPenaltyForEdgeID(turn_id);
|
unpacked_path.back().duration_until_turn += turn_duration;
|
||||||
unpacked_path.back().weight_until_turn += facade.GetWeightPenaltyForEdgeID(turn_id);
|
unpacked_path.back().duration_of_turn = turn_duration;
|
||||||
|
unpacked_path.back().weight_until_turn += turn_weight;
|
||||||
|
unpacked_path.back().weight_of_turn = turn_weight;
|
||||||
unpacked_path.back().pre_turn_bearing = facade.PreTurnBearing(turn_id);
|
unpacked_path.back().pre_turn_bearing = facade.PreTurnBearing(turn_id);
|
||||||
unpacked_path.back().post_turn_bearing = facade.PostTurnBearing(turn_id);
|
unpacked_path.back().post_turn_bearing = facade.PostTurnBearing(turn_id);
|
||||||
}
|
}
|
||||||
@@ -262,7 +269,9 @@ void annotatePath(const FacadeT &facade,
|
|||||||
PathData{id_vector[start_index < end_index ? segment_idx + 1 : segment_idx - 1],
|
PathData{id_vector[start_index < end_index ? segment_idx + 1 : segment_idx - 1],
|
||||||
facade.GetNameIndex(target_node_id),
|
facade.GetNameIndex(target_node_id),
|
||||||
weight_vector[segment_idx],
|
weight_vector[segment_idx],
|
||||||
|
0,
|
||||||
duration_vector[segment_idx],
|
duration_vector[segment_idx],
|
||||||
|
0,
|
||||||
extractor::guidance::TurnInstruction::NO_TURN(),
|
extractor::guidance::TurnInstruction::NO_TURN(),
|
||||||
{{0, INVALID_LANEID}, INVALID_LANE_DESCRIPTIONID},
|
{{0, INVALID_LANEID}, INVALID_LANE_DESCRIPTIONID},
|
||||||
facade.GetTravelMode(target_node_id),
|
facade.GetTravelMode(target_node_id),
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ const constexpr Enum EnterRotary = 12; // Enter a rotary
|
|||||||
const constexpr Enum EnterAndExitRotary = 13; // Touching a rotary
|
const constexpr Enum EnterAndExitRotary = 13; // Touching a rotary
|
||||||
const constexpr Enum EnterRoundaboutIntersection = 14; // Entering a small Roundabout
|
const constexpr Enum EnterRoundaboutIntersection = 14; // Entering a small Roundabout
|
||||||
const constexpr Enum EnterAndExitRoundaboutIntersection = 15; // Touching a roundabout
|
const constexpr Enum EnterAndExitRoundaboutIntersection = 15; // Touching a roundabout
|
||||||
const constexpr Enum UseLane = 16; // No Turn, but you need to stay on a given lane!
|
// depreacted: const constexpr Enum UseLane = 16; // No Turn, but you need to stay on a given lane!
|
||||||
|
|
||||||
// Values below here are silent instructions
|
// Values below here are silent instructions
|
||||||
const constexpr Enum NoTurn = 17; // end of segment without turn/middle of a segment
|
const constexpr Enum NoTurn = 17; // end of segment without turn/middle of a segment
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ struct TurnLaneData
|
|||||||
// a temporary data entry that does not need to be assigned to an entry.
|
// a temporary data entry that does not need to be assigned to an entry.
|
||||||
// This is the case in situations that use partition and require the entry to perform the
|
// This is the case in situations that use partition and require the entry to perform the
|
||||||
// one-to-one mapping.
|
// one-to-one mapping.
|
||||||
bool suppress_assignment;
|
|
||||||
bool operator<(const TurnLaneData &other) const;
|
bool operator<(const TurnLaneData &other) const;
|
||||||
};
|
};
|
||||||
typedef std::vector<TurnLaneData> LaneDataVector;
|
typedef std::vector<TurnLaneData> LaneDataVector;
|
||||||
|
|||||||
@@ -90,9 +90,7 @@ inline void print(const extractor::guidance::lanes::LaneDataVector &turn_lane_da
|
|||||||
std::cout << "\t" << entry.tag << "("
|
std::cout << "\t" << entry.tag << "("
|
||||||
<< extractor::guidance::TurnLaneType::toString(entry.tag)
|
<< extractor::guidance::TurnLaneType::toString(entry.tag)
|
||||||
<< ") from: " << static_cast<int>(entry.from)
|
<< ") from: " << static_cast<int>(entry.from)
|
||||||
<< " to: " << static_cast<int>(entry.to)
|
<< " to: " << static_cast<int>(entry.to) << "\n";
|
||||||
<< " Can Be Suppresssed: " << (entry.suppress_assignment ? "true" : "false")
|
|
||||||
<< "\n";
|
|
||||||
std::cout << std::flush;
|
std::cout << std::flush;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "osrm",
|
"name": "osrm",
|
||||||
"version": "5.9.0",
|
"version": "5.9.2",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "The Open Source Routing Machine is a high performance routing engine written in C++14 designed to run on OpenStreetMap data.",
|
"description": "The Open Source Routing Machine is a high performance routing engine written in C++14 designed to run on OpenStreetMap data.",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -10,9 +10,6 @@ local pprint = require('lib/pprint')
|
|||||||
|
|
||||||
-- globals that are normally set from C++
|
-- globals that are normally set from C++
|
||||||
|
|
||||||
-- profiles code modifies this table
|
|
||||||
properties = {}
|
|
||||||
|
|
||||||
-- should match values defined in include/extractor/guidance/road_classification.hpp
|
-- should match values defined in include/extractor/guidance/road_classification.hpp
|
||||||
road_priority_class = {
|
road_priority_class = {
|
||||||
motorway = 0,
|
motorway = 0,
|
||||||
@@ -122,6 +119,8 @@ function Debug.way_function(way,result)
|
|||||||
result.forward_speed = -1
|
result.forward_speed = -1
|
||||||
result.backward_speed = -1
|
result.backward_speed = -1
|
||||||
result.duration = 0
|
result.duration = 0
|
||||||
|
result.forward_classes = {}
|
||||||
|
result.backward_classes = {}
|
||||||
|
|
||||||
-- intercept tag function normally provided via C++
|
-- intercept tag function normally provided via C++
|
||||||
function way:get_value_by_key(k)
|
function way:get_value_by_key(k)
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ namespace guidance
|
|||||||
{
|
{
|
||||||
|
|
||||||
std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps,
|
std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps,
|
||||||
const double min_duration_needed_for_lane_change)
|
const double min_distance_needed_for_lane_change)
|
||||||
{
|
{
|
||||||
// Lane anticipation works on contiguous ranges of quick steps that have lane information
|
// Lane anticipation works on contiguous ranges of short steps that have lane information
|
||||||
const auto is_quick_has_lanes = [&](const RouteStep &step) {
|
const auto is_short_has_lanes = [&](const RouteStep &step) {
|
||||||
const auto has_lanes = step.intersections.front().lanes.lanes_in_turn > 0;
|
const auto has_lanes = step.intersections.front().lanes.lanes_in_turn > 0;
|
||||||
|
|
||||||
if (!has_lanes)
|
if (!has_lanes)
|
||||||
@@ -41,10 +41,10 @@ std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps,
|
|||||||
// We do not have a source-target lane mapping, assume worst case for lanes to cross.
|
// We do not have a source-target lane mapping, assume worst case for lanes to cross.
|
||||||
const auto to_cross = std::max(step.NumLanesToTheRight(), step.NumLanesToTheLeft());
|
const auto to_cross = std::max(step.NumLanesToTheRight(), step.NumLanesToTheLeft());
|
||||||
const auto scale = 1 + to_cross;
|
const auto scale = 1 + to_cross;
|
||||||
const auto threshold = scale * min_duration_needed_for_lane_change;
|
const auto threshold = scale * min_distance_needed_for_lane_change;
|
||||||
|
|
||||||
const auto is_quick = step.duration < threshold;
|
const auto is_short = step.distance < threshold;
|
||||||
return is_quick;
|
return is_short;
|
||||||
};
|
};
|
||||||
|
|
||||||
using StepIter = decltype(steps)::iterator;
|
using StepIter = decltype(steps)::iterator;
|
||||||
@@ -57,7 +57,7 @@ std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps,
|
|||||||
quick_lanes_ranges.push_back(std::move(range));
|
quick_lanes_ranges.push_back(std::move(range));
|
||||||
};
|
};
|
||||||
|
|
||||||
util::group_by(begin(steps), end(steps), is_quick_has_lanes, range_back_inserter);
|
util::group_by(begin(steps), end(steps), is_short_has_lanes, range_back_inserter);
|
||||||
|
|
||||||
// The lanes for a keep straight depend on the next left/right turn. Tag them in advance.
|
// The lanes for a keep straight depend on the next left/right turn. Tag them in advance.
|
||||||
std::unordered_set<const RouteStep *> is_straight_left;
|
std::unordered_set<const RouteStep *> is_straight_left;
|
||||||
@@ -75,10 +75,11 @@ std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps,
|
|||||||
// state for the lamda
|
// state for the lamda
|
||||||
// the number of lanes we have to change depends on the number of lanes that are allowed for
|
// the number of lanes we have to change depends on the number of lanes that are allowed for
|
||||||
// a turn (in general) and the set of lanes which would allow for us to do the turn without
|
// a turn (in general) and the set of lanes which would allow for us to do the turn without
|
||||||
// a problem. In a sequence of turns, we have to look at how much time we need to switch the
|
// a problem. In a sequence of turns, we have to look at how much distance we need to switch
|
||||||
|
// the
|
||||||
// sequence. Given the turns in between, we would expect a bit longer than on a straight
|
// sequence. Given the turns in between, we would expect a bit longer than on a straight
|
||||||
// segment for a lane switch, but the total time shouldn't be unlimited.
|
// segment for a lane switch, but the total distance shouldn't be unlimited.
|
||||||
double time_to_constrained = 0.0;
|
double distance_to_constrained = 0.0;
|
||||||
|
|
||||||
util::for_each_pair(rev_first, rev_last, [&](RouteStep ¤t, RouteStep &previous) {
|
util::for_each_pair(rev_first, rev_last, [&](RouteStep ¤t, RouteStep &previous) {
|
||||||
const auto current_inst = current.maneuver.instruction;
|
const auto current_inst = current.maneuver.instruction;
|
||||||
@@ -96,14 +97,14 @@ std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps,
|
|||||||
|
|
||||||
// only prevent use lanes due to making all turns. don't make turns during curvy
|
// only prevent use lanes due to making all turns. don't make turns during curvy
|
||||||
// segments
|
// segments
|
||||||
if (previous_inst.type == TurnType::UseLane)
|
if (previous_inst.type == TurnType::Suppressed)
|
||||||
time_to_constrained += previous.duration;
|
distance_to_constrained += previous.distance;
|
||||||
else
|
else
|
||||||
time_to_constrained = 0;
|
distance_to_constrained = 0.;
|
||||||
|
|
||||||
const auto lane_delta = previous_lanes.lanes_in_turn - current_lanes.lanes_in_turn;
|
const auto lane_delta = previous_lanes.lanes_in_turn - current_lanes.lanes_in_turn;
|
||||||
const auto can_make_all_turns =
|
const auto can_make_all_turns =
|
||||||
time_to_constrained > lane_delta * min_duration_needed_for_lane_change;
|
distance_to_constrained > lane_delta * min_distance_needed_for_lane_change;
|
||||||
|
|
||||||
if (!lanes_to_constrain || !lanes_fan_in || can_make_all_turns)
|
if (!lanes_to_constrain || !lanes_fan_in || can_make_all_turns)
|
||||||
return;
|
return;
|
||||||
@@ -193,8 +194,9 @@ std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps,
|
|||||||
anticipate_for_right_turn();
|
anticipate_for_right_turn();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (previous_inst.type == TurnType::UseLane && current_inst.type == TurnType::UseLane &&
|
if (previous_inst.type == TurnType::Suppressed &&
|
||||||
previous.mode == current.mode && previous_lanes == current_lanes)
|
current_inst.type == TurnType::Suppressed && previous.mode == current.mode &&
|
||||||
|
previous_lanes == current_lanes)
|
||||||
{
|
{
|
||||||
previous.ElongateBy(current);
|
previous.ElongateBy(current);
|
||||||
current.Invalidate();
|
current.Invalidate();
|
||||||
|
|||||||
@@ -133,8 +133,7 @@ void closeOffRoundabout(const bool on_roundabout,
|
|||||||
BOOST_ASSERT(leavesRoundabout(steps[1].maneuver.instruction) ||
|
BOOST_ASSERT(leavesRoundabout(steps[1].maneuver.instruction) ||
|
||||||
steps[1].maneuver.instruction.type == TurnType::StayOnRoundabout ||
|
steps[1].maneuver.instruction.type == TurnType::StayOnRoundabout ||
|
||||||
steps[1].maneuver.instruction.type == TurnType::Suppressed ||
|
steps[1].maneuver.instruction.type == TurnType::Suppressed ||
|
||||||
steps[1].maneuver.instruction.type == TurnType::NoTurn ||
|
steps[1].maneuver.instruction.type == TurnType::NoTurn);
|
||||||
steps[1].maneuver.instruction.type == TurnType::UseLane);
|
|
||||||
steps[0].geometry_end = 1;
|
steps[0].geometry_end = 1;
|
||||||
steps[1].geometry_begin = 0;
|
steps[1].geometry_begin = 0;
|
||||||
steps[1].AddInFront(steps[0]);
|
steps[1].AddInFront(steps[0]);
|
||||||
|
|||||||
@@ -82,52 +82,6 @@ std::vector<RouteStep> suppressShortNameSegments(std::vector<RouteStep> steps)
|
|||||||
return removeNoTurnInstructions(std::move(steps));
|
return removeNoTurnInstructions(std::move(steps));
|
||||||
}
|
}
|
||||||
|
|
||||||
// `useLane` steps are only returned on `straight` maneuvers when there
|
|
||||||
// are surrounding lanes also tagged as `straight`. If there are no other `straight`
|
|
||||||
// lanes, it is not an ambiguous maneuver, and we can collapse the `useLane` step.
|
|
||||||
std::vector<RouteStep> collapseUseLane(std::vector<RouteStep> steps)
|
|
||||||
{
|
|
||||||
const auto containsTag = [](const extractor::guidance::TurnLaneType::Mask mask,
|
|
||||||
const extractor::guidance::TurnLaneType::Mask tag) {
|
|
||||||
return (mask & tag) != extractor::guidance::TurnLaneType::empty;
|
|
||||||
};
|
|
||||||
|
|
||||||
const auto canCollapseUseLane = [containsTag](const RouteStep &step) {
|
|
||||||
// the lane description is given left to right, lanes are counted from the right.
|
|
||||||
// Therefore we access the lane description using the reverse iterator
|
|
||||||
|
|
||||||
auto right_most_lanes = step.LanesToTheRight();
|
|
||||||
if (!right_most_lanes.empty() && containsTag(right_most_lanes.front(),
|
|
||||||
(extractor::guidance::TurnLaneType::straight |
|
|
||||||
extractor::guidance::TurnLaneType::none)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
auto left_most_lanes = step.LanesToTheLeft();
|
|
||||||
if (!left_most_lanes.empty() && containsTag(left_most_lanes.back(),
|
|
||||||
(extractor::guidance::TurnLaneType::straight |
|
|
||||||
extractor::guidance::TurnLaneType::none)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
BOOST_ASSERT(steps.size() > 1);
|
|
||||||
for (auto step_itr = steps.begin() + 1; step_itr != steps.end(); ++step_itr)
|
|
||||||
{
|
|
||||||
if (step_itr->maneuver.instruction.type == TurnType::UseLane &&
|
|
||||||
canCollapseUseLane(*step_itr))
|
|
||||||
{
|
|
||||||
auto previous_turn_itr = findPreviousTurn(step_itr);
|
|
||||||
if (haveSameMode(*previous_turn_itr, *step_itr))
|
|
||||||
{
|
|
||||||
previous_turn_itr->ElongateBy(*step_itr);
|
|
||||||
step_itr->Invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return removeNoTurnInstructions(std::move(steps));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace guidance
|
} // namespace guidance
|
||||||
} // namespace engine
|
} // namespace engine
|
||||||
} // namespace osrm
|
} // namespace osrm
|
||||||
|
|||||||
@@ -121,9 +121,12 @@ ViaRoutePlugin::HandleRequest(const datafacade::ContiguousInternalMemoryDataFaca
|
|||||||
routes = algorithms.ShortestPathSearch(start_end_nodes, route_parameters.continue_straight);
|
routes = algorithms.ShortestPathSearch(start_end_nodes, route_parameters.continue_straight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The post condition for all path searches is we have at least one route in our result.
|
||||||
|
// This route might be invalid by means of INVALID_EDGE_WEIGHT as shortest path weight.
|
||||||
|
BOOST_ASSERT(!routes.routes.empty());
|
||||||
|
|
||||||
// we can only know this after the fact, different SCC ids still
|
// we can only know this after the fact, different SCC ids still
|
||||||
// allow for connection in one direction.
|
// allow for connection in one direction.
|
||||||
BOOST_ASSERT(!routes.routes.empty());
|
|
||||||
|
|
||||||
if (routes.routes[0].is_valid())
|
if (routes.routes[0].is_valid())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -792,8 +792,15 @@ InternalManyRoutesResult alternativePathSearch(SearchEngineData<Algorithm> &sear
|
|||||||
shortest_path_via_it->node != SPECIAL_NODEID &&
|
shortest_path_via_it->node != SPECIAL_NODEID &&
|
||||||
shortest_path_via_it->weight != INVALID_EDGE_WEIGHT;
|
shortest_path_via_it->weight != INVALID_EDGE_WEIGHT;
|
||||||
|
|
||||||
|
// Care needs to be taken to meet the call sites post condition.
|
||||||
|
// We must return at least one route, even if it's an invalid one.
|
||||||
if (!has_shortest_path)
|
if (!has_shortest_path)
|
||||||
return InternalManyRoutesResult{};
|
{
|
||||||
|
InternalRouteResult invalid;
|
||||||
|
invalid.shortest_path_weight = INVALID_EDGE_WEIGHT;
|
||||||
|
invalid.segment_end_coordinates = {phantom_node_pair};
|
||||||
|
return invalid;
|
||||||
|
}
|
||||||
|
|
||||||
NodeID shortest_path_via = shortest_path_via_it->node;
|
NodeID shortest_path_via = shortest_path_via_it->node;
|
||||||
EdgeWeight shortest_path_weight = shortest_path_via_it->weight;
|
EdgeWeight shortest_path_weight = shortest_path_via_it->weight;
|
||||||
|
|||||||
@@ -129,19 +129,16 @@ LaneDataVector augmentMultiple(const std::size_t none_index,
|
|||||||
{
|
{
|
||||||
lane_data.push_back({tag_by_modifier[itr->instruction.direction_modifier],
|
lane_data.push_back({tag_by_modifier[itr->instruction.direction_modifier],
|
||||||
lane_data[none_index].from,
|
lane_data[none_index].from,
|
||||||
lane_data[none_index].from,
|
lane_data[none_index].from});
|
||||||
false});
|
|
||||||
}
|
}
|
||||||
lane_data.push_back({tag_by_modifier[straight_itr->instruction.direction_modifier],
|
lane_data.push_back({tag_by_modifier[straight_itr->instruction.direction_modifier],
|
||||||
lane_data[none_index].from,
|
lane_data[none_index].from,
|
||||||
lane_data[none_index].to,
|
lane_data[none_index].to});
|
||||||
false});
|
|
||||||
for (auto itr = straight_itr + 1; itr != intersection_range_end; ++itr)
|
for (auto itr = straight_itr + 1; itr != intersection_range_end; ++itr)
|
||||||
{
|
{
|
||||||
lane_data.push_back({tag_by_modifier[itr->instruction.direction_modifier],
|
lane_data.push_back({tag_by_modifier[itr->instruction.direction_modifier],
|
||||||
lane_data[none_index].to,
|
lane_data[none_index].to,
|
||||||
lane_data[none_index].to,
|
lane_data[none_index].to});
|
||||||
false});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lane_data.erase(lane_data.begin() + none_index);
|
lane_data.erase(lane_data.begin() + none_index);
|
||||||
@@ -158,8 +155,7 @@ LaneDataVector augmentMultiple(const std::size_t none_index,
|
|||||||
lane_data.push_back({tag_by_modifier[intersection[intersection_index]
|
lane_data.push_back({tag_by_modifier[intersection[intersection_index]
|
||||||
.instruction.direction_modifier],
|
.instruction.direction_modifier],
|
||||||
lane_data[none_index].from,
|
lane_data[none_index].from,
|
||||||
lane_data[none_index].to,
|
lane_data[none_index].to});
|
||||||
false});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lane_data.erase(lane_data.begin() + none_index);
|
lane_data.erase(lane_data.begin() + none_index);
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ LaneDataVector laneDataFromDescription(TurnLaneDescription turn_lane_description
|
|||||||
LaneDataVector lane_data;
|
LaneDataVector lane_data;
|
||||||
lane_data.reserve(lane_map.size());
|
lane_data.reserve(lane_map.size());
|
||||||
for (const auto &tag : lane_map)
|
for (const auto &tag : lane_map)
|
||||||
lane_data.push_back({tag.first, tag.second.first, tag.second.second, false});
|
lane_data.push_back({tag.first, tag.second.first, tag.second.second});
|
||||||
|
|
||||||
std::sort(lane_data.begin(), lane_data.end());
|
std::sort(lane_data.begin(), lane_data.end());
|
||||||
|
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ TurnLaneScenario TurnLaneHandler::deduceScenario(const NodeID at,
|
|||||||
// FIXME the lane to add depends on the side of driving/u-turn rules in the country
|
// FIXME the lane to add depends on the side of driving/u-turn rules in the country
|
||||||
if (!lane_data.empty() && canMatchTrivially(intersection, lane_data) &&
|
if (!lane_data.empty() && canMatchTrivially(intersection, lane_data) &&
|
||||||
is_missing_valid_u_turn && !hasTag(TurnLaneType::none, lane_data))
|
is_missing_valid_u_turn && !hasTag(TurnLaneType::none, lane_data))
|
||||||
lane_data.push_back({TurnLaneType::uturn, lane_data.back().to, lane_data.back().to, false});
|
lane_data.push_back({TurnLaneType::uturn, lane_data.back().to, lane_data.back().to});
|
||||||
|
|
||||||
bool is_simple = isSimpleIntersection(lane_data, intersection);
|
bool is_simple = isSimpleIntersection(lane_data, intersection);
|
||||||
|
|
||||||
@@ -644,8 +644,6 @@ std::pair<LaneDataVector, LaneDataVector> TurnLaneHandler::partitionLaneData(
|
|||||||
if (lane == straightmost_tag_index)
|
if (lane == straightmost_tag_index)
|
||||||
{
|
{
|
||||||
augmentEntry(turn_lane_data[straightmost_tag_index]);
|
augmentEntry(turn_lane_data[straightmost_tag_index]);
|
||||||
// disable this turn for assignment if it is a -use lane only
|
|
||||||
turn_lane_data[straightmost_tag_index].suppress_assignment = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (matched_at_first[lane])
|
if (matched_at_first[lane])
|
||||||
@@ -657,7 +655,7 @@ std::pair<LaneDataVector, LaneDataVector> TurnLaneHandler::partitionLaneData(
|
|||||||
std::count(matched_at_second.begin(), matched_at_second.end(), true)) ==
|
std::count(matched_at_second.begin(), matched_at_second.end(), true)) ==
|
||||||
getNumberOfTurns(next_intersection))
|
getNumberOfTurns(next_intersection))
|
||||||
{
|
{
|
||||||
TurnLaneData data = {TurnLaneType::straight, 255, 0, true};
|
TurnLaneData data = {TurnLaneType::straight, 255, 0};
|
||||||
augmentEntry(data);
|
augmentEntry(data);
|
||||||
first.push_back(data);
|
first.push_back(data);
|
||||||
std::sort(first.begin(), first.end());
|
std::sort(first.begin(), first.end());
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ bool isValidMatch(const TurnLaneType::Mask tag, const TurnInstruction instructio
|
|||||||
TurnType::Continue && // Forks can be experienced, even for straight segments
|
TurnType::Continue && // Forks can be experienced, even for straight segments
|
||||||
(instruction.direction_modifier == DirectionModifier::SlightLeft ||
|
(instruction.direction_modifier == DirectionModifier::SlightLeft ||
|
||||||
instruction.direction_modifier == DirectionModifier::SlightRight)) ||
|
instruction.direction_modifier == DirectionModifier::SlightRight)) ||
|
||||||
instruction.type == TurnType::UseLane;
|
instruction.type == TurnType::Suppressed;
|
||||||
}
|
}
|
||||||
else if (tag == TurnLaneType::slight_left || tag == TurnLaneType::left ||
|
else if (tag == TurnLaneType::slight_left || tag == TurnLaneType::left ||
|
||||||
tag == TurnLaneType::sharp_left)
|
tag == TurnLaneType::sharp_left)
|
||||||
@@ -250,10 +250,6 @@ Intersection triviallyMatchLanesToTurns(Intersection intersection,
|
|||||||
BOOST_ASSERT(findBestMatch(lane_data[lane].tag, intersection) ==
|
BOOST_ASSERT(findBestMatch(lane_data[lane].tag, intersection) ==
|
||||||
intersection.begin() + road_index);
|
intersection.begin() + road_index);
|
||||||
|
|
||||||
if (TurnType::Suppressed == intersection[road_index].instruction.type &&
|
|
||||||
!lane_data[lane].suppress_assignment)
|
|
||||||
intersection[road_index].instruction.type = TurnType::UseLane;
|
|
||||||
|
|
||||||
matchRoad(intersection[road_index], lane_data[lane]);
|
matchRoad(intersection[road_index], lane_data[lane]);
|
||||||
++lane;
|
++lane;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ void Sol2ScriptingEnvironment::InitContext(LuaScriptingContext &context)
|
|||||||
"enter_and_exit_roundabout_intersection",
|
"enter_and_exit_roundabout_intersection",
|
||||||
extractor::guidance::TurnType::EnterAndExitRoundaboutIntersection,
|
extractor::guidance::TurnType::EnterAndExitRoundaboutIntersection,
|
||||||
"use_lane",
|
"use_lane",
|
||||||
extractor::guidance::TurnType::UseLane,
|
extractor::guidance::TurnType::Suppressed,
|
||||||
"no_turn",
|
"no_turn",
|
||||||
extractor::guidance::TurnType::NoTurn,
|
extractor::guidance::TurnType::NoTurn,
|
||||||
"suppressed",
|
"suppressed",
|
||||||
|
|||||||
Reference in New Issue
Block a user