Preparing data structures for turn directions
This commit is contained in:
parent
586e8b4c4b
commit
76488c58e8
@ -60,6 +60,10 @@ private:
|
||||
delete _heapForward;
|
||||
}
|
||||
};
|
||||
union _MiddleName {
|
||||
NodeID nameID;
|
||||
NodeID middle;
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
@ -71,7 +75,7 @@ public:
|
||||
bool shortcut : 1;
|
||||
bool forward : 1;
|
||||
bool backward : 1;
|
||||
NodeID middle;
|
||||
_MiddleName middleName;
|
||||
} data;
|
||||
|
||||
//sorts by source and other attributes
|
||||
@ -88,7 +92,7 @@ public:
|
||||
}
|
||||
|
||||
bool operator== ( const Edge& right ) const {
|
||||
return ( source == right.source && target == right.target && data.distance == right.data.distance && data.shortcut == right.data.shortcut && data.forward == right.data.forward && data.backward == right.data.backward && data.middle == right.data.middle );
|
||||
return ( source == right.source && target == right.target && data.distance == right.data.distance && data.shortcut == right.data.shortcut && data.forward == right.data.forward && data.backward == right.data.backward && data.middleName.middle == right.data.middleName.middle );
|
||||
}
|
||||
};
|
||||
|
||||
@ -118,7 +122,7 @@ public:
|
||||
newEdge.data.distance = _graph[edge].data.distance;
|
||||
newEdge.data.shortcut = _graph[edge].data.shortcut;
|
||||
if ( newEdge.data.shortcut )
|
||||
newEdge.data.middle = _graph[edge].data.middle;
|
||||
newEdge.data.middleName = _graph[edge].data.middleName;
|
||||
newEdge.data.forward = _graph[edge].data.forward;
|
||||
newEdge.data.backward = _graph[edge].data.backward;
|
||||
edges.push_back( newEdge );
|
||||
@ -211,7 +215,7 @@ private:
|
||||
Contractor::Witness temp;
|
||||
temp.source = _graph[i].source;
|
||||
temp.target = _graph[i].target;
|
||||
temp.middle = _graph[i].data.middle;
|
||||
temp.middleName.middle = _graph[i].data.middleName.middle;
|
||||
}
|
||||
}
|
||||
if ( _graph[i].data.backward ) {
|
||||
@ -222,7 +226,7 @@ private:
|
||||
Contractor::Witness temp;
|
||||
temp.source = _graph[i].target;
|
||||
temp.target = _graph[i].source;
|
||||
temp.middle = _graph[i].data.middle;
|
||||
temp.middleName.middle = _graph[i].data.middleName.middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -36,23 +36,29 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
|
||||
class Contractor {
|
||||
|
||||
private:
|
||||
|
||||
union _MiddleName {
|
||||
NodeID middle;
|
||||
NodeID nameID;
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
struct Witness {
|
||||
NodeID source;
|
||||
NodeID target;
|
||||
NodeID middle;
|
||||
_MiddleName middleName;
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
struct _EdgeData {
|
||||
int distance;
|
||||
unsigned originalEdges : 29;
|
||||
bool shortcut : 1;
|
||||
bool forward : 1;
|
||||
bool backward : 1;
|
||||
NodeID middle;
|
||||
_MiddleName middleName;
|
||||
} data;
|
||||
|
||||
struct _HeapData {
|
||||
@ -192,7 +198,7 @@ public:
|
||||
continue;
|
||||
}
|
||||
edge.data.shortcut = false;
|
||||
edge.data.middle = 0;
|
||||
edge.data.middleName.nameID = i->name();
|
||||
edge.data.forward = i->isForward();
|
||||
edge.data.backward = i->isBackward();
|
||||
edge.data.originalEdges = 1;
|
||||
@ -223,7 +229,7 @@ public:
|
||||
forwardEdge.target = backwardEdge.target = target;
|
||||
forwardEdge.data.forward = backwardEdge.data.backward = true;
|
||||
forwardEdge.data.backward = backwardEdge.data.forward = false;
|
||||
forwardEdge.data.middle = backwardEdge.data.middle = 0;
|
||||
forwardEdge.data.middleName.nameID = backwardEdge.data.middleName.nameID = 0;
|
||||
forwardEdge.data.shortcut = backwardEdge.data.shortcut = false;
|
||||
forwardEdge.data.originalEdges = backwardEdge.data.originalEdges = 1;
|
||||
forwardEdge.data.distance = backwardEdge.data.distance = std::numeric_limits< int >::max();
|
||||
@ -388,7 +394,7 @@ public:
|
||||
continue;
|
||||
if ( data.shortcut != edge.data.shortcut )
|
||||
continue;
|
||||
if ( data.middle != edge.data.middle )
|
||||
if ( data.middleName.middle != edge.data.middleName.middle )
|
||||
continue;
|
||||
data.forward |= edge.data.forward;
|
||||
data.backward |= edge.data.backward;
|
||||
@ -451,7 +457,7 @@ public:
|
||||
newEdge.target = target;
|
||||
newEdge.data.distance = data.distance;
|
||||
newEdge.data.shortcut = data.shortcut;
|
||||
newEdge.data.middle = data.middle;
|
||||
newEdge.data.middleName.middle = data.middleName.middle;
|
||||
newEdge.data.forward = data.forward;
|
||||
newEdge.data.backward = data.backward;
|
||||
edges.push_back( newEdge );
|
||||
@ -526,7 +532,7 @@ private:
|
||||
const NodeID start = node;
|
||||
const NodeID target = _graph->GetTarget( edge );
|
||||
const _EdgeData& data = _graph->GetEdgeData( edge );
|
||||
const NodeID middle = data.middle;
|
||||
const NodeID middle = data.middleName.middle;
|
||||
assert(start != target);
|
||||
if(data.shortcut)
|
||||
{
|
||||
@ -541,7 +547,8 @@ private:
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
assert(data.middle == 0);
|
||||
//can't rely on that, because we save the nameID instead
|
||||
assert(data.middleName.nameID == 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -604,7 +611,7 @@ private:
|
||||
newEdge.data.distance = pathDistance;
|
||||
newEdge.data.forward = true;
|
||||
newEdge.data.backward = false;
|
||||
newEdge.data.middle = node;
|
||||
newEdge.data.middleName.middle = node;
|
||||
newEdge.data.shortcut = true;
|
||||
newEdge.data.originalEdges = outData.originalEdges + inData.originalEdges;
|
||||
data->insertedEdges.push_back( newEdge );
|
||||
|
@ -92,7 +92,7 @@ NodeID readOSRMGraphFromStream(istream &in, vector<EdgeT>& edgeList, vector<Node
|
||||
|
||||
if(source == UINT_MAX || target == UINT_MAX) { cerr << "nonexisting source or target" << endl; exit(0); }
|
||||
|
||||
EdgeT inputEdge(source, target, weight, forward, backward, locatable);
|
||||
EdgeT inputEdge(source, target, edgeList.size(), weight, forward, backward, locatable);
|
||||
edgeList.push_back(inputEdge);
|
||||
}
|
||||
ext2IntNodeMap.clear();
|
||||
@ -124,7 +124,7 @@ void readHSGRFromStream(istream &in, vector<EdgeT> * edgeList) {
|
||||
in.read((char *)&(middle), sizeof(NodeID));
|
||||
in.read((char *)&(source), sizeof(NodeID));
|
||||
in.read((char *)&(target), sizeof(NodeID));
|
||||
e.backward = backward; e.distance = distance; e.forward = forward; e.middle = middle; e.shortcut = shortcut;
|
||||
e.backward = backward; e.distance = distance; e.forward = forward; e.middleName.middle = middle; e.shortcut = shortcut;
|
||||
g.data = e; g.source = source; g.target = target;
|
||||
|
||||
edgeList->push_back(g);
|
||||
|
@ -56,7 +56,7 @@ public:
|
||||
return nodeHelpDesk->getNumberOfNodes();
|
||||
}
|
||||
|
||||
unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<NodeID> * path, _Coordinate& startCoord, _Coordinate& targetCoord)
|
||||
unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<std::pair<NodeID, NodeID> > * path, _Coordinate& startCoord, _Coordinate& targetCoord)
|
||||
{
|
||||
bool onSameEdge = false;
|
||||
bool onSameEdgeReversed = false;
|
||||
@ -189,9 +189,12 @@ public:
|
||||
packedPath.push_back( pathNode );
|
||||
}
|
||||
|
||||
|
||||
|
||||
// push start node explicitely
|
||||
path->push_back(packedPath[0]);
|
||||
// if(packedPath[0] != packedPath[1])
|
||||
NodeID nameID = GetNameIDForOriginDestinationNodeID(phantomNodes->startNode1, packedPath[0]);
|
||||
|
||||
path->push_back(std::make_pair(packedPath[0], nameID) );
|
||||
{
|
||||
for(deque<NodeID>::size_type i = 0; i < packedPath.size()-1; i++)
|
||||
{
|
||||
@ -239,6 +242,16 @@ public:
|
||||
{
|
||||
nodeHelpDesk->FindRoutingStarts(start, target, routingStarts);
|
||||
}
|
||||
|
||||
inline NodeID GetNameIDForOriginDestinationNodeID(NodeID s, NodeID t) const {
|
||||
assert(s!=t);
|
||||
EdgeID e = _graph->FindEdge( s, t );
|
||||
if(e == UINT_MAX)
|
||||
e = _graph->FindEdge( t, s );
|
||||
assert(e != UINT_MAX);
|
||||
const EdgeData ed = _graph->GetEdgeData(e);
|
||||
return ed.middleName.nameID;
|
||||
}
|
||||
private:
|
||||
NodeHelperT * nodeHelpDesk;
|
||||
|
||||
@ -281,7 +294,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
bool _UnpackEdge( const NodeID source, const NodeID target, std::vector< NodeID >* path ) {
|
||||
bool _UnpackEdge( const NodeID source, const NodeID target, std::vector< std::pair<NodeID, NodeID> >* path ) {
|
||||
assert(source != target);
|
||||
//find edge first.
|
||||
typename GraphT::EdgeIterator smallestEdge = SPECIAL_EDGEID;
|
||||
@ -315,13 +328,14 @@ private:
|
||||
const EdgeData ed = _graph->GetEdgeData(smallestEdge);
|
||||
if(ed.shortcut)
|
||||
{//unpack
|
||||
const NodeID middle = ed.middle;
|
||||
const NodeID middle = ed.middleName.middle;
|
||||
_UnpackEdge(source, middle, path);
|
||||
_UnpackEdge(middle, target, path);
|
||||
return false;
|
||||
} else {
|
||||
assert(!ed.shortcut);
|
||||
path->push_back(target);
|
||||
//todo: push nameID along with target as a pair: push_back(std::make_pair(target, nameID))
|
||||
path->push_back(std::make_pair(target, ed.middleName.nameID) );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -44,10 +44,11 @@ public:
|
||||
/** Default constructor. target and weight are set to 0.*/
|
||||
Edge() { assert(false); } //shall not be used.
|
||||
|
||||
explicit Edge(NodeID s, NodeID t, EdgeWeight w, bool f, bool b, bool l) : _source(s), _target(t), _weight(w), forward(f), backward(b), locatable(l) { }
|
||||
explicit Edge(NodeID s, NodeID t, NodeID n, EdgeWeight w, bool f, bool b, bool l) : _source(s), _target(t), _name(n), _weight(w), forward(f), backward(b), locatable(l) { }
|
||||
|
||||
NodeID target() const {return _target; }
|
||||
NodeID source() const {return _source; }
|
||||
NodeID name() const { return _name; }
|
||||
EdgeWeight weight() const {return _weight; }
|
||||
|
||||
bool isBackward() const { return backward; }
|
||||
@ -59,6 +60,7 @@ public:
|
||||
private:
|
||||
NodeID _source;
|
||||
NodeID _target;
|
||||
NodeID _name;
|
||||
EdgeWeight _weight:29;
|
||||
bool forward:1;
|
||||
bool backward:1;
|
||||
|
@ -107,7 +107,7 @@ public:
|
||||
//cout << "coordinates in " << timestamp2 - timestamp << "s" << endl;
|
||||
|
||||
|
||||
vector<NodeID> * path = new vector<NodeID>();
|
||||
vector<std::pair<NodeID, NodeID> > * path = new vector<std::pair<NodeID, NodeID> >();
|
||||
PhantomNodes * phantomNodes = new PhantomNodes();
|
||||
// timestamp = get_timestamp();
|
||||
sEngine->FindRoutingStarts(startCoord, targetCoord, phantomNodes);
|
||||
@ -157,10 +157,11 @@ public:
|
||||
rep.content += tmp;
|
||||
rep.content += (" ");
|
||||
|
||||
|
||||
_Coordinate result;
|
||||
for(vector<NodeID>::iterator it = path->begin(); it != path->end(); it++)
|
||||
for(vector<std::pair<NodeID, NodeID> >::iterator it = path->begin(); it != path->end(); it++)
|
||||
{
|
||||
sEngine->getNodeInfo(*it, result);
|
||||
sEngine->getNodeInfo(it->first, result);
|
||||
convertLatLon(result.lon, tmp);
|
||||
rep.content += tmp;
|
||||
rep.content += (",");
|
||||
@ -168,6 +169,7 @@ public:
|
||||
rep.content += tmp;
|
||||
rep.content += (" ");
|
||||
}
|
||||
|
||||
convertLatLon(phantomNodes->targetCoord.lon, tmp);
|
||||
rep.content += tmp;
|
||||
rep.content += (",");
|
||||
|
@ -156,7 +156,7 @@ int main (int argc, char *argv[])
|
||||
bool shortcut= it->data.shortcut;
|
||||
bool forward= it->data.forward;
|
||||
bool backward= it->data.backward;
|
||||
NodeID middle= it->data.middle;
|
||||
NodeID middle= it->data.middleName.middle;
|
||||
NodeID source = it->source;
|
||||
NodeID target = it->target;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user