@@ -94,32 +94,30 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
9494 const std::uint8_t intersection_lanes,
9595 std::vector<util::Coordinate> coordinates) const
9696{
97- const auto is_valid_result = [&](const util::Coordinate coordinate) {
97+ // check if the coordinate is equal to the interseciton coordinate
98+ const auto not_same_as_start = [&](const util::Coordinate coordinate) {
9899 return util::Coordinate (traversed_in_reverse
99100 ? node_coordinates[to_node]
100101 : node_coordinates[intersection_node]) != coordinate;
101102 };
102103 // this is only used for debug purposes in assertions. We don't want warnings about it
103- (void )is_valid_result;
104-
105- // the lane count might not always be set. We need to assume a positive number, though. Here we
106- // select the number of lanes to operate on
107- const auto considered_lanes =
108- GetOffsetCorrectionFactor (node_based_graph.GetEdgeData (turn_edge).road_classification ) *
109- ((intersection_lanes == 0 ) ? ASSUMED_LANE_COUNT : intersection_lanes);
104+ (void )not_same_as_start;
110105
111106 // Fallback. These roads are small broken self-loops that shouldn't be in the data at all
112107 if (intersection_node == to_node)
108+ {
109+ BOOST_ASSERT (coordinates.size () >= 2 );
113110 return coordinates[1 ];
111+ }
114112
115113 /* if we are looking at a straight line, we don't care where exactly the coordinate
116114 * is. Simply return the final coordinate. Turn angles/turn vectors are the same no matter which
117115 * coordinate we look at.
118116 */
119117 if (coordinates.size () <= 2 )
120118 {
121- // Here we can't check for validity, due to possible dead-ends with repeated coordinates
122- // BOOST_ASSERT(is_valid_result(coordinates.back() ));
119+ // TODO: possibly re-enable with https://github.com/Project-OSRM/osrm-backend/issues/3470
120+ // BOOST_ASSERT(not_same_as_start(result ));
123121 return coordinates.back ();
124122 }
125123
@@ -130,25 +128,20 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
130128 // fallback, mostly necessary for dead ends
131129 if (intersection_node == to_node)
132130 {
133- const auto result = ExtractCoordinateAtLength (
134- skipping_inaccuracies_distance, coordinates);
135- BOOST_ASSERT (is_valid_result (result));
131+ const auto result = ExtractCoordinateAtLength (skipping_inaccuracies_distance, coordinates);
132+ // TODO: possibly re-enable with https://github.com/Project-OSRM/osrm-backend/issues/3470
133+ // BOOST_ASSERT(not_same_as_start (result));
136134 return result;
137135 }
138136
139- // If this reduction leaves us with only two coordinates, the turns/angles are represented in a
140- // valid way. Only curved roads and other difficult scenarios will require multiple coordinates.
141- if (coordinates.size () == 2 )
142- return coordinates.back ();
143-
144137 const auto &turn_edge_data = node_based_graph.GetEdgeData (turn_edge);
145138
146139 // roundabouts, check early to avoid other costly checks
147140 if (turn_edge_data.roundabout || turn_edge_data.circular )
148141 {
149- const auto result = ExtractCoordinateAtLength (
150- skipping_inaccuracies_distance, coordinates);
151- BOOST_ASSERT (is_valid_result (result));
142+ const auto result = ExtractCoordinateAtLength (skipping_inaccuracies_distance, coordinates);
143+ // TODO: possibly re-enable with https://github.com/Project-OSRM/osrm-backend/issues/3470
144+ // BOOST_ASSERT(not_same_as_start (result));
152145 return result;
153146 }
154147
@@ -169,21 +162,34 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
169162 util::coordinate_calculation::haversineDistance (turn_coordinate, coordinates[1 ]) <
170163 ASSUMED_LANE_WIDTH)
171164 {
172- const auto result =
173- GetCorrectedCoordinate (turn_coordinate, coordinates[1 ], coordinates.back ());
174- BOOST_ASSERT (is_valid_result (result));
175- return result;
176- }
177- else
178- {
179- BOOST_ASSERT (is_valid_result (coordinates.back ()));
180- return coordinates.back ();
165+ const auto initial_distance =
166+ util::coordinate_calculation::haversineDistance (turn_coordinate, coordinates[1 ]);
167+ const auto total_distance = util::coordinate_calculation::haversineDistance (
168+ turn_coordinate, coordinates.back ());
169+
170+ if (initial_distance > ASSUMED_LANE_WIDTH && total_distance > initial_distance)
171+ {
172+ const auto result =
173+ GetCorrectedCoordinate (turn_coordinate, coordinates[1 ], coordinates.back ());
174+ BOOST_ASSERT (not_same_as_start (result));
175+ return result;
176+ }
181177 }
178+ // TODO: possibly re-enable with
179+ // https://github.com/Project-OSRM/osrm-backend/issues/3470
180+ // BOOST_ASSERT(not_same_as_start(coordinates.back()));
181+ return coordinates.back ();
182182 }
183183
184184 const auto first_distance =
185185 util::coordinate_calculation::haversineDistance (coordinates[0 ], coordinates[1 ]);
186186
187+ // the lane count might not always be set. We need to assume a positive number, though. Here we
188+ // select the number of lanes to operate on
189+ const auto considered_lanes =
190+ GetOffsetCorrectionFactor (node_based_graph.GetEdgeData (turn_edge).road_classification ) *
191+ ((intersection_lanes == 0 ) ? ASSUMED_LANE_COUNT : intersection_lanes);
192+
187193 /* if the very first coordinate along the road is reasonably far away from the road, we assume
188194 * the coordinate to correctly represent the turn. This could probably be improved using
189195 * information on the very first turn angle (requires knowledge about previous road) and the
@@ -197,7 +203,7 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
197203
198204 if (first_coordinate_is_far_away)
199205 {
200- BOOST_ASSERT (is_valid_result (coordinates[1 ]));
206+ BOOST_ASSERT (not_same_as_start (coordinates[1 ]));
201207 return coordinates[1 ];
202208 }
203209
@@ -237,7 +243,8 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
237243 if (coordinates.size () == 2 ||
238244 total_distance <= skipping_inaccuracies_distance)
239245 {
240- BOOST_ASSERT (is_valid_result (coordinates.back ()));
246+ // TODO: possibly re-enable with https://github.com/Project-OSRM/osrm-backend/issues/3470
247+ // BOOST_ASSERT(not_same_as_start(coordinates.back()));
241248 return coordinates.back ();
242249 }
243250
@@ -252,14 +259,14 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
252259 // As a back-up, we have to check for this case
253260 if (coordinates.front () == coordinates.back ())
254261 {
255- const auto result = ExtractCoordinateAtLength (
256- skipping_inaccuracies_distance, coordinates);
257- BOOST_ASSERT (is_valid_result (result));
262+ const auto result =
263+ ExtractCoordinateAtLength ( skipping_inaccuracies_distance, coordinates);
264+ BOOST_ASSERT (not_same_as_start (result));
258265 return result;
259266 }
260267 else
261268 {
262- BOOST_ASSERT (is_valid_result (coordinates.back ()));
269+ BOOST_ASSERT (not_same_as_start (coordinates.back ()));
263270 return coordinates.back ();
264271 }
265272 }
@@ -299,7 +306,7 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
299306 {
300307 // skip over repeated coordinates
301308 const auto result = ExtractCoordinateAtLength (5 , coordinates, segment_distances);
302- BOOST_ASSERT (is_valid_result (result));
309+ BOOST_ASSERT (not_same_as_start (result));
303310 return result;
304311 }
305312
@@ -333,7 +340,7 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
333340 .second ;
334341 const auto result =
335342 GetCorrectedCoordinate (turn_coordinate, coord_between_front, coord_between_back);
336- BOOST_ASSERT (is_valid_result (result));
343+ BOOST_ASSERT (not_same_as_start (result));
337344 return result;
338345 }
339346
@@ -354,7 +361,7 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
354361 const auto result = GetCorrectedCoordinate (
355362 turn_coordinate, coordinates[offset_index], coordinates[offset_index + 1 ]);
356363
357- BOOST_ASSERT (is_valid_result (result));
364+ BOOST_ASSERT (not_same_as_start (result));
358365 return result;
359366 }
360367
@@ -388,7 +395,7 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
388395 BOOST_ASSERT (coordinates.size () >= 2 );
389396 const auto result =
390397 GetCorrectedCoordinate (turn_coordinate, coordinates.back (), vector_head);
391- BOOST_ASSERT (is_valid_result (result));
398+ BOOST_ASSERT (not_same_as_start (result));
392399 return result;
393400 }
394401
@@ -414,7 +421,7 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
414421 {
415422 const auto result = GetCorrectedCoordinate (
416423 turn_coordinate, regression_line_trimmed.first , regression_line_trimmed.second );
417- BOOST_ASSERT (is_valid_result (result));
424+ BOOST_ASSERT (not_same_as_start (result));
418425 return result;
419426 }
420427 }
@@ -424,7 +431,7 @@ util::Coordinate CoordinateExtractor::ExtractRepresentativeCoordinate(
424431 // intersection.
425432 const auto result =
426433 ExtractCoordinateAtLength (LOOKAHEAD_DISTANCE_WITHOUT_LANES, coordinates, segment_distances);
427- BOOST_ASSERT (is_valid_result (result));
434+ BOOST_ASSERT (not_same_as_start (result));
428435 return result;
429436}
430437
@@ -989,7 +996,9 @@ CoordinateExtractor::GetCorrectedCoordinate(const util::Coordinate fixpoint,
989996 // we can use the end-coordinate
990997 if (util::coordinate_calculation::haversineDistance (vector_base, vector_head) <
991998 DESIRED_COORDINATE_DIFFERENCE)
999+ {
9921000 return vector_head;
1001+ }
9931002 else
9941003 {
9951004 /* to correct for the initial offset, we move the lookahead coordinate close
0 commit comments