Tree index for cross section index finding.

This commit is contained in:
Lev Dragunov 2015-10-22 17:57:55 +03:00
parent ffc2669bd4
commit fc00ee4d41
3 changed files with 34 additions and 14 deletions

View file

@ -131,22 +131,19 @@ BorderCross CrossMwmGraph::FindNextMwmNode(OutgoingCrossNode const & startNode,
return BorderCross();
nextMapping->LoadCrossContext();
auto incomeIters = nextMapping->m_crossContext.GetIngoingIterators();
for (auto i = incomeIters.first; i < incomeIters.second; ++i)
IngoingCrossNode ingoingNode;
if (nextMapping->m_crossContext.FindIngoingNodeByPoint(startPoint, ingoingNode))
{
m2::PointD const & targetPoint = i->m_point;
if (ms::DistanceOnEarth(startPoint.y, startPoint.x, targetPoint.y, targetPoint.x) <
kMwmCrossingNodeEqualityRadiusMeters)
{
BorderCross const cross(
CrossNode(startNode.m_nodeId, currentMapping->GetCountryName(),
MercatorBounds::FromLatLon(targetPoint.y, targetPoint.x)),
CrossNode(i->m_nodeId, nextMwm,
MercatorBounds::FromLatLon(targetPoint.y, targetPoint.x)));
m_cachedNextNodes.insert(make_pair(startPoint, cross));
return cross;
}
auto const & targetPoint = ingoingNode.m_point;
BorderCross const cross(
CrossNode(startNode.m_nodeId, currentMapping->GetCountryName(),
MercatorBounds::FromLatLon(targetPoint.y, targetPoint.x)),
CrossNode(ingoingNode.m_nodeId, nextMwm,
MercatorBounds::FromLatLon(targetPoint.y, targetPoint.x)));
m_cachedNextNodes.insert(make_pair(startPoint, cross));
return cross;
}
return BorderCross();
}

View file

@ -1,5 +1,6 @@
#include "routing/cross_routing_context.hpp"
#include "indexer/mercator.hpp"
#include "indexer/point_to_int64.hpp"
namespace routing
@ -65,7 +66,10 @@ void CrossRoutingContextReader::Load(Reader const & r)
m_ingoingNodes.resize(size);
for (auto & node : m_ingoingNodes)
{
pos = node.Load(r, pos);
m_ingoingIndex.Add(node);
}
r.Read(pos, &size, sizeof(size));
pos += sizeof(size);
@ -92,6 +96,18 @@ void CrossRoutingContextReader::Load(Reader const & r)
}
}
bool CrossRoutingContextReader::FindIngoingNodeByPoint(m2::PointD const & point, IngoingCrossNode & node) const
{
bool found = false;
m_ingoingIndex.ForEachInRect(MercatorBounds::RectByCenterXYAndSizeInMeters(point, 5),
[&found, &node](IngoingCrossNode const & nd)
{
node = nd;
found = true;
});
return found;
}
const string & CrossRoutingContextReader::GetOutgoingMwmName(
OutgoingCrossNode const & outgoingNode) const
{

View file

@ -3,6 +3,8 @@
#include "coding/file_container.hpp"
#include "geometry/point2d.hpp"
#include "geometry/rect2d.hpp"
#include "geometry/tree4d.hpp"
#include "std/string.hpp"
#include "std/vector.hpp"
@ -25,6 +27,8 @@ struct IngoingCrossNode
void Save(Writer & w) const;
size_t Load(Reader const & r, size_t pos);
m2::RectD const GetLimitRect() const { return m2::RectD(m_point, m_point); }
};
struct OutgoingCrossNode
@ -53,6 +57,7 @@ class CrossRoutingContextReader
vector<OutgoingCrossNode> m_outgoingNodes;
vector<string> m_neighborMwmList;
unique_ptr<Reader> mp_reader = nullptr;
m4::Tree<IngoingCrossNode> m_ingoingIndex;
size_t GetIndexInAdjMatrix(IngoingEdgeIteratorT ingoing, OutgoingEdgeIteratorT outgoing) const;
@ -63,6 +68,8 @@ public:
pair<IngoingEdgeIteratorT, IngoingEdgeIteratorT> GetIngoingIterators() const;
bool FindIngoingNodeByPoint(m2::PointD const & point, IngoingCrossNode & node) const;
pair<OutgoingEdgeIteratorT, OutgoingEdgeIteratorT> GetOutgoingIterators() const;
WritedEdgeWeightT GetAdjacencyCost(IngoingEdgeIteratorT ingoing,