66#include " engine/map_matching/matching_confidence.hpp"
77#include " engine/map_matching/sub_matching.hpp"
88
9+ #include " extractor/intersection/constants.hpp"
10+
911#include " util/coordinate_calculation.hpp"
1012#include " util/for_each_pair.hpp"
1113
@@ -61,6 +63,20 @@ inline void initializeHeap<mld::Algorithm>(SearchEngineData<mld::Algorithm> &eng
6163 engine_working_data.InitializeOrClearMapMatchingThreadLocalStorage (nodes_number,
6264 border_nodes_number);
6365}
66+
67+ template <typename Algorithm>
68+ double getDistanceOutsideRoadSurface (const DataFacade<Algorithm> &facade,
69+ const PhantomNodeWithDistance &candidate)
70+ {
71+ const auto &phantom = candidate.phantom_node ;
72+ const auto number_of_lanes = phantom.forward_segment_id .enabled
73+ ? facade.GetNumberOfLanes (phantom.forward_segment_id .id )
74+ : facade.GetNumberOfLanes (phantom.reverse_segment_id .id );
75+ const double road_half_width =
76+ 0.5 * number_of_lanes * extractor::intersection::ASSUMED_LANE_WIDTH ;
77+
78+ return std::max (0 ., candidate.distance - road_half_width);
79+ }
6480} // namespace
6581
6682template <typename Algorithm>
@@ -106,7 +122,10 @@ SubMatchingList mapMatching(SearchEngineData<Algorithm> &engine_working_data,
106122 candidates_list[t].end (),
107123 emission_log_probabilities[t].begin (),
108124 [&](const PhantomNodeWithDistance &candidate)
109- { return default_emission_log_probability (candidate.distance ); });
125+ {
126+ return default_emission_log_probability (
127+ getDistanceOutsideRoadSurface (facade, candidate));
128+ });
110129 }
111130 }
112131 else
@@ -121,16 +140,22 @@ SubMatchingList mapMatching(SearchEngineData<Algorithm> &engine_working_data,
121140 std::transform (candidates_list[t].begin (),
122141 candidates_list[t].end (),
123142 emission_log_probabilities[t].begin (),
124- [&emission_log_probability](const PhantomNodeWithDistance &candidate)
125- { return emission_log_probability (candidate.distance ); });
143+ [&](const PhantomNodeWithDistance &candidate)
144+ {
145+ return emission_log_probability (
146+ getDistanceOutsideRoadSurface (facade, candidate));
147+ });
126148 }
127149 else
128150 {
129151 std::transform (candidates_list[t].begin (),
130152 candidates_list[t].end (),
131153 emission_log_probabilities[t].begin (),
132154 [&](const PhantomNodeWithDistance &candidate)
133- { return default_emission_log_probability (candidate.distance ); });
155+ {
156+ return default_emission_log_probability (
157+ getDistanceOutsideRoadSurface (facade, candidate));
158+ });
134159 }
135160 }
136161 }
0 commit comments