Compare commits

...

16 Commits

Author SHA1 Message Date
Michael Krasnyk
a2c7f82ec8
Bump RC6 2018-02-21 15:08:36 +01:00
Michael Krasnyk
be49ed3e91
Check required tags of maneuver relations 2018-02-21 14:49:53 +01:00
Michael Krasnyk
6763d4c097
Handle motorway forks with links as a normal motorway ...
passing some ramps or mering onto another motorway
2018-02-21 14:21:52 +01:00
Michael Krasnyk
6d2860e909
Test case for a highway fork with a link 2018-02-21 14:21:48 +01:00
Michael Krasnyk
d2764bc405
Don't use obvious directions at ramp bifurcations, #4895 2018-02-21 13:41:43 +01:00
Michael Krasnyk
005a146223
Test for a ramp bifurcation obviousness 2018-02-21 13:41:38 +01:00
Huyen Chau Nguyen
02754647f4 update package.json (#4889) 2018-02-15 16:15:01 +01:00
Huyen Chau Nguyen
82cebfa1f8 bump RC 5 2018-02-15 14:53:41 +01:00
Huyen Chau Nguyen
986bb6f93d Update package.json
add mkdirp and rimraf to bundledependencies in order for node-pre-gyp to properly install with node
2018-02-15 14:38:23 +01:00
Huyen Chau Nguyen
0c0ab78f13 move on to release candidate 4 2018-02-15 11:11:50 +01:00
Huyen Chau Nguyen
99cda66b58 bump RC3 2018-02-14 15:03:19 +01:00
Michael Krasnyk
27fa2fc1d0
Use links with lower priority in the motorway handler
Ref:
https://wiki.openstreetmap.org/wiki/Highway_link
https://wiki.openstreetmap.org/wiki/Link_roads_between_different_highways_types
2018-02-14 14:50:03 +01:00
Michael Krasnyk
7434f18d04
Add OSM node barrier=height_restrictor handling 2018-02-14 14:49:36 +01:00
Huyen Chau Nguyen
7d1a12a12d build osx binary for node4 and bump to RC 2 2018-02-13 15:43:08 +01:00
Patrick Niklaus
6d7420e4e5 Bump version to RC1 2018-02-10 00:37:41 +00:00
Patrick Niklaus
8a44660102 Enable 5.16 branch on travis 2018-02-10 00:36:49 +00:00
14 changed files with 217 additions and 80 deletions

View File

@ -13,6 +13,7 @@ notifications:
branches: branches:
only: only:
- master - master
- "5.16"
# enable building tags # enable building tags
- /^v\d+\.\d+(\.\d+)?(-\S*)?$/ - /^v\d+\.\d+(\.\d+)?(-\S*)?$/
@ -161,6 +162,14 @@ matrix:
after_success: after_success:
- ./scripts/travis/publish.sh - ./scripts/travis/publish.sh
- os: osx
osx_image: xcode9.2
compiler: "mason-osx-release-node-4"
# we use the xcode provides clang and don't install our own
env: ENABLE_MASON=ON BUILD_TYPE='Release' CUCUMBER_TIMEOUT=60000 CCOMPILER='clang' CXXCOMPILER='clang++' ENABLE_ASSERTIONS=ON ENABLE_LTO=ON NODE="4"
after_success:
- ./scripts/travis/publish.sh
# Shared Library # Shared Library
- os: linux - os: linux
compiler: "gcc-7-release-shared" compiler: "gcc-7-release-shared"

View File

@ -1,13 +1,18 @@
# UNRELEASED # 5.16.0 RC 6
- Changes from 5.15.1: - Changes from 5.15.1:
- Guidance - Guidance
- ADDED #4676: Support for maneuver override relation, allowing data-driven overrides for turn-by-turn instructions [#4676](https://github.com/Project-OSRM/osrm-backend/pull/4676) - ADDED #4676: Support for maneuver override relation, allowing data-driven overrides for turn-by-turn instructions [#4676](https://github.com/Project-OSRM/osrm-backend/pull/4676)
- CHANGED #4830: Announce reference change if names are empty - CHANGED #4830: Announce reference change if names are empty
- CHANGED #4835: MAXIMAL_ALLOWED_SEPARATION_WIDTH increased to 12 meters - CHANGED #4835: MAXIMAL_ALLOWED_SEPARATION_WIDTH increased to 12 meters
- CHANGED #4842: Lower priority links from a motorway now are used as motorway links [#4842](https://github.com/Project-OSRM/osrm-backend/pull/4842)
- CHANGED #4895: Use ramp bifurcations as fork intersections [#4895](https://github.com/Project-OSRM/osrm-backend/issues/4895)
- CHANGED #4893: Handle motorway forks with links as normal motorway intersections[#4893](https://github.com/Project-OSRM/osrm-backend/issues/4893)
- FIXED #4905: Check required tags of `maneuver` relations [#4905](https://github.com/Project-OSRM/osrm-backend/pull/4905)
- Profile: - Profile:
- FIXED: `highway=service` will now be used for restricted access, `access=private` is still disabled for snapping. - FIXED: `highway=service` will now be used for restricted access, `access=private` is still disabled for snapping.
- ADDED #4775: Exposes more information to the turn function, now being able to set turn weights with highway and access information of the turn as well as other roads at the intersection [#4775](https://github.com/Project-OSRM/osrm-backend/issues/4775) - ADDED #4775: Exposes more information to the turn function, now being able to set turn weights with highway and access information of the turn as well as other roads at the intersection [#4775](https://github.com/Project-OSRM/osrm-backend/issues/4775)
- FIXED: #4763: Add support for non-numerical units in car profile for maxheight [#4763](https://github.com/Project-OSRM/osrm-backend/issues/4763) - FIXED #4763: Add support for non-numerical units in car profile for maxheight [#4763](https://github.com/Project-OSRM/osrm-backend/issues/4763)
- ADDED #4872: Handling of `barrier=height_restrictor` nodes [#4872](https://github.com/Project-OSRM/osrm-backend/pull/4872)
# 5.15.1 # 5.15.1
- Changes from 5.15.0: - Changes from 5.15.0:

View File

@ -45,3 +45,11 @@ Feature: Car - Barriers
| bollard | | | | bollard | | |
| bollard | rising | x | | bollard | rising | x |
| bollard | removable | | | bollard | removable | |
Scenario: Car - Height restrictions
Then routability should be
| node/barrier | node/maxheight | bothw |
| height_restrictor | | x |
| height_restrictor | 1 | |
| height_restrictor | 3 | x |
| height_restrictor | default | x |

View File

@ -30,7 +30,7 @@ Feature: Maneuver tag support
When I route I should get When I route I should get
| waypoints | route | turns | | waypoints | route | turns |
# Testing directly connected from/to # Testing directly connected from/to
| a,j | A Street,C Street,J Street,J Street | depart,turn sharp right,turn left,arrive | | a,j | A Street,C Street,J Street,J Street | depart,turn sharp right,turn left,arrive |
| b,g | A Street,C Street,C Street | depart,turn sharp right,arrive | | b,g | A Street,C Street,C Street | depart,turn sharp right,arrive |
# Testing re-awakening suppressed turns # Testing re-awakening suppressed turns
@ -198,11 +198,26 @@ Feature: Maneuver tag support
| pt | 395 | no | primary | | pt | 395 | no | primary |
And the relations And the relations
| type | way:from | node:via | way:via | way:to | maneuver | | type | way:from | node:via | way:via | way:to | maneuver | # |
| maneuver | zy | p | yp | pt | suppress | | maneuver | zy | p | yp | pt | suppress | original: depart,on ramp left,fork slight left,arrive |
And the relations
| type | way:from | way:via | way:to | maneuver | # |
| maneuver | zy | yp | pb | suppress | invalid relation: missing node:via |
And the relations
| type | node:via | way:via | way:to | maneuver | # |
| maneuver | p | yp | pb | suppress | invalid relation: missing way:from |
And the relations
| type | way:from | node:via | way:via | maneuver | # |
| maneuver | zy | p | yp | suppress | invalid relation: missing way:to |
And the relations
| type | way:from | node:via | way:via | way:to | maneuver | # |
| maneuver | zy | y, p | yp | pb | suppress | invalid relation: multiple node:via |
When I route I should get When I route I should get
| waypoints | route | turns | | waypoints | route | turns |
| z,t | NY Ave,395,395 | depart,on ramp left,arrive | | z,t | NY Ave,395,395 | depart,on ramp left,arrive |
#original | z,t | NY Ave,,395,395 | depart,on ramp left,fork slight left,arrive | | z,b | NY Ave,,4th St,4th St | depart,on ramp left,fork slight right,arrive |

View File

@ -81,7 +81,7 @@ Feature: Motorway Guidance
""" """
,g,e ,g,e
,f,d ,f,d
a-b-c a-b-c
""" """
And the ways And the ways
@ -281,3 +281,67 @@ Feature: Motorway Guidance
| waypoints | route | turns | | waypoints | route | turns |
| a,d | , | depart,arrive | | a,d | , | depart,arrive |
| b,d | , | depart,arrive | | b,d | , | depart,arrive |
Scenario: Ramp Exit with Lower Priority
Given the node map
"""
a-b-c-d-e
`--f-g
"""
And the ways
| nodes | highway | oneway |
| abcde | trunk | |
| bfg | primary_link | yes |
When I route I should get
| waypoints | route | turns |
| a,e | abcde,abcde | depart,arrive |
| a,g | abcde,bfg,bfg | depart,off ramp slight right,arrive |
# https://www.openstreetmap.org/node/67366428#map=18/33.64613/-84.44425
Scenario: Ramp Bifurcations should not be suppressed
Given the node map
"""
/-----------c /-----------e
a---b------------------d------------f
"""
And the ways
| nodes | highway | name | destination |
| ab | motorway | | |
| bc | motorway_link | | City 17 |
| bd | motorway_link | | |
| de | motorway_link | | Domestic Terminal;Camp Creek Parkway;Riverdale Road |
| df | motorway_link | | Montgomery |
When I route I should get
| waypoints | route | turns |
| a,c | ,, | depart,fork slight left,arrive |
| a,e | ,,, | depart,fork slight right,fork slight left,arrive |
| a,f | ,,, | depart,fork slight right,fork slight right,arrive |
# https://www.openstreetmap.org/#map=19/53.46186/-2.24509
Scenario: Highway Fork with a Link
Given the node map
"""
/-----------d
a-b-c------------e
\-----------f
"""
And the ways
| nodes | highway |
| abce | motorway |
| cf | motorway |
| cd | motorway_link |
When I route I should get
| waypoints | route | turns |
| a,d | abce,cd,cd | depart,off ramp slight left,arrive |
| a,e | abce,abce | depart,arrive |
| a,f | abce,cf,cf | depart,turn slight right,arrive |

View File

@ -129,8 +129,12 @@ Feature: osrm-extract lua ways:get_nodes()
""" """
functions = require('testbot') functions = require('testbot')
functions.process_node = function(profile, node, result, relations)
print ('node ' .. tostring(node:get_location_tag('answer')))
end
functions.process_way = function(profile, way, result, relations) functions.process_way = function(profile, way, result, relations)
print ('answer ' .. tostring(way:get_location_tag('answer'))) print ('way ' .. tostring(way:get_location_tag('answer')))
result.forward_mode = mode.driving result.forward_mode = mode.driving
result.forward_speed = 1 result.forward_speed = 1
end end
@ -148,4 +152,5 @@ Feature: osrm-extract lua ways:get_nodes()
When I run "osrm-extract --profile {profile_file} {osm_file} --location-dependent-data test/data/regions/null-island.geojson" When I run "osrm-extract --profile {profile_file} {osm_file} --location-dependent-data test/data/regions/null-island.geojson"
Then it should exit successfully Then it should exit successfully
And stdout should contain "answer 42" And stdout should contain "node 42"
And stdout should contain "way 42"

View File

@ -1,12 +1,14 @@
{ {
"name": "osrm", "name": "osrm",
"version": "5.16.0-latest.1", "version": "5.16.0-rc.6",
"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": {
"mkdirp": "^0.5.1",
"nan": "^2.6.2", "nan": "^2.6.2",
"node-cmake": "^2.3.2", "node-cmake": "^2.3.2",
"node-pre-gyp": "^0.6.36" "node-pre-gyp": "^0.6.36",
"rimraf": "^2.5.4"
}, },
"browserify": { "browserify": {
"transform": [ "transform": [
@ -45,18 +47,18 @@
"documentation": "^4.0.0-rc.1", "documentation": "^4.0.0-rc.1",
"eslint": "^2.4.0", "eslint": "^2.4.0",
"faucet": "^0.0.1", "faucet": "^0.0.1",
"mkdirp": "^0.5.1",
"node-timeout": "0.0.4", "node-timeout": "0.0.4",
"polyline": "^0.2.0", "polyline": "^0.2.0",
"request": "^2.69.0", "request": "^2.69.0",
"rimraf": "^2.5.4",
"tape": "^4.7.0", "tape": "^4.7.0",
"xmlbuilder": "^4.2.1" "xmlbuilder": "^4.2.1"
}, },
"bundleDependencies": [ "bundleDependencies": [
"mkdirp",
"nan", "nan",
"node-cmake", "node-cmake",
"node-pre-gyp" "node-pre-gyp",
"rimraf"
], ],
"main": "lib/index.js", "main": "lib/index.js",
"binary": { "binary": {

View File

@ -9,6 +9,7 @@ Relations = require("lib/relations")
find_access_tag = require("lib/access").find_access_tag find_access_tag = require("lib/access").find_access_tag
limit = require("lib/maxspeed").limit limit = require("lib/maxspeed").limit
Utils = require("lib/utils") Utils = require("lib/utils")
Measure = require("lib/measure")
function setup() function setup()
return { return {
@ -54,7 +55,8 @@ function setup()
'gate', 'gate',
'lift_gate', 'lift_gate',
'no', 'no',
'entrance' 'entrance',
'height_restrictor'
}, },
access_tag_whitelist = Set { access_tag_whitelist = Set {
@ -320,11 +322,18 @@ function process_node(profile, node, result, relations)
else else
local barrier = node:get_value_by_key("barrier") local barrier = node:get_value_by_key("barrier")
if barrier then if barrier then
-- check height restriction barriers
local restricted_by_height = false
if barrier == 'height_restrictor' then
local maxheight = Measure.get_max_height(node:get_value_by_key("maxheight"), node)
restricted_by_height = maxheight and maxheight < profile.vehicle_height
end
-- make an exception for rising bollard barriers -- make an exception for rising bollard barriers
local bollard = node:get_value_by_key("bollard") local bollard = node:get_value_by_key("bollard")
local rising_bollard = bollard and "rising" == bollard local rising_bollard = bollard and "rising" == bollard
if not profile.barrier_whitelist[barrier] and not rising_bollard then if not profile.barrier_whitelist[barrier] and not rising_bollard or restricted_by_height then
result.barrier = true result.barrier = true
end end
end end

View File

@ -62,11 +62,11 @@ local height_non_numerical_values = Set { "default", "none", "no-sign", "unsigne
--- Get maxheight of specified way in meters. If there are no --- Get maxheight of specified way in meters. If there are no
--- max height, then return nil --- max height, then return nil
function Measure.get_max_height(raw_value,way) function Measure.get_max_height(raw_value, element)
if raw_value then if raw_value then
if height_non_numerical_values[raw_value] then if height_non_numerical_values[raw_value] then
if way then if element then
return way:get_location_tag('maxheight') or default_maxheight return element:get_location_tag('maxheight') or default_maxheight
else else
return default_maxheight return default_maxheight
end end

View File

@ -52,8 +52,10 @@ ManeuverOverrideRelationParser::TryParse(const osmium::Relation &relation) const
maneuver_override.maneuver = relation.tags().get_value_by_key("maneuver", ""); maneuver_override.maneuver = relation.tags().get_value_by_key("maneuver", "");
maneuver_override.direction = relation.tags().get_value_by_key("direction", ""); maneuver_override.direction = relation.tags().get_value_by_key("direction", "");
boost::optional<std::uint64_t> from = boost::none, via = boost::none, to = boost::none; bool valid_relation = true;
std::vector<std::uint64_t> via_ways; OSMNodeID via_node = SPECIAL_OSM_NODEID;
OSMWayID from = SPECIAL_OSM_WAYID, to = SPECIAL_OSM_WAYID;
std::vector<OSMWayID> via_ways;
for (const auto &member : relation.members()) for (const auto &member : relation.members())
{ {
@ -74,8 +76,9 @@ ManeuverOverrideRelationParser::TryParse(const osmium::Relation &relation) const
continue; continue;
} }
BOOST_ASSERT(0 == strcmp("via", role)); BOOST_ASSERT(0 == strcmp("via", role));
via = static_cast<std::uint64_t>(member.ref());
// set via node id // set via node id
valid_relation &= via_node == SPECIAL_OSM_NODEID;
via_node = OSMNodeID{static_cast<std::uint64_t>(member.ref())};
break; break;
} }
case osmium::item_type::way: case osmium::item_type::way:
@ -83,15 +86,17 @@ ManeuverOverrideRelationParser::TryParse(const osmium::Relation &relation) const
0 == strcmp("via", role)); 0 == strcmp("via", role));
if (0 == strcmp("from", role)) if (0 == strcmp("from", role))
{ {
from = static_cast<std::uint64_t>(member.ref()); valid_relation &= from == SPECIAL_OSM_WAYID;
from = OSMWayID{static_cast<std::uint64_t>(member.ref())};
} }
else if (0 == strcmp("to", role)) else if (0 == strcmp("to", role))
{ {
to = static_cast<std::uint64_t>(member.ref()); valid_relation &= to == SPECIAL_OSM_WAYID;
to = OSMWayID{static_cast<std::uint64_t>(member.ref())};
} }
else if (0 == strcmp("via", role)) else if (0 == strcmp("via", role))
{ {
via_ways.push_back(static_cast<std::uint64_t>(member.ref())); via_ways.push_back(OSMWayID{static_cast<std::uint64_t>(member.ref())});
} }
break; break;
case osmium::item_type::relation: case osmium::item_type::relation:
@ -103,18 +108,17 @@ ManeuverOverrideRelationParser::TryParse(const osmium::Relation &relation) const
} }
} }
if (from && (via || via_ways.size() > 0) && to) // Check required roles
valid_relation &= from != SPECIAL_OSM_WAYID;
valid_relation &= to != SPECIAL_OSM_WAYID;
valid_relation &= via_node != SPECIAL_OSM_NODEID;
if (valid_relation)
{ {
via_ways.insert(via_ways.begin(), *from); maneuver_override.via_ways.push_back(from);
via_ways.push_back(*to); std::copy(via_ways.begin(), via_ways.end(), std::back_inserter(maneuver_override.via_ways));
if (via) maneuver_override.via_ways.push_back(to);
{ maneuver_override.via_node = via_node;
maneuver_override.via_node = {*via};
}
for (const auto &n : via_ways)
{
maneuver_override.via_ways.push_back(OSMWayID{n});
}
} }
else else
{ {

View File

@ -218,6 +218,22 @@ void Sol2ScriptingEnvironment::InitContext(LuaScriptingContext &context)
"valid", "valid",
&osmium::Location::valid); &osmium::Location::valid);
auto get_location_tag = [](auto &context, const auto &location, const char *key) {
if (context.location_dependent_data.empty())
return sol::object(sol::nil);
const LocationDependentData::point_t point{location.lon(), location.lat()};
if (!boost::geometry::equals(context.last_location_point, point))
{
context.last_location_point = point;
context.last_location_indexes =
context.location_dependent_data.GetPropertyIndexes(point);
}
auto value = context.location_dependent_data.FindByKey(context.last_location_indexes, key);
return boost::apply_visitor(to_lua_object(context.state), value);
};
context.state.new_usertype<osmium::Way>( context.state.new_usertype<osmium::Way>(
"Way", "Way",
"get_value_by_key", "get_value_by_key",
@ -229,37 +245,29 @@ void Sol2ScriptingEnvironment::InitContext(LuaScriptingContext &context)
"get_nodes", "get_nodes",
[](const osmium::Way &way) { return sol::as_table(way.nodes()); }, [](const osmium::Way &way) { return sol::as_table(way.nodes()); },
"get_location_tag", "get_location_tag",
[&context](const osmium::Way &way, const char *key) { [&context, &get_location_tag](const osmium::Way &way, const char *key) {
if (context.location_dependent_data.empty())
return sol::object(sol::nil);
// HEURISTIC: use a single node (last) of the way to localize the way // HEURISTIC: use a single node (last) of the way to localize the way
// For more complicated scenarios a proper merging of multiple tags // For more complicated scenarios a proper merging of multiple tags
// at one or many locations must be provided // at one or many locations must be provided
const auto &nodes = way.nodes(); const auto &nodes = way.nodes();
const auto &location = nodes.back().location(); const auto &location = nodes.back().location();
const LocationDependentData::point_t point{location.lon(), location.lat()}; return get_location_tag(context, location, key);
if (!boost::geometry::equals(context.last_location_point, point))
{
context.last_location_point = point;
context.last_location_indexes =
context.location_dependent_data.GetPropertyIndexes(point);
}
auto value =
context.location_dependent_data.FindByKey(context.last_location_indexes, key);
return boost::apply_visitor(to_lua_object(context.state), value);
}); });
context.state.new_usertype<osmium::Node>("Node", context.state.new_usertype<osmium::Node>(
"location", "Node",
&osmium::Node::location, "location",
"get_value_by_key", &osmium::Node::location,
&get_value_by_key<osmium::Node>, "get_value_by_key",
"id", &get_value_by_key<osmium::Node>,
&osmium::Node::id, "id",
"version", &osmium::Node::id,
&osmium::Node::version); "version",
&osmium::Node::version,
"get_location_tag",
[&context, &get_location_tag](const osmium::Node &node, const char *key) {
return get_location_tag(context, node.location(), key);
});
context.state.new_usertype<ExtractionNode>("ResultNode", context.state.new_usertype<ExtractionNode>("ResultNode",
"traffic_lights", "traffic_lights",

View File

@ -31,9 +31,13 @@ inline extractor::RoadClassification roadClass(const ConnectedRoad &road,
return graph.GetEdgeData(road.eid).flags.road_classification; return graph.GetEdgeData(road.eid).flags.road_classification;
} }
inline bool isRampClass(EdgeID eid, const util::NodeBasedDynamicGraph &node_based_graph) inline bool isRampClass(EdgeID eid,
const util::NodeBasedDynamicGraph &node_based_graph,
bool from_motorway = true)
{ {
return node_based_graph.GetEdgeData(eid).flags.road_classification.IsRampClass(); return node_based_graph.GetEdgeData(eid).flags.road_classification.IsRampClass() ||
(from_motorway &&
node_based_graph.GetEdgeData(eid).flags.road_classification.IsLinkClass());
} }
} // namespace } // namespace
@ -63,6 +67,8 @@ bool MotorwayHandler::canProcess(const NodeID,
const EdgeID via_eid, const EdgeID via_eid,
const Intersection &intersection) const const Intersection &intersection) const
{ {
const bool from_motorway = isMotorwayClass(via_eid, node_based_graph);
bool has_motorway = false; bool has_motorway = false;
bool has_normal_roads = false; bool has_normal_roads = false;
@ -76,14 +82,14 @@ bool MotorwayHandler::canProcess(const NodeID,
if (road.entry_allowed) if (road.entry_allowed)
has_motorway = true; has_motorway = true;
} }
else if (!isRampClass(road.eid, node_based_graph)) else if (!isRampClass(road.eid, node_based_graph, from_motorway))
has_normal_roads = true; has_normal_roads = true;
} }
if (has_normal_roads) if (has_normal_roads)
return false; return false;
return has_motorway || isMotorwayClass(via_eid, node_based_graph); return has_motorway || from_motorway;
} }
Intersection MotorwayHandler:: Intersection MotorwayHandler::
@ -112,16 +118,6 @@ Intersection MotorwayHandler::fromMotorway(const EdgeID via_eid, Intersection in
node_data_container.GetAnnotation(node_based_graph.GetEdgeData(via_eid).annotation_data); node_data_container.GetAnnotation(node_based_graph.GetEdgeData(via_eid).annotation_data);
BOOST_ASSERT(isMotorwayClass(via_eid, node_based_graph)); BOOST_ASSERT(isMotorwayClass(via_eid, node_based_graph));
const auto countExitingMotorways = [this](const Intersection &intersection) {
unsigned count = 0;
for (const auto &road : intersection)
{
if (road.entry_allowed && isMotorwayClass(road.eid, node_based_graph))
++count;
}
return count;
};
// find the angle that continues on our current highway // find the angle that continues on our current highway
const auto getContinueAngle = [this, in_data](const Intersection &intersection) { const auto getContinueAngle = [this, in_data](const Intersection &intersection) {
for (const auto &road : intersection) for (const auto &road : intersection)
@ -213,7 +209,13 @@ Intersection MotorwayHandler::fromMotorway(const EdgeID via_eid, Intersection in
} }
else else
{ {
const unsigned exiting_motorways = countExitingMotorways(intersection); const auto valid_exits = std::count_if(intersection.begin(),
intersection.end(),
[](const auto &road) { return road.entry_allowed; });
const auto exiting_motorways =
std::count_if(intersection.begin(), intersection.end(), [this](const auto &road) {
return road.entry_allowed && isMotorwayClass(road.eid, node_based_graph);
});
if (exiting_motorways == 0) if (exiting_motorways == 0)
{ {
@ -227,7 +229,7 @@ Intersection MotorwayHandler::fromMotorway(const EdgeID via_eid, Intersection in
} }
} }
} }
else if (exiting_motorways == 1) else if (exiting_motorways == 1 || exiting_motorways != valid_exits)
{ {
// normal motorway passing some ramps or mering onto another motorway // normal motorway passing some ramps or mering onto another motorway
if (intersection.size() == 2) if (intersection.size() == 2)

View File

@ -249,8 +249,13 @@ Intersection TurnHandler::handleThreeWayTurn(const EdgeID via_edge, Intersection
OOOOOOO OOOOOOO
*/ */
const auto all_ramps =
std::all_of(intersection.begin(), intersection.end(), [this](const auto &road) {
return node_based_graph.GetEdgeData(road.eid).flags.road_classification.IsRampClass();
});
auto fork = findFork(via_edge, intersection); auto fork = findFork(via_edge, intersection);
if (fork && obvious_index == 0) if (fork && (all_ramps || obvious_index == 0))
{ {
assignFork(via_edge, fork->getLeft(), fork->getRight()); assignFork(via_edge, fork->getLeft(), fork->getRight());
} }

View File

@ -139,6 +139,7 @@
{"key": "access", "value": "emergency"}, {"key": "access", "value": "emergency"},
{"key": "access", "value": "psv"}, {"key": "access", "value": "psv"},
{"key": "access", "value": "delivery"}, {"key": "access", "value": "delivery"},
{"key": "maxheight", "object_types": ["node", "way"]},
{"key": "maxspeed", "value": "none"}, {"key": "maxspeed", "value": "none"},
{"key": "maxspeed", "value": "urban"}, {"key": "maxspeed", "value": "urban"},
{"key": "maxspeed", "value": "rural"}, {"key": "maxspeed", "value": "rural"},