Compare commits
13 Commits
v5.9.0-rc.2
...
v5.9.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 210fa9d545 | |||
| 7eafb48d20 | |||
| df0f407591 | |||
| f9a8bcc75c | |||
| f815daf026 | |||
| f393f47d43 | |||
| 1e258ed3fa | |||
| de084f201c | |||
| e34a74d4ac | |||
| bd1391f6f7 | |||
| f54631619a | |||
| 070fa1a24c | |||
| f15285e9ee |
+7
-2
@@ -1,4 +1,4 @@
|
||||
# 5.9.0 RC2
|
||||
# 5.9.0
|
||||
- Changes from 5.8:
|
||||
- Algorithm:
|
||||
- Multi-Level Dijkstra:
|
||||
@@ -7,17 +7,22 @@
|
||||
- API:
|
||||
- Exposes `alternatives=Number` parameter overload in addition to the boolean flag.
|
||||
- Support for exits numbers and names. New member `exits` in `RouteStep`, based on `junction:ref` on ways
|
||||
- `RouteStep` now has new parameter `classes` that can be set in the profile on each way.
|
||||
- `Intersection` now has new parameter `classes` that can be set in the profile on each way.
|
||||
- Profiles:
|
||||
- `result.exits` allows you to set a way's exit numbers and names, see [`junction:ref`](http://wiki.openstreetmap.org/wiki/Proposed_features/junction_details)
|
||||
- `ExtractionWay` now as new property `forward_classes` and `backward_classes` that can set in the `way_function`.
|
||||
The maximum number of classes is 8.
|
||||
- We now respect the `construction` tag. If the `construction` tag value is not on our whitelist (`minor`, `widening`, `no`) we will exclude the road.
|
||||
- Node.js Bindings:
|
||||
- Exposes `alternatives=Number` parameter overload in addition to the boolean flag
|
||||
- Expose `EngineConfig` options in the node bindings
|
||||
- Tools:
|
||||
- Exposes engine limit on number of alternatives to generate `--max-alternatives` in `osrm-routed` (3 by default)
|
||||
- Infrastructure
|
||||
- STXXL is not required to build OSRM and is an optional dependency for back-compatibility (ENABLE_STXXL=On)
|
||||
- OpenMP is only required when the optional STXXL dependency is used
|
||||
- Bug fixes:
|
||||
- #4278: Remove superflous continious instruction on a motorway.
|
||||
|
||||
# 5.8.0
|
||||
- Changes from 5.7
|
||||
|
||||
+7
-5
@@ -590,11 +590,13 @@ add_dependency_defines(-DBOOST_SPIRIT_USE_PHOENIX_V3)
|
||||
add_dependency_defines(-DBOOST_RESULT_OF_USE_DECLTYPE)
|
||||
add_dependency_defines(-DBOOST_FILESYSTEM_NO_DEPRECATED)
|
||||
|
||||
set(OpenMP_FIND_QUIETLY ON)
|
||||
find_package(OpenMP)
|
||||
if(OPENMP_FOUND)
|
||||
message(STATUS "OpenMP support found. Linking just in case for stxxl")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
||||
if (ENABLE_STXXL)
|
||||
set(OpenMP_FIND_QUIETLY ON)
|
||||
find_package(OpenMP)
|
||||
if(OPENMP_FOUND)
|
||||
message(STATUS "OpenMP support found. Linking just in case for stxxl")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_definitions(${OSRM_DEFINES})
|
||||
|
||||
+2
-2
@@ -583,7 +583,6 @@ step.
|
||||
- `destinations`: The destinations of the way. Will be `undefined` if there are no destinations.
|
||||
- `exits`: The exit numbers or names of the way. Will be `undefined` if there are no exit numbers or names.
|
||||
- `mode`: A string signifying the mode of transportation.
|
||||
- `classes`: An array of strings signifying the classes of the road as specified in the profile.
|
||||
- `maneuver`: A `StepManeuver` object representing the maneuver.
|
||||
- `intersections`: A list of `Intersection` objects that are passed along the segment, the very first belonging to the StepManeuver
|
||||
- `rotary_name`: The name for the rotary. Optionally included, if the step is a rotary and a rotary name is available.
|
||||
@@ -597,7 +596,6 @@ step.
|
||||
"mode" : "driving",
|
||||
"duration" : 15.6,
|
||||
"weight" : 15.6,
|
||||
"classes": ["toll", "restricted"],
|
||||
"intersections" : [
|
||||
{ "bearings" : [ 10, 92, 184, 270 ],
|
||||
"lanes" : [
|
||||
@@ -735,6 +733,7 @@ location of the StepManeuver. Further intersections are listed for every cross-w
|
||||
|
||||
- `location`: A `[longitude, latitude]` pair describing the location of the turn.
|
||||
- `bearings`: A list of bearing values (e.g. [0,90,180,270]) that are available at the intersection. The bearings describe all available roads at the intersection. Values are between 0-359 (0=true north)
|
||||
- `classes`: An array of strings signifying the classes (as specified in the profile) of the road exiting the intersection.
|
||||
- `entry`: A list of entry flags, corresponding in a 1:1 relationship to the bearings. A value of `true` indicates that the respective road could be entered on a valid route.
|
||||
`false` indicates that the turn onto the respective road would violate a restriction.
|
||||
- `in`: index into bearings/entry array. Used to calculate the bearing just before the turn. Namely, the clockwise angle from true north to the
|
||||
@@ -753,6 +752,7 @@ location of the StepManeuver. Further intersections are listed for every cross-w
|
||||
"out":2,
|
||||
"bearings":[60,150,240,330],
|
||||
"entry":["false","true","true","true"],
|
||||
"classes": ["toll", "restricted"],
|
||||
"lanes":{
|
||||
"indications": ["left", "straight"],
|
||||
"valid": "false"
|
||||
|
||||
@@ -17,13 +17,13 @@ Feature: Car - Mode flag
|
||||
| cd | primary | |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns | classes |
|
||||
| a | d | ab,bc,cd,cd | depart,notification right,notification left,arrive | ,ferry,, |
|
||||
| d | a | cd,bc,ab,ab | depart,notification right,notification left,arrive | ,ferry,, |
|
||||
| c | a | bc,ab,ab | depart,notification left,arrive | ferry,, |
|
||||
| d | b | cd,bc,bc | depart,notification right,arrive | ,ferry,ferry |
|
||||
| a | c | ab,bc,bc | depart,notification right,arrive | ,ferry,ferry |
|
||||
| b | d | bc,cd,cd | depart,notification left,arrive | ferry,, |
|
||||
| from | to | route | turns | classes |
|
||||
| a | d | ab,bc,cd,cd | depart,notification right,notification left,arrive | [()],[(ferry)],[()],[()] |
|
||||
| d | a | cd,bc,ab,ab | depart,notification right,notification left,arrive | [()],[(ferry)],[()],[()] |
|
||||
| c | a | bc,ab,ab | depart,notification left,arrive | [(ferry)],[()],[()] |
|
||||
| d | b | cd,bc,bc | depart,notification right,arrive | [()],[(ferry)],[()] |
|
||||
| a | c | ab,bc,bc | depart,notification right,arrive | [()],[(ferry)],[()] |
|
||||
| b | d | bc,cd,cd | depart,notification left,arrive | [(ferry)],[()],[()] |
|
||||
|
||||
|
||||
Scenario: Car - We tag motorways with a class
|
||||
@@ -40,10 +40,10 @@ Feature: Car - Mode flag
|
||||
| cd | primary |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns | classes | # |
|
||||
| a | d | ab,bc,cd | depart,notification right,arrive | ,motorway, | |
|
||||
| a | c | ab,bc,bc | depart,notification right,arrive | ,motorway,motorway | |
|
||||
| b | d | bc,cd | depart,arrive | motorway, | we don't announce when we leave the highway |
|
||||
| from | to | route | turns | classes |
|
||||
| a | d | ab,cd | depart,arrive | [(),(motorway),()],[()] |
|
||||
| a | c | ab,bc | depart,arrive | [(),(motorway)],[()] |
|
||||
| b | d | bc,cd | depart,arrive | [(motorway),()],[()] |
|
||||
|
||||
Scenario: Car - We tag motorway_link with a class
|
||||
Given the node map
|
||||
@@ -59,10 +59,10 @@ Feature: Car - Mode flag
|
||||
| cd | primary |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns | classes | # |
|
||||
| a | d | ab,bc,cd | depart,on ramp right,arrive | ,motorway, | notification replaced by on-ramp |
|
||||
| a | c | ab,bc,bc | depart,on ramp right,arrive | ,motorway,motorway | " " |
|
||||
| b | d | bc,cd | depart,arrive | motorway, | no announcement |
|
||||
| from | to | route | turns | classes | # |
|
||||
| a | d | ab,bc,cd | depart,on ramp right,arrive | [()],[(motorway),()],[()] | on-ramp at class change |
|
||||
| a | c | ab,bc,bc | depart,on ramp right,arrive | [()],[(motorway)],[()] | " " |
|
||||
| b | d | bc,cd | depart,arrive | [(motorway),()],[()] | no announcement |
|
||||
|
||||
|
||||
Scenario: Car - We tag restricted with a class
|
||||
@@ -79,8 +79,8 @@ Feature: Car - Mode flag
|
||||
| cd | primary | |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns | classes |
|
||||
| a | d | ab,bc,cd | depart,notification right,arrive| restricted,motorway;restricted, |
|
||||
| from | to | route | turns | classes |
|
||||
| a | d | ab,cd | depart,arrive| [(restricted),(motorway,restricted),()],[()] |
|
||||
|
||||
Scenario: Car - We toll restricted with a class
|
||||
Given the node map
|
||||
@@ -96,6 +96,32 @@ Feature: Car - Mode flag
|
||||
| cd | primary | |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns | classes |
|
||||
| a | d | ab,bc,cd | depart,notification right,arrive | toll,motorway;toll, |
|
||||
| from | to | route | turns | classes |
|
||||
| a | d | ab,cd | depart,arrive | [(toll),(motorway,toll),()],[()] |
|
||||
|
||||
Scenario: Car - From roundabout on toll road
|
||||
Given the node map
|
||||
"""
|
||||
c
|
||||
/ \
|
||||
a---b d---f
|
||||
\ /
|
||||
e
|
||||
|
|
||||
g
|
||||
"""
|
||||
|
||||
And the ways
|
||||
| nodes | oneway | highway | junction | toll |
|
||||
| ab | yes | primary | | |
|
||||
| cb | yes | primary | roundabout | |
|
||||
| dc | yes | primary | roundabout | |
|
||||
| be | yes | primary | roundabout | |
|
||||
| ed | yes | motorway| roundabout | |
|
||||
| eg | yes | primary | | |
|
||||
| df | yes | motorway| | yes |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns | classes |
|
||||
| a | f | ab,df,df | depart,roundabout-exit-2,arrive | [()],[(),(motorway),(toll,motorway)],[()] |
|
||||
|
||||
|
||||
@@ -14,3 +14,4 @@ Feature: Car - all construction tags the OpenStreetMap community could think of
|
||||
| primary | | yes | |
|
||||
| primary | no | | x |
|
||||
| primary | widening | | x |
|
||||
| primary | minor | | x |
|
||||
|
||||
@@ -23,11 +23,11 @@ Feature: Car - Destination only, no passing through
|
||||
When I route I should get
|
||||
| from | to | route |
|
||||
| a | b | ab,ab |
|
||||
| a | c | ab,bcd,bcd |
|
||||
| a | c | ab,bcd |
|
||||
| a | d | ab,bcd,bcd |
|
||||
| a | e | axye,axye |
|
||||
| e | d | de,de |
|
||||
| e | c | de,bcd,bcd |
|
||||
| e | c | de,bcd |
|
||||
| e | b | de,bcd,bcd |
|
||||
| e | a | axye,axye |
|
||||
|
||||
@@ -51,12 +51,12 @@ Feature: Car - Destination only, no passing through
|
||||
When I route I should get
|
||||
| from | to | route |
|
||||
| a | b | ab,ab |
|
||||
| a | c | ab,bc,bc |
|
||||
| a | d | ab,bc,cd |
|
||||
| a | c | ab,bc |
|
||||
| a | d | ab,cd |
|
||||
| a | e | axye,axye |
|
||||
| e | d | de,de |
|
||||
| e | c | de,cd,cd |
|
||||
| e | b | de,cd,bc |
|
||||
| e | c | de,cd |
|
||||
| e | b | de,bc |
|
||||
| e | a | axye,axye |
|
||||
|
||||
Scenario: Car - Routing inside a destination only area
|
||||
|
||||
@@ -261,3 +261,23 @@ Feature: Motorway Guidance
|
||||
When I route I should get
|
||||
| waypoints | route | turns |
|
||||
| a,d | On,Hwy,Off,Off | depart,merge slight right,off ramp right,arrive |
|
||||
|
||||
#http://0.0.0.0:9966/?z=18¢er=38.893323%2C-77.055117&loc=38.893551%2C-77.054833&loc=38.893112%2C-77.055536&hl=en&alt=0
|
||||
Scenario: Merging with same name
|
||||
Given the node map
|
||||
"""
|
||||
a - - -
|
||||
> c - d
|
||||
b
|
||||
"""
|
||||
|
||||
And the ways
|
||||
| nodes | name | ref | highway | oneway |
|
||||
| ac | | US 50 | motorway | yes |
|
||||
| bc | | I 66 | motorway | yes |
|
||||
| cd | | US 50; I 66 | motorway | yes |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route | turns |
|
||||
| a,d | , | depart,arrive |
|
||||
| b,d | , | depart,arrive |
|
||||
|
||||
@@ -261,7 +261,7 @@ module.exports = function () {
|
||||
};
|
||||
|
||||
this.classesList = (instructions) => {
|
||||
return this.extractInstructionList(instructions, s => s.classes ? s.classes.join(';') : '');
|
||||
return this.extractInstructionList(instructions, s => '[' + s.intersections.map(i => '(' + (i.classes ? i.classes.join(',') : '') + ')').join(',') + ']');
|
||||
};
|
||||
|
||||
this.timeList = (instructions) => {
|
||||
|
||||
@@ -63,7 +63,6 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
||||
: target_node.forward_segment_id.id;
|
||||
const auto target_name_id = facade.GetNameIndex(target_node_id);
|
||||
const auto target_mode = facade.GetTravelMode(target_node_id);
|
||||
auto target_classes = facade.GetClasses(facade.GetClassData(target_node_id));
|
||||
|
||||
const auto number_of_segments = leg_geometry.GetNumberOfSegments();
|
||||
|
||||
@@ -88,7 +87,8 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
||||
IntermediateIntersection::NO_INDEX,
|
||||
0,
|
||||
util::guidance::LaneTuple(),
|
||||
{}};
|
||||
{},
|
||||
source_classes};
|
||||
|
||||
if (leg_data.size() > 0)
|
||||
{
|
||||
@@ -118,7 +118,8 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
||||
const auto destinations = facade.GetDestinationsForID(step_name_id);
|
||||
const auto exits = facade.GetExitsForID(step_name_id);
|
||||
const auto distance = leg_geometry.segment_distances[segment_index];
|
||||
auto classes = facade.GetClasses(path_point.classes);
|
||||
// intersections contain the classes of exiting road
|
||||
intersection.classes = facade.GetClasses(path_point.classes);
|
||||
|
||||
steps.push_back(RouteStep{step_name_id,
|
||||
name.to_string(),
|
||||
@@ -135,8 +136,7 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
||||
maneuver,
|
||||
leg_geometry.FrontIndex(segment_index),
|
||||
leg_geometry.BackIndex(segment_index) + 1,
|
||||
{intersection},
|
||||
std::move(classes)});
|
||||
{intersection}});
|
||||
|
||||
if (leg_data_index + 1 < leg_data.size())
|
||||
{
|
||||
@@ -196,6 +196,8 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
||||
const auto distance = leg_geometry.segment_distances[segment_index];
|
||||
const EdgeWeight duration = segment_duration + target_duration;
|
||||
const EdgeWeight weight = segment_weight + target_weight;
|
||||
// intersections contain the classes of exiting road
|
||||
intersection.classes = facade.GetClasses(facade.GetClassData(target_node_id));
|
||||
BOOST_ASSERT(duration >= 0);
|
||||
steps.push_back(RouteStep{step_name_id,
|
||||
facade.GetNameForID(step_name_id).to_string(),
|
||||
@@ -212,8 +214,7 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
||||
maneuver,
|
||||
leg_geometry.FrontIndex(segment_index),
|
||||
leg_geometry.BackIndex(segment_index) + 1,
|
||||
{intersection},
|
||||
std::move(target_classes)});
|
||||
{intersection}});
|
||||
}
|
||||
// In this case the source + target are on the same edge segment
|
||||
else
|
||||
@@ -255,8 +256,7 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
||||
std::move(maneuver),
|
||||
leg_geometry.FrontIndex(segment_index),
|
||||
leg_geometry.BackIndex(segment_index) + 1,
|
||||
{intersection},
|
||||
std::move(source_classes)});
|
||||
{intersection}});
|
||||
}
|
||||
|
||||
BOOST_ASSERT(segment_index == number_of_segments - 1);
|
||||
@@ -269,6 +269,7 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
||||
0,
|
||||
IntermediateIntersection::NO_INDEX,
|
||||
util::guidance::LaneTuple(),
|
||||
{},
|
||||
{}};
|
||||
|
||||
// This step has length zero, the only reason we need it is the target location
|
||||
@@ -295,8 +296,7 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
||||
std::move(maneuver),
|
||||
leg_geometry.locations.size() - 1,
|
||||
leg_geometry.locations.size(),
|
||||
{intersection},
|
||||
std::move(target_classes)});
|
||||
{intersection}});
|
||||
|
||||
BOOST_ASSERT(steps.front().intersections.size() == 1);
|
||||
BOOST_ASSERT(steps.front().intersections.front().bearings.size() == 1);
|
||||
|
||||
@@ -42,6 +42,7 @@ struct IntermediateIntersection
|
||||
// turn lane information
|
||||
util::guidance::LaneTuple lanes;
|
||||
extractor::guidance::TurnLaneDescription lane_description;
|
||||
std::vector<std::string> classes;
|
||||
};
|
||||
|
||||
inline IntermediateIntersection getInvalidIntersection()
|
||||
@@ -52,6 +53,7 @@ inline IntermediateIntersection getInvalidIntersection()
|
||||
IntermediateIntersection::NO_INDEX,
|
||||
IntermediateIntersection::NO_INDEX,
|
||||
util::guidance::LaneTuple(),
|
||||
{},
|
||||
{}};
|
||||
}
|
||||
|
||||
@@ -74,7 +76,6 @@ struct RouteStep
|
||||
std::size_t geometry_begin;
|
||||
std::size_t geometry_end;
|
||||
std::vector<IntermediateIntersection> intersections;
|
||||
std::vector<std::string> classes;
|
||||
|
||||
// remove all information from the route step, marking it as invalid (used to indicate empty
|
||||
// steps to be removed).
|
||||
@@ -128,7 +129,6 @@ inline void RouteStep::Invalidate()
|
||||
geometry_end = 0;
|
||||
intersections.clear();
|
||||
intersections.push_back(getInvalidIntersection());
|
||||
classes.clear();
|
||||
}
|
||||
|
||||
// Elongate by another step in front
|
||||
|
||||
@@ -176,6 +176,64 @@ inline engine_config_ptr argumentsToEngineConfig(const Nan::FunctionCallbackInfo
|
||||
return engine_config_ptr();
|
||||
}
|
||||
|
||||
// Set EngineConfig system-wide limits on construction, if requested
|
||||
|
||||
auto max_locations_trip = params->Get(Nan::New("max_locations_trip").ToLocalChecked());
|
||||
auto max_locations_viaroute = params->Get(Nan::New("max_locations_viaroute").ToLocalChecked());
|
||||
auto max_locations_distance_table =
|
||||
params->Get(Nan::New("max_locations_distance_table").ToLocalChecked());
|
||||
auto max_locations_map_matching =
|
||||
params->Get(Nan::New("max_locations_map_matching").ToLocalChecked());
|
||||
auto max_results_nearest = params->Get(Nan::New("max_results_nearest").ToLocalChecked());
|
||||
auto max_alternatives = params->Get(Nan::New("max_alternatives").ToLocalChecked());
|
||||
|
||||
if (!max_locations_trip->IsUndefined() && !max_locations_trip->IsNumber())
|
||||
{
|
||||
Nan::ThrowError("max_locations_trip must be an integral number");
|
||||
return engine_config_ptr();
|
||||
}
|
||||
if (!max_locations_viaroute->IsUndefined() && !max_locations_viaroute->IsNumber())
|
||||
{
|
||||
Nan::ThrowError("max_locations_viaroute must be an integral number");
|
||||
return engine_config_ptr();
|
||||
}
|
||||
if (!max_locations_distance_table->IsUndefined() && !max_locations_distance_table->IsNumber())
|
||||
{
|
||||
Nan::ThrowError("max_locations_distance_table must be an integral number");
|
||||
return engine_config_ptr();
|
||||
}
|
||||
if (!max_locations_map_matching->IsUndefined() && !max_locations_map_matching->IsNumber())
|
||||
{
|
||||
Nan::ThrowError("max_locations_map_matching must be an integral number");
|
||||
return engine_config_ptr();
|
||||
}
|
||||
if (!max_results_nearest->IsUndefined() && !max_results_nearest->IsNumber())
|
||||
{
|
||||
Nan::ThrowError("max_results_nearest must be an integral number");
|
||||
return engine_config_ptr();
|
||||
}
|
||||
if (!max_alternatives->IsUndefined() && !max_alternatives->IsNumber())
|
||||
{
|
||||
Nan::ThrowError("max_alternatives must be an integral number");
|
||||
return engine_config_ptr();
|
||||
}
|
||||
|
||||
if (max_locations_trip->IsNumber())
|
||||
engine_config->max_locations_trip = static_cast<int>(max_locations_trip->NumberValue());
|
||||
if (max_locations_viaroute->IsNumber())
|
||||
engine_config->max_locations_viaroute =
|
||||
static_cast<int>(max_locations_viaroute->NumberValue());
|
||||
if (max_locations_distance_table->IsNumber())
|
||||
engine_config->max_locations_distance_table =
|
||||
static_cast<int>(max_locations_distance_table->NumberValue());
|
||||
if (max_locations_map_matching->IsNumber())
|
||||
engine_config->max_locations_map_matching =
|
||||
static_cast<int>(max_locations_map_matching->NumberValue());
|
||||
if (max_results_nearest->IsNumber())
|
||||
engine_config->max_results_nearest = static_cast<int>(max_results_nearest->NumberValue());
|
||||
if (max_alternatives->IsNumber())
|
||||
engine_config->max_alternatives = static_cast<int>(max_alternatives->NumberValue());
|
||||
|
||||
return engine_config;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "osrm",
|
||||
"version": "5.9.0-rc.2",
|
||||
"version": "5.9.0",
|
||||
"private": false,
|
||||
"description": "The Open Source Routing Machine is a high performance routing engine written in C++14 designed to run on OpenStreetMap data.",
|
||||
"dependencies": {
|
||||
|
||||
@@ -72,6 +72,12 @@ local profile = {
|
||||
|
||||
restricted_highway_whitelist = Set { },
|
||||
|
||||
construction_whitelist = Set {
|
||||
'no',
|
||||
'widening',
|
||||
'minor',
|
||||
},
|
||||
|
||||
access_tags_hierarchy = Sequence {
|
||||
'bicycle',
|
||||
'vehicle',
|
||||
|
||||
@@ -94,6 +94,13 @@ local profile = {
|
||||
'access'
|
||||
},
|
||||
|
||||
construction_whitelist = Set {
|
||||
'no',
|
||||
'widening',
|
||||
'minor',
|
||||
},
|
||||
|
||||
|
||||
service_tag_forbidden = Set {
|
||||
'emergency_access'
|
||||
},
|
||||
|
||||
@@ -61,6 +61,8 @@ local profile = {
|
||||
|
||||
restricted_highway_whitelist = Set { },
|
||||
|
||||
construction_whitelist = Set {},
|
||||
|
||||
access_tags_hierarchy = Sequence {
|
||||
'foot',
|
||||
'access'
|
||||
|
||||
@@ -520,7 +520,7 @@ function Handlers.handle_blocked_ways(way,result,data,profile)
|
||||
local construction = way:get_value_by_key('construction')
|
||||
|
||||
-- Of course there are negative tags to handle, too
|
||||
if construction and construction ~= 'no' and construction ~= 'widening' then
|
||||
if construction and not profile.construction_whitelist[construction] then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
@@ -234,6 +234,18 @@ util::json::Object makeIntersection(const guidance::IntermediateIntersection &in
|
||||
if (detail::hasValidLanes(intersection))
|
||||
result.values["lanes"] = detail::lanesFromIntersection(intersection);
|
||||
|
||||
if (!intersection.classes.empty())
|
||||
{
|
||||
util::json::Array classes;
|
||||
classes.values.reserve(intersection.classes.size());
|
||||
std::transform(
|
||||
intersection.classes.begin(),
|
||||
intersection.classes.end(),
|
||||
std::back_inserter(classes.values),
|
||||
[](const std::string &class_name) { return util::json::String{class_name}; });
|
||||
result.values["classes"] = std::move(classes);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -265,18 +277,6 @@ util::json::Object makeRouteStep(guidance::RouteStep step, util::json::Value geo
|
||||
route_step.values["maneuver"] = makeStepManeuver(std::move(step.maneuver));
|
||||
route_step.values["geometry"] = std::move(geometry);
|
||||
|
||||
if (!step.classes.empty())
|
||||
{
|
||||
util::json::Array classes;
|
||||
classes.values.reserve(step.classes.size());
|
||||
std::transform(
|
||||
step.classes.begin(),
|
||||
step.classes.end(),
|
||||
std::back_inserter(classes.values),
|
||||
[](const std::string &class_name) { return util::json::String{class_name}; });
|
||||
route_step.values["classes"] = std::move(classes);
|
||||
}
|
||||
|
||||
util::json::Array intersections;
|
||||
intersections.values.reserve(step.intersections.size());
|
||||
std::transform(step.intersections.begin(),
|
||||
|
||||
@@ -486,7 +486,6 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry)
|
||||
auto &new_next_to_last = *(steps.end() - 2);
|
||||
next_to_last_step.AdaptStepSignage(new_next_to_last);
|
||||
next_to_last_step.mode = new_next_to_last.mode;
|
||||
next_to_last_step.classes = new_next_to_last.classes;
|
||||
// the geometry indices of the last step are already correct;
|
||||
}
|
||||
else if (util::coordinate_calculation::haversineDistance(
|
||||
|
||||
@@ -88,10 +88,7 @@ TurnInstruction IntersectionHandler::getInstructionForObvious(const std::size_t
|
||||
// handle travel modes:
|
||||
const auto in_mode = node_based_graph.GetEdgeData(via_edge).travel_mode;
|
||||
const auto out_mode = node_based_graph.GetEdgeData(road.eid).travel_mode;
|
||||
const auto in_classes = node_based_graph.GetEdgeData(via_edge).classes;
|
||||
const auto out_classes = node_based_graph.GetEdgeData(road.eid).classes;
|
||||
// if we just lose class flags we don't want to notify
|
||||
const auto needs_notification = in_mode != out_mode || !isSubset(out_classes, in_classes);
|
||||
const auto needs_notification = in_mode != out_mode;
|
||||
|
||||
if (type == TurnType::Turn)
|
||||
{
|
||||
|
||||
@@ -118,6 +118,9 @@ Intersection MotorwayHandler::fromMotorway(const EdgeID via_eid, Intersection in
|
||||
const auto getContinueAngle = [this, in_data](const Intersection &intersection) {
|
||||
for (const auto &road : intersection)
|
||||
{
|
||||
if (!road.entry_allowed)
|
||||
continue;
|
||||
|
||||
const auto &out_data = node_based_graph.GetEdgeData(road.eid);
|
||||
|
||||
const auto same_name = !util::guidance::requiresNameAnnounced(
|
||||
|
||||
@@ -98,6 +98,37 @@ test('constructor: throws if data doesn\'t match algorithm', function(assert) {
|
||||
assert.throws(function() { new OSRM({algorithm: 'MLD', path: monaco_path}); });
|
||||
});
|
||||
|
||||
test('constructor: parses custom limits', function(assert) {
|
||||
assert.plan(1);
|
||||
var osrm = new OSRM({
|
||||
path: monaco_mld_path,
|
||||
algorithm: 'MLD',
|
||||
max_locations_trip: 1,
|
||||
max_locations_viaroute: 1,
|
||||
max_locations_distance_table: 1,
|
||||
max_locations_map_matching: 1,
|
||||
max_results_nearest: 1,
|
||||
max_alternatives: 1,
|
||||
});
|
||||
assert.ok(osrm);
|
||||
});
|
||||
|
||||
test('constructor: throws on invalid custom limits', function(assert) {
|
||||
assert.plan(1);
|
||||
assert.throws(function() {
|
||||
var osrm = new OSRM({
|
||||
path: monaco_mld_path,
|
||||
algorithm: 'MLD',
|
||||
max_locations_trip: 'unlimited',
|
||||
max_locations_viaroute: true,
|
||||
max_locations_distance_table: false,
|
||||
max_locations_map_matching: 'a lot',
|
||||
max_results_nearest: null,
|
||||
max_alternatives: '10'
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
require('./route.js');
|
||||
require('./trip.js');
|
||||
require('./match.js');
|
||||
|
||||
@@ -549,3 +549,30 @@ test('route: throws on bad approaches', function(assert) {
|
||||
}, function(err, route) {}) },
|
||||
/Approach must be a string: \[curb, unrestricted\] or null/);
|
||||
});
|
||||
|
||||
test('route: routes Monaco with custom limits on MLD', function(assert) {
|
||||
assert.plan(2);
|
||||
var osrm = new OSRM({
|
||||
path: monaco_mld_path,
|
||||
algorithm: 'MLD',
|
||||
max_alternatives: 10,
|
||||
});
|
||||
osrm.route({coordinates: two_test_coordinates, alternatives: 10}, function(err, route) {
|
||||
assert.ifError(err);
|
||||
assert.ok(Array.isArray(route.routes));
|
||||
});
|
||||
});
|
||||
|
||||
test('route: in Monaco with custom limits on MLD', function(assert) {
|
||||
assert.plan(1);
|
||||
var osrm = new OSRM({
|
||||
path: monaco_mld_path,
|
||||
algorithm: 'MLD',
|
||||
max_alternatives: 10,
|
||||
});
|
||||
osrm.route({coordinates: two_test_coordinates, alternatives: 11}, function(err, route) {
|
||||
console.log(err)
|
||||
assert.equal(err.message, 'TooBig');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ BOOST_AUTO_TEST_CASE(trim_short_segments)
|
||||
IntermediateIntersection::NO_INDEX,
|
||||
0,
|
||||
{0, 255},
|
||||
{},
|
||||
{}};
|
||||
IntermediateIntersection intersection2{{FloatLongitude{-73.981495}, FloatLatitude{40.768275}},
|
||||
{180},
|
||||
@@ -30,6 +31,7 @@ BOOST_AUTO_TEST_CASE(trim_short_segments)
|
||||
0,
|
||||
IntermediateIntersection::NO_INDEX,
|
||||
{0, 255},
|
||||
{},
|
||||
{}};
|
||||
|
||||
// Check that duplicated coordinate in the end is removed
|
||||
@@ -53,8 +55,7 @@ BOOST_AUTO_TEST_CASE(trim_short_segments)
|
||||
0},
|
||||
0,
|
||||
3,
|
||||
{intersection1},
|
||||
{}},
|
||||
{intersection1}},
|
||||
{324,
|
||||
"Central Park West",
|
||||
"",
|
||||
@@ -75,8 +76,7 @@ BOOST_AUTO_TEST_CASE(trim_short_segments)
|
||||
0},
|
||||
2,
|
||||
3,
|
||||
{intersection2},
|
||||
{}}};
|
||||
{intersection2}}};
|
||||
|
||||
LegGeometry geometry;
|
||||
geometry.locations = {{FloatLongitude{-73.981492}, FloatLatitude{40.768258}},
|
||||
|
||||
Reference in New Issue
Block a user