diff --git a/routing/cross_mwm_index_graph.cpp b/routing/cross_mwm_index_graph.cpp index cbb2c153ba..9d14be90ba 100644 --- a/routing/cross_mwm_index_graph.cpp +++ b/routing/cross_mwm_index_graph.cpp @@ -26,7 +26,7 @@ bool GetTransitionSegment(OsrmFtSegMapping const & segMapping, TWrittenNodeId no continue; CHECK_NOT_EQUAL(seg.m_pointStart, seg.m_pointEnd, ()); - segment = Segment(seg.m_fid, min(seg.m_pointStart, seg.m_pointEnd), numMwmId, seg.IsForward()); + segment = Segment(numMwmId, seg.m_fid, min(seg.m_pointStart, seg.m_pointEnd), seg.IsForward()); return true; } LOG(LERROR, ("No valid segments in the range returned by OsrmFtSegMapping::GetSegmentsRange(", nodeId, @@ -96,7 +96,7 @@ void CrossMwmIndexGraph::GetTwins(Segment const & s, bool isOutgoing, std::vecto // @TODO(bykoianko) It's necessary to check if mwm of |s| contains an A* cross mwm section // and if so to use it. If not, osrm cross mwm sections should be used. - auto const getTwins = [&](TRoutingMappingPtr const & segMapping) + auto const getTwins = [&](NumMwmId /* numMwmId */, TRoutingMappingPtr const & segMapping) { vector const & neighboringMwm = segMapping->m_crossContext.GetNeighboringMwmList(); @@ -110,8 +110,7 @@ void CrossMwmIndexGraph::GetTwins(Segment const & s, bool isOutgoing, std::vecto : GetLatLon(it->second.m_ingoing, s); for (string const & name : neighboringMwm) { - NumMwmId const numMwmId = m_numMwmIds->GetId(CountryFile(name)); - auto const addTransitionSegments = [&](TRoutingMappingPtr const & mapping) + auto const addTransitionSegments = [&](NumMwmId numMwmId, TRoutingMappingPtr const & mapping) { if (isOutgoing) { @@ -127,7 +126,7 @@ void CrossMwmIndexGraph::GetTwins(Segment const & s, bool isOutgoing, std::vecto } }; - if (!LoadWith(numMwmId, addTransitionSegments)) + if (!LoadWith(m_numMwmIds->GetId(CountryFile(name)), addTransitionSegments)) continue; // mwm was not loaded. } }; @@ -154,7 +153,7 @@ void CrossMwmIndexGraph::InsertWholeMwmTransitionSegments(NumMwmId numMwmId) if (m_transitionCache.count(numMwmId) != 0) return; - auto const fillAllTransitionSegments = [&](TRoutingMappingPtr const & mapping){ + auto const fillAllTransitionSegments = [this](NumMwmId numMwmId, TRoutingMappingPtr const & mapping){ TransitionSegments transitionSegments; mapping->m_crossContext.ForEachOutgoingNode([&](OutgoingCrossNode const & node) { diff --git a/routing/cross_mwm_index_graph.hpp b/routing/cross_mwm_index_graph.hpp index ba9d1324fa..af0aa2515a 100644 --- a/routing/cross_mwm_index_graph.hpp +++ b/routing/cross_mwm_index_graph.hpp @@ -93,13 +93,13 @@ private: platform::CountryFile const & countryFile = m_numMwmIds->GetFile(numMwmId); TRoutingMappingPtr mapping = m_indexManager.GetMappingByName(countryFile.GetName()); CHECK(mapping, ("No routing mapping file for countryFile:", countryFile)); - MappingGuard mappingGuard(mapping); if (!mapping->IsValid()) return false; // mwm was not loaded. + MappingGuard mappingGuard(mapping); mapping->LoadCrossContext(); - fn(mapping); + fn(numMwmId, mapping); return true; } diff --git a/routing/cross_routing_context.cpp b/routing/cross_routing_context.cpp index 2b48d468ee..4fc6dcf9c3 100644 --- a/routing/cross_routing_context.cpp +++ b/routing/cross_routing_context.cpp @@ -116,6 +116,15 @@ TWrittenEdgeWeight CrossRoutingContextReader::GetAdjacencyCost(IngoingCrossNode return cost_index < m_adjacencyMatrix.size() ? m_adjacencyMatrix[cost_index] : kInvalidContextEdgeWeight; } +m2::RectD CrossRoutingContextReader::GetMwmCrossingNodeEqualityRect(ms::LatLon const & point) const +{ + double constexpr kMwmCrossingNodeEqualityDegrees = kMwmCrossingNodeEqualityMeters * MercatorBounds::degreeInMetres; + return m2::RectD(point.lat - kMwmCrossingNodeEqualityDegrees, + point.lon - kMwmCrossingNodeEqualityDegrees, + point.lat + kMwmCrossingNodeEqualityDegrees, + point.lon + kMwmCrossingNodeEqualityDegrees); +} + void CrossRoutingContextWriter::Save(Writer & w) const { uint32_t size = static_cast(m_ingoingNodes.size()); diff --git a/routing/cross_routing_context.hpp b/routing/cross_routing_context.hpp index 8059d948ae..186ee6b78c 100644 --- a/routing/cross_routing_context.hpp +++ b/routing/cross_routing_context.hpp @@ -98,12 +98,13 @@ public: vector const & GetNeighboringMwmList() const { return m_neighborMwmList; } + m2::RectD GetMwmCrossingNodeEqualityRect(ms::LatLon const & point) const; + template bool ForEachIngoingNodeNearPoint(ms::LatLon const & point, Fn && fn) const { bool found = false; - m_ingoingIndex.ForEachInRect(MercatorBounds::RectByCenterLatLonAndSizeInMeters( - point.lat, point.lon, kMwmCrossingNodeEqualityMeters), + m_ingoingIndex.ForEachInRect(GetMwmCrossingNodeEqualityRect(point), [&found, &fn](IngoingCrossNode const & node) { fn(node); found = true; @@ -115,8 +116,7 @@ public: bool ForEachOutgoingNodeNearPoint(ms::LatLon const & point, Fn && fn) const { bool found = false; - m_outgoingIndex.ForEachInRect(MercatorBounds::RectByCenterLatLonAndSizeInMeters( - point.lat, point.lon, kMwmCrossingNodeEqualityMeters), + m_outgoingIndex.ForEachInRect(GetMwmCrossingNodeEqualityRect(point), [&found, &fn](OutgoingCrossNode const & node) { fn(node); found = true;