forked from organicmaps/organicmaps
Tree index for cross section index finding.
This commit is contained in:
parent
ffc2669bd4
commit
fc00ee4d41
3 changed files with 34 additions and 14 deletions
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue