diff --git a/CHANGELOG.md b/CHANGELOG.md index bf5d777a1..5548f35d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - PR #3504 - debug tiles were very slow to generate due to unnecessarily copying data in a hot loop. - PR #3556 - fix an assertion in the walking profile triggered by tight spiral stairwells - PR #3469 - don't assert when identical coordinates are supplied to some calculations - OSM data contains these, we shouldn't crash. + - PR #3515 - adjusted number of `nodes` in `annotation` - Enhancements: - backported 6ea9f9fdf19 - when anticipating upcoming lanes, consider how many lanes need to be crossed to get there. - when using osrm-datastore, it will attempt to clean up locks if it crashes. @@ -396,5 +397,3 @@ - `properties.use_turn_restrictions` - `properties.u_turn_penalty` - `properties.allow_u_turn_at_via` - - diff --git a/src/engine/guidance/post_processing.cpp b/src/engine/guidance/post_processing.cpp index 17ec68c96..0aef12cb4 100644 --- a/src/engine/guidance/post_processing.cpp +++ b/src/engine/guidance/post_processing.cpp @@ -1441,6 +1441,7 @@ void trimShortSegments(std::vector &steps, LegGeometry &geometry) // This can happen if the last coordinate snaps to a node in the unpacked geometry geometry.locations.pop_back(); geometry.annotations.pop_back(); + geometry.osm_node_ids.pop_back(); geometry.segment_offsets.back()--; // since the last geometry includes the location of arrival, the arrival instruction // geometry overlaps with the previous segment diff --git a/unit_tests/engine/guidance_assembly.cpp b/unit_tests/engine/guidance_assembly.cpp index 2387b766c..394698983 100644 --- a/unit_tests/engine/guidance_assembly.cpp +++ b/unit_tests/engine/guidance_assembly.cpp @@ -3,6 +3,7 @@ #include "engine/guidance/assemble_overview.hpp" #include "engine/guidance/assemble_route.hpp" #include "engine/guidance/assemble_steps.hpp" +#include "engine/guidance/post_processing.hpp" #include #include @@ -17,4 +18,85 @@ BOOST_AUTO_TEST_CASE(rfc4648_test_vectors) // TODO(daniel-j-h): } +BOOST_AUTO_TEST_CASE(trim_short_segments) +{ + //using namespace osrm::extractor::guidance; + using namespace osrm::engine::guidance; + using namespace osrm::engine; + using namespace osrm::util; + + Intersection intersection1{{FloatLongitude{-73.981154}, FloatLatitude{40.767762}}, + {302}, + {1}, + Intersection::NO_INDEX, + 0, + {0, 255}, + {}}; + Intersection intersection2{{FloatLongitude{-73.981495}, FloatLatitude{40.768275}}, + {180}, + {1}, + 0, + Intersection::NO_INDEX, + {0, 255}, + {}}; + + // Check that duplicated coordinate in the end is removed + std::vector steps = {{324, + "Central Park West", + "", + "", + "", + "", + "", + 0.2, + 1.9076601161280742, + TRAVEL_MODE_DRIVING, + {{FloatLongitude{-73.981492}, FloatLatitude{40.768258}}, + 329, + 348, + {TurnType::ExitRotary, DirectionModifier::Straight}, + WaypointType::Depart, + 0}, + 0, + 3, + {intersection1}}, + {324, + "Central Park West", + "", + "", + "", + "", + "", + 0, + 0, + TRAVEL_MODE_DRIVING, + {{FloatLongitude{-73.981495}, FloatLatitude{40.768275}}, + 0, + 0, + {TurnType::NoTurn, DirectionModifier::UTurn}, + WaypointType::Arrive, + 0}, + 2, + 3, + {intersection2}}}; + + LegGeometry geometry; + geometry.locations = {{FloatLongitude{-73.981492}, FloatLatitude{40.768258}}, + {FloatLongitude{-73.981495}, FloatLatitude{40.768275}}, + {FloatLongitude{-73.981495}, FloatLatitude{40.768275}}}; + geometry.segment_offsets = {0, 2}; + geometry.segment_distances = {1.9076601161280742}; + geometry.osm_node_ids = {OSMNodeID{0}, OSMNodeID{1}, OSMNodeID{2}}; + geometry.annotations = {{1.9076601161280742, 0.2, 0}, {0, 0, 0}}; + + trimShortSegments(steps, geometry); + + BOOST_CHECK_EQUAL(geometry.segment_distances.size(), 1); + BOOST_CHECK_EQUAL(geometry.segment_offsets.size(), 2); + BOOST_CHECK_EQUAL(geometry.segment_offsets.back(), 1); + BOOST_CHECK_EQUAL(geometry.annotations.size(), 1); + BOOST_CHECK_EQUAL(geometry.locations.size(), 2); + BOOST_CHECK_EQUAL(geometry.osm_node_ids.size(), 2); +} + BOOST_AUTO_TEST_SUITE_END()