forked from organicmaps/organicmaps
Merge pull request #42 from gardster/cross_mwm_fix
[routing] Reverse node id support for cross mwm routing.
This commit is contained in:
commit
51b124e3a2
6 changed files with 46 additions and 7 deletions
|
@ -199,6 +199,18 @@ namespace
|
|||
MercatorBounds::FromLatLon(45.38053, 36.73226), 13110.);
|
||||
}
|
||||
|
||||
UNIT_TEST(ParisCrossDestinationInForwardHeapCase)
|
||||
{
|
||||
// Forward
|
||||
integration::CalculateRouteAndTestRouteLength(
|
||||
integration::GetOsrmComponents(), MercatorBounds::FromLatLon(49.85015, 2.24296), {0., 0.},
|
||||
MercatorBounds::FromLatLon(48.85860, 2.34784), 126000.);
|
||||
// And backward case
|
||||
integration::CalculateRouteAndTestRouteLength(
|
||||
integration::GetOsrmComponents(), MercatorBounds::FromLatLon(48.85860, 2.34784), {0., 0.},
|
||||
MercatorBounds::FromLatLon(49.85015, 2.24296), 126000.);
|
||||
}
|
||||
|
||||
UNIT_TEST(RussiaSmolenskRussiaMoscowTimeTest)
|
||||
{
|
||||
TRouteResult const routeResult = integration::CalculateRoute(
|
||||
|
|
|
@ -33,7 +33,8 @@ IRouter::ResultCode CrossMwmGraph::SetStartNode(CrossNode const & startNode)
|
|||
targets.reserve(outSize);
|
||||
for (auto j = mwmOutsIter.first; j < mwmOutsIter.second; ++j)
|
||||
targets.emplace_back(j->m_nodeId, false /* isStartNode */, startNode.mwmName);
|
||||
sources[0] = FeatureGraphNode(startNode.node, true /* isStartNode */, startNode.mwmName);
|
||||
sources[0] = FeatureGraphNode(startNode.node, startNode.reverseNode, true /* isStartNode */,
|
||||
startNode.mwmName);
|
||||
|
||||
vector<EdgeWeight> weights;
|
||||
FindWeightsMatrix(sources, targets, startMapping->m_dataFacade, weights);
|
||||
|
@ -95,7 +96,8 @@ IRouter::ResultCode CrossMwmGraph::SetFinalNode(CrossNode const & finalNode)
|
|||
}
|
||||
vector<EdgeWeight> weights;
|
||||
|
||||
targets[0] = FeatureGraphNode(finalNode.node, false /* isStartNode */, finalNode.mwmName);
|
||||
targets[0] = FeatureGraphNode(finalNode.node, finalNode.reverseNode, false /* isStartNode */,
|
||||
finalNode.mwmName);
|
||||
FindWeightsMatrix(sources, targets, finalMapping->m_dataFacade, weights);
|
||||
if (find_if(weights.begin(), weights.end(), &IsValidEdgeWeight) == weights.end())
|
||||
return IRouter::EndPointNotFound;
|
||||
|
|
|
@ -18,16 +18,22 @@ namespace routing
|
|||
struct CrossNode
|
||||
{
|
||||
NodeID node;
|
||||
NodeID reverseNode;
|
||||
string mwmName;
|
||||
m2::PointD point;
|
||||
bool isVirtual;
|
||||
|
||||
CrossNode(NodeID node, string const & mwmName, m2::PointD const & point)
|
||||
: node(node), mwmName(mwmName), point(point), isVirtual(false)
|
||||
CrossNode(NodeID node, NodeID reverse, string const & mwmName, m2::PointD const & point)
|
||||
: node(node), reverseNode(reverse), mwmName(mwmName), point(point), isVirtual(false)
|
||||
{
|
||||
}
|
||||
|
||||
CrossNode() : node(INVALID_NODE_ID), point(m2::PointD::Zero()) {}
|
||||
CrossNode(NodeID node, string const & mwmName, m2::PointD const & point)
|
||||
: node(node), reverseNode(INVALID_NODE_ID), mwmName(mwmName), point(point), isVirtual(false)
|
||||
{
|
||||
}
|
||||
|
||||
CrossNode() : node(INVALID_NODE_ID), reverseNode(INVALID_NODE_ID), point(m2::PointD::Zero()) {}
|
||||
|
||||
inline bool IsValid() const { return node != INVALID_NODE_ID; }
|
||||
|
||||
|
|
|
@ -53,7 +53,8 @@ IRouter::ResultCode CalculateCrossMwmPath(TRoutingNodes const & startGraphNodes,
|
|||
IRouter::ResultCode code = IRouter::StartPointNotFound;
|
||||
for (FeatureGraphNode const & start : startGraphNodes)
|
||||
{
|
||||
startNode = CrossNode(start.node.forward_node_id, start.mwmName, start.segmentPoint);
|
||||
startNode = CrossNode(start.node.forward_node_id, start.node.reverse_node_id, start.mwmName,
|
||||
start.segmentPoint);
|
||||
code = roadGraph.SetStartNode(startNode);
|
||||
if (code == IRouter::NoError)
|
||||
{
|
||||
|
@ -70,7 +71,8 @@ IRouter::ResultCode CalculateCrossMwmPath(TRoutingNodes const & startGraphNodes,
|
|||
code = IRouter::EndPointNotFound;
|
||||
for (FeatureGraphNode const & final : finalGraphNodes)
|
||||
{
|
||||
finalNode = CrossNode(final.node.reverse_node_id, final.mwmName, final.segmentPoint);
|
||||
finalNode = CrossNode(final.node.reverse_node_id, final.node.forward_node_id, final.mwmName,
|
||||
final.segmentPoint);
|
||||
finalNode.isVirtual = true;
|
||||
code = roadGraph.SetFinalNode(finalNode);
|
||||
if (code == IRouter::NoError)
|
||||
|
|
|
@ -104,6 +104,20 @@ FeatureGraphNode::FeatureGraphNode(NodeID const nodeId, bool const isStartNode,
|
|||
segment.m_fid = kInvalidFid;
|
||||
}
|
||||
|
||||
FeatureGraphNode::FeatureGraphNode(NodeID const nodeId, NodeID const reverseNodeId,
|
||||
bool const isStartNode, string const & mwmName)
|
||||
: segmentPoint(m2::PointD::Zero()), mwmName(mwmName)
|
||||
{
|
||||
node.forward_node_id = isStartNode ? nodeId : reverseNodeId;
|
||||
node.reverse_node_id = isStartNode ? reverseNodeId : nodeId;
|
||||
node.forward_weight = 0;
|
||||
node.reverse_weight = 0;
|
||||
node.forward_offset = 0;
|
||||
node.reverse_offset = 0;
|
||||
node.name_id = 1;
|
||||
segment.m_fid = kInvalidFid;
|
||||
}
|
||||
|
||||
FeatureGraphNode::FeatureGraphNode()
|
||||
{
|
||||
node.forward_node_id = INVALID_NODE_ID;
|
||||
|
|
|
@ -27,6 +27,9 @@ struct FeatureGraphNode
|
|||
*/
|
||||
FeatureGraphNode(NodeID const nodeId, bool const isStartNode, string const & mwmName);
|
||||
|
||||
FeatureGraphNode(NodeID const nodeId, NodeID const reverseNodeId, bool const isStartNode,
|
||||
string const & mwmName);
|
||||
|
||||
/// \brief Invalid graph node constructor
|
||||
FeatureGraphNode();
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue