MCPcopy Create free account
hub / github.com/comaps/comaps / ExpandFake

Function ExpandFake

tools/openlr/openlr_decoder.cpp:101–156  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

99}
100
101void ExpandFake(Graph::EdgeVector & path, Graph::EdgeVector::iterator edgeIt, DataSource const & dataSource, Graph & g)
102{
103 if (!edgeIt->IsFake())
104 return;
105
106 Graph::EdgeListT edges;
107 bool startIsFake = true;
108 if (IsRealVertex(edgeIt->GetStartPoint(), edgeIt->GetFeatureId(), dataSource))
109 {
110 g.GetRegularOutgoingEdges(edgeIt->GetStartJunction(), edges);
111 startIsFake = false;
112 }
113 else
114 {
115 ASSERT(IsRealVertex(edgeIt->GetEndPoint(), edgeIt->GetFeatureId(), dataSource), ());
116 g.GetRegularIngoingEdges(edgeIt->GetEndJunction(), edges);
117 }
118
119 CHECK(!edges.empty(), ());
120
121 auto it = find_if(begin(edges), end(edges), [&edgeIt](Graph::Edge const & real)
122 {
123 if (real.GetFeatureId() == edgeIt->GetFeatureId() && real.GetSegId() == edgeIt->GetSegId())
124 return true;
125 return false;
126 });
127
128 // For features which cross mwm border FeatureIds may not match. Check geometry.
129 if (it == end(edges))
130 {
131 it = find_if(begin(edges), end(edges), [&edgeIt, &startIsFake](Graph::Edge const & real)
132 {
133 // Features from the same mwm should be already matched.
134 if (real.GetFeatureId().m_mwmId == edgeIt->GetFeatureId().m_mwmId)
135 return false;
136
137 auto const fakePoint = startIsFake ? edgeIt->GetStartPoint() : edgeIt->GetEndPoint();
138 m2::ParametrizedSegment<m2::PointD> const realGeometry(real.GetStartPoint(), real.GetEndPoint());
139 auto const projectedPoint = realGeometry.ClosestPointTo(fakePoint);
140
141 auto constexpr kCrossMwmMatchDistanceM = 1.0;
142 if (mercator::DistanceOnEarth(fakePoint, projectedPoint) < kCrossMwmMatchDistanceM)
143 return true;
144 return false;
145 });
146 }
147
148 CHECK(it != end(edges), ());
149
150 // If a fake edge is larger than a half of the corresponding real one, substitute
151 // the fake one with real one. Drop the fake one otherwize.
152 if (2 * EdgeLength(*edgeIt) >= EdgeLength(*it))
153 *edgeIt = *it;
154 else
155 path.erase(edgeIt);
156}
157
158void ExpandFakes(DataSource const & dataSource, Graph & g, Graph::EdgeVector & path)

Callers 1

ExpandFakesFunction · 0.85

Calls 15

IsRealVertexFunction · 0.85
ASSERTFunction · 0.85
EdgeLengthFunction · 0.85
GetSegIdMethod · 0.80
ClosestPointToMethod · 0.80
beginFunction · 0.50
endFunction · 0.50
DistanceOnEarthFunction · 0.50
IsFakeMethod · 0.45
GetStartPointMethod · 0.45
GetFeatureIdMethod · 0.45

Tested by

no test coverage detected