From dd3fff385a0ac1df46ebf9ceb974928063416705 Mon Sep 17 00:00:00 2001 From: Lev Dragunov Date: Wed, 30 Sep 2015 18:59:39 +0300 Subject: [PATCH] [router] Start edge weight fix. --- .../data_structures/datafacade_base.hpp | 2 +- routing/osrm_data_facade.hpp | 2 +- routing/osrm_router.cpp | 32 ++++++++++++++++--- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/3party/osrm/osrm-backend/server/data_structures/datafacade_base.hpp b/3party/osrm/osrm-backend/server/data_structures/datafacade_base.hpp index d7e00581ae..64f723e0c9 100755 --- a/3party/osrm/osrm-backend/server/data_structures/datafacade_base.hpp +++ b/3party/osrm/osrm-backend/server/data_structures/datafacade_base.hpp @@ -64,7 +64,7 @@ template class BaseDataFacade virtual const EdgeDataT &GetEdgeData(const EdgeID e) const = 0; - virtual EdgeDataT GetEdgeData(const EdgeID e, const NodeID n) = 0; + virtual EdgeDataT GetEdgeData(const EdgeID e, const NodeID n) const = 0; virtual EdgeID BeginEdges(const NodeID n) const = 0; diff --git a/routing/osrm_data_facade.hpp b/routing/osrm_data_facade.hpp index c25b1cff2f..a2d5d2a949 100644 --- a/routing/osrm_data_facade.hpp +++ b/routing/osrm_data_facade.hpp @@ -88,7 +88,7 @@ public: return (m_matrix.select(e) / 2) % GetNumberOfNodes(); } - EdgeDataT GetEdgeData(const EdgeID e, NodeID node) override + EdgeDataT GetEdgeData(const EdgeID e, NodeID node) const override { EdgeDataT res; diff --git a/routing/osrm_router.cpp b/routing/osrm_router.cpp index 0d6249d53e..9c84a1ebd5 100644 --- a/routing/osrm_router.cpp +++ b/routing/osrm_router.cpp @@ -62,8 +62,8 @@ class Point2PhantomNode public: Point2PhantomNode(OsrmFtSegMapping const & mapping, Index const * pIndex, - m2::PointD const & direction) - : m_direction(direction), m_mapping(mapping), m_pIndex(pIndex) + m2::PointD const & direction, TDataFacade const & facade) + : m_direction(direction), m_mapping(mapping), m_pIndex(pIndex), m_dataFacade(facade) { } @@ -152,8 +152,11 @@ public: void CalculateOffset(OsrmMappingTypes::FtSeg const & seg, m2::PointD const & segPt, NodeID & nodeId, int & offset, bool forward) const { - if (nodeId == INVALID_NODE_ID) + if (nodeId == INVALID_NODE_ID || m_dataFacade.GetOutDegree(nodeId) == 0) + { + offset = 0; return; + } double distance = 0; auto const range = m_mapping.GetSegmentsRange(nodeId); @@ -221,7 +224,25 @@ public: // node.m_seg always forward ordered (m_pointStart < m_pointEnd) distance -= MercatorBounds::DistanceOnEarth(ft.GetPoint(forward ? seg.m_pointEnd : seg.m_pointStart), segPt); - offset = max(static_cast(distance), 1); + // Offset measures in decades of seconds. We don't konw about speed restrictions on the road. + // So we find it through a whole edge weight. + double fullDist = 0.0; + for (size_t i = si; i != ei; i += di) + { + m_mapping.GetSegmentByIndex(i, s); + if (!s.IsValid()) + continue; + fullDist += CalculateDistance(s); + } + + double const ratio = (fullDist == 0) ? 0 : distance / fullDist; + + auto const beginEdge = m_dataFacade.BeginEdges(nodeId); + EdgeWeight minWeight = m_dataFacade.GetEdgeData(beginEdge, nodeId).distance; + for (EdgeID i = beginEdge + 1; i != m_dataFacade.EndEdges(nodeId); ++i) + minWeight = min(m_dataFacade.GetEdgeData(i, nodeId).distance, minWeight); + + offset = max(static_cast(minWeight * ratio), 1); } void CalculateOffsets(FeatureGraphNode & node) const @@ -329,6 +350,7 @@ private: buffer_vector m_candidates; MwmSet::MwmId m_mwmId; Index const * m_pIndex; + TDataFacade const & m_dataFacade; DISALLOW_COPY(Point2PhantomNode); }; @@ -658,7 +680,7 @@ IRouter::ResultCode OsrmRouter::FindPhantomNodes(m2::PointD const & point, TRoutingMappingPtr const & mapping) { ASSERT(mapping, ()); - Point2PhantomNode getter(mapping->m_segMapping, m_pIndex, direction); + Point2PhantomNode getter(mapping->m_segMapping, m_pIndex, direction, mapping->m_dataFacade); getter.SetPoint(point); m_pIndex->ForEachInRectForMWM(getter, MercatorBounds::RectByCenterXYAndSizeInMeters(