@@ -318,57 +318,64 @@ void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const Extracti
318318 road_classification.SetNumberOfLanes (std::max (road_deduced_num_lanes, // len(turn:lanes)
319319 road_classification.GetNumberOfLanes ()));
320320
321- // Get the unique identifier for the street name, destination, and ref
322- const auto name_iterator = string_map.find (MapKey (parsed_way.name ,
323- parsed_way.destinations ,
324- parsed_way.ref ,
325- parsed_way.pronunciation ,
326- parsed_way.exits ));
327- NameID name_id = EMPTY_NAMEID;
328- if (string_map.end () == name_iterator)
329- {
330- // name_offsets has a sentinel element with the total name data size
331- // take the sentinels index as the name id of the new name data pack
332- // (name [name_id], destination [+1], pronunciation [+2], ref [+3], exits [+4])
333- name_id = external_memory.name_offsets .size () - 1 ;
334-
335- std::copy (parsed_way.name .begin (),
336- parsed_way.name .end (),
337- std::back_inserter (external_memory.name_char_data ));
338- external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
339-
340- std::copy (parsed_way.destinations .begin (),
341- parsed_way.destinations .end (),
342- std::back_inserter (external_memory.name_char_data ));
343- external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
344-
345- std::copy (parsed_way.pronunciation .begin (),
346- parsed_way.pronunciation .end (),
347- std::back_inserter (external_memory.name_char_data ));
348- external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
349-
350- std::copy (parsed_way.ref .begin (),
351- parsed_way.ref .end (),
352- std::back_inserter (external_memory.name_char_data ));
353- external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
354-
355- std::copy (parsed_way.exits .begin (),
356- parsed_way.exits .end (),
357- std::back_inserter (external_memory.name_char_data ));
358- external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
359-
360- auto k = MapKey{parsed_way.name ,
361- parsed_way.destinations ,
362- parsed_way.ref ,
363- parsed_way.pronunciation ,
364- parsed_way.exits };
365- auto v = MapVal{name_id};
366- string_map.emplace (std::move (k), std::move (v));
367- }
368- else
369- {
370- name_id = name_iterator->second ;
371- }
321+ const auto GetNameID = [this , &parsed_way](bool is_forward) -> NameID {
322+ const std::string &ref = is_forward ? parsed_way.forward_ref : parsed_way.backward_ref ;
323+ // Get the unique identifier for the street name, destination, and ref
324+ const auto name_iterator = string_map.find (MapKey (parsed_way.name ,
325+ parsed_way.destinations ,
326+ ref,
327+ parsed_way.pronunciation ,
328+ parsed_way.exits ));
329+
330+ NameID name_id = EMPTY_NAMEID;
331+ if (string_map.end () == name_iterator)
332+ {
333+ // name_offsets has a sentinel element with the total name data size
334+ // take the sentinels index as the name id of the new name data pack
335+ // (name [name_id], destination [+1], pronunciation [+2], ref [+3], exits [+4])
336+ name_id = external_memory.name_offsets .size () - 1 ;
337+
338+ std::copy (parsed_way.name .begin (),
339+ parsed_way.name .end (),
340+ std::back_inserter (external_memory.name_char_data ));
341+ external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
342+
343+ std::copy (parsed_way.destinations .begin (),
344+ parsed_way.destinations .end (),
345+ std::back_inserter (external_memory.name_char_data ));
346+ external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
347+
348+ std::copy (parsed_way.pronunciation .begin (),
349+ parsed_way.pronunciation .end (),
350+ std::back_inserter (external_memory.name_char_data ));
351+ external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
352+
353+ std::copy (ref.begin (), ref.end (), std::back_inserter (external_memory.name_char_data ));
354+ external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
355+
356+ std::copy (parsed_way.exits .begin (),
357+ parsed_way.exits .end (),
358+ std::back_inserter (external_memory.name_char_data ));
359+ external_memory.name_offsets .push_back (external_memory.name_char_data .size ());
360+
361+ auto k = MapKey{parsed_way.name ,
362+ parsed_way.destinations ,
363+ ref,
364+ parsed_way.pronunciation ,
365+ parsed_way.exits };
366+ auto v = MapVal{name_id};
367+ string_map.emplace (std::move (k), std::move (v));
368+ }
369+ else
370+ {
371+ name_id = name_iterator->second ;
372+ }
373+
374+ return name_id;
375+ };
376+
377+ const NameID forward_name_id = GetNameID (true );
378+ const NameID backward_name_id = GetNameID (false );
372379
373380 const bool in_forward_direction =
374381 (parsed_way.forward_speed > 0 || parsed_way.forward_rate > 0 || parsed_way.duration > 0 ||
@@ -386,12 +393,13 @@ void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const Extracti
386393 (force_split_edges || (parsed_way.forward_rate != parsed_way.backward_rate ) ||
387394 (parsed_way.forward_speed != parsed_way.backward_speed ) ||
388395 (parsed_way.forward_travel_mode != parsed_way.backward_travel_mode ) ||
389- (turn_lane_id_forward != turn_lane_id_backward) || (forward_classes != backward_classes));
396+ (turn_lane_id_forward != turn_lane_id_backward) || (forward_classes != backward_classes) ||
397+ (parsed_way.forward_ref != parsed_way.backward_ref ));
390398
391399 if (in_forward_direction)
392400 { // add (forward) segments or (forward,backward) for non-split edges in backward direction
393401 const auto annotation_data_id = external_memory.all_edges_annotation_data_list .size ();
394- external_memory.all_edges_annotation_data_list .push_back ({name_id ,
402+ external_memory.all_edges_annotation_data_list .push_back ({forward_name_id ,
395403 turn_lane_id_forward,
396404 forward_classes,
397405 parsed_way.forward_travel_mode ,
@@ -424,7 +432,7 @@ void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const Extracti
424432 if (in_backward_direction && (!in_forward_direction || split_edge))
425433 { // add (backward) segments for split edges or not in forward direction
426434 const auto annotation_data_id = external_memory.all_edges_annotation_data_list .size ();
427- external_memory.all_edges_annotation_data_list .push_back ({name_id ,
435+ external_memory.all_edges_annotation_data_list .push_back ({backward_name_id ,
428436 turn_lane_id_backward,
429437 backward_classes,
430438 parsed_way.backward_travel_mode ,
0 commit comments