This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository osrm.
commit 07ea59d4000c75ce7d7a65c7acddc69c52dbd649 Author: Bas Couwenberg <[email protected]> Date: Tue Aug 9 16:16:55 2016 +0200 Imported Upstream version 5.3.2+ds --- CHANGELOG.md | 5 ++++ CMakeLists.txt | 2 +- features/guidance/trimming.feature | 52 +++++++++++++++++++++++++++++++++ src/engine/guidance/post_processing.cpp | 38 ++++++++++++++++-------- 4 files changed, 84 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 760a74b..abf3326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 5.3.2 + Changes from 5.3.1 + - Bugfixes + - fixed a bug that occurred when trimming very short segments at the begin/end of a route (less than 1 meter) + # 5.3.1 Changes from 5.3.1 - Bugfixes: diff --git a/CMakeLists.txt b/CMakeLists.txt index 04d8759..c6518c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ endif() project(OSRM C CXX) set(OSRM_VERSION_MAJOR 5) set(OSRM_VERSION_MINOR 3) -set(OSRM_VERSION_PATCH 1) +set(OSRM_VERSION_PATCH 2) # these two functions build up custom variables: # OSRM_INCLUDE_PATHS and OSRM_DEFINES diff --git a/features/guidance/trimming.feature b/features/guidance/trimming.feature new file mode 100644 index 0000000..62808a7 --- /dev/null +++ b/features/guidance/trimming.feature @@ -0,0 +1,52 @@ +@routing @guidance @post-processing +Feature: General Post-Processing related features + + Background: + Given the profile "car" + Given a grid size of 0.1 meters + + # this testcase used to crash geometry generation (at that time handled during intersection generation) + Scenario: Regression Test 2754 + Given the node map + | a | b | c | d | e | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | f | g | h | i | j | + + And the ways + | nodes | + | abcde | + | ef | + | fghij | + + When I route I should get + | waypoints | route | + | a,j | ef,ef | diff --git a/src/engine/guidance/post_processing.cpp b/src/engine/guidance/post_processing.cpp index e859667..2bf41ea 100644 --- a/src/engine/guidance/post_processing.cpp +++ b/src/engine/guidance/post_processing.cpp @@ -878,25 +878,34 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry) geometry.locations[0], geometry.locations[1]) <= 1; if (zero_length_step || duplicated_coordinate) { - // fixup the coordinate - geometry.locations.erase(geometry.locations.begin()); - geometry.annotations.erase(geometry.annotations.begin()); - geometry.osm_node_ids.erase(geometry.osm_node_ids.begin()); // remove the initial distance value geometry.segment_distances.erase(geometry.segment_distances.begin()); + const auto offset = zero_length_step ? geometry.segment_offsets[1] : 1; + if (offset > 0) + { + // fixup the coordinates/annotations/ids + geometry.locations.erase(geometry.locations.begin(), + geometry.locations.begin() + offset); + geometry.annotations.erase(geometry.annotations.begin(), + geometry.annotations.begin() + offset); + geometry.osm_node_ids.erase(geometry.osm_node_ids.begin(), + geometry.osm_node_ids.begin() + offset); + } + // We have to adjust the first step both for its name and the bearings if (zero_length_step) { + // since we are not only checking for epsilon but for a full meter, we can have multiple + // coordinates here. // move offsets to front - BOOST_ASSERT(geometry.segment_offsets[1] == 1); // geometry offsets have to be adjusted. Move all offsets to the front and reduce by // one. (This is an inplace forward one and reduce by one) std::transform(geometry.segment_offsets.begin() + 1, geometry.segment_offsets.end(), geometry.segment_offsets.begin(), - [](const std::size_t val) { return val - 1; }); + [offset](const std::size_t val) { return val - offset; }); geometry.segment_offsets.pop_back(); const auto ¤t_depart = steps.front(); @@ -937,9 +946,9 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry) } // and update the leg geometry indices for the removed entry - std::for_each(steps.begin(), steps.end(), [](RouteStep &step) { - --step.geometry_begin; - --step.geometry_end; + std::for_each(steps.begin(), steps.end(), [offset](RouteStep &step) { + step.geometry_begin -= offset; + step.geometry_end -= offset; }); auto &first_step = steps.front(); @@ -971,10 +980,12 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry) // all zero-length instructions if (next_to_last_step.distance <= 1 && steps.size() > 2) { - geometry.locations.pop_back(); - geometry.annotations.pop_back(); - geometry.osm_node_ids.pop_back(); geometry.segment_offsets.pop_back(); + // remove all the last coordinates from the geometry + geometry.locations.resize(geometry.segment_offsets.back() + 1); + geometry.annotations.resize(geometry.segment_offsets.back() + 1); + geometry.osm_node_ids.resize(geometry.segment_offsets.back() + 1); + BOOST_ASSERT(geometry.segment_distances.back() <= 1); geometry.segment_distances.pop_back(); @@ -983,6 +994,7 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry) next_to_last_step.maneuver.bearing_after = 0; next_to_last_step.intersections.front().lanes = util::guidance::LaneTupel(); next_to_last_step.intersections.front().lane_description.clear(); + next_to_last_step.geometry_end = next_to_last_step.geometry_begin + 1; BOOST_ASSERT(next_to_last_step.intersections.size() == 1); auto &last_intersection = next_to_last_step.intersections.back(); last_intersection.bearings = {last_intersection.bearings[last_intersection.in]}; @@ -1030,6 +1042,8 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry) last_step.intersections.front().bearings.front() = util::bearing::reverseBearing(bearing); } + BOOST_ASSERT(steps.back().geometry_end == geometry.locations.size()); + BOOST_ASSERT(steps.front().intersections.size() >= 1); BOOST_ASSERT(steps.front().intersections.front().bearings.size() == 1); BOOST_ASSERT(steps.front().intersections.front().entry.size() == 1); -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osrm.git _______________________________________________ Pkg-grass-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

