BREAKING CHANGE, REPROCESS YOUR OSM FILES

All preparations necessary to compute and output turn directions.
This commit is contained in:
Dennis Luxen
2010-09-29 15:22:38 +00:00
parent 4c47d5b70e
commit 676f64b0ef
12 changed files with 307 additions and 87 deletions
+3 -2
View File
@@ -75,6 +75,7 @@ public:
bool shortcut : 1;
bool forward : 1;
bool backward : 1;
short type;
_MiddleName middleName;
} data;
@@ -121,10 +122,10 @@ public:
newEdge.data.distance = _graph[edge].data.distance;
newEdge.data.shortcut = _graph[edge].data.shortcut;
if ( newEdge.data.shortcut )
newEdge.data.middleName = _graph[edge].data.middleName;
newEdge.data.middleName = _graph[edge].data.middleName;
newEdge.data.forward = _graph[edge].data.forward;
newEdge.data.backward = _graph[edge].data.backward;
newEdge.data.type = _graph[edge].data.type;
edges.push_back( newEdge );
}
#ifdef _GLIBCXX_PARALLEL
+16 -6
View File
@@ -58,6 +58,7 @@ private:
bool shortcut : 1;
bool forward : 1;
bool backward : 1;
short type;
_MiddleName middleName;
} data;
@@ -199,6 +200,7 @@ public:
}
edge.data.shortcut = false;
edge.data.middleName.nameID = i->name();
edge.data.type = i->type();
edge.data.forward = i->isForward();
edge.data.backward = i->isBackward();
edge.data.originalEdges = 1;
@@ -218,6 +220,9 @@ public:
for ( NodeID i = 0; i < edges.size(); ) {
const NodeID source = edges[i].source;
const NodeID target = edges[i].target;
const NodeID middle = edges[i].data.middleName.nameID;
const short type = edges[i].data.type;
assert(type >= 0);
//remove eigenloops
if ( source == target ) {
i++;
@@ -229,7 +234,8 @@ public:
forwardEdge.target = backwardEdge.target = target;
forwardEdge.data.forward = backwardEdge.data.backward = true;
forwardEdge.data.backward = backwardEdge.data.forward = false;
forwardEdge.data.middleName.nameID = backwardEdge.data.middleName.nameID = 0;
forwardEdge.data.type = backwardEdge.data.type = type;
forwardEdge.data.middleName.nameID = backwardEdge.data.middleName.nameID = middle;
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();
@@ -457,7 +463,15 @@ public:
newEdge.target = target;
newEdge.data.distance = data.distance;
newEdge.data.shortcut = data.shortcut;
newEdge.data.middleName.middle = data.middleName.middle;
if(data.shortcut) {
newEdge.data.middleName.middle = data.middleName.middle;
newEdge.data.type = -1;
} else {
newEdge.data.middleName.nameID = data.middleName.nameID;
newEdge.data.type = data.type;
assert(newEdge.data.type >= 0);
}
newEdge.data.forward = data.forward;
newEdge.data.backward = data.backward;
edges.push_back( newEdge );
@@ -546,9 +560,6 @@ private:
assert(false);
return false;
}
} else {
//can't rely on that, because we save the nameID instead
assert(data.middleName.nameID == 0);
}
}
}
@@ -557,7 +568,6 @@ private:
template< bool Simulate > bool _Contract( _ThreadData* data, NodeID node, _ContractionInformation* stats = NULL ) {
_Heap& heap = data->heap;
//std::vector< Witness >& witnessList = data->witnessList;
for ( _DynamicGraph::EdgeIterator inEdge = _graph->BeginEdges( node ), endInEdges = _graph->EndEdges( node ); inEdge != endInEdges; ++inEdge ) {
const _EdgeData& inData = _graph->GetEdgeData( inEdge );
+8 -5
View File
@@ -45,7 +45,7 @@ template<typename EdgeT>
NodeID readOSRMGraphFromStream(istream &in, vector<EdgeT>& edgeList, vector<NodeInfo> * int2ExtNodeMap) {
NodeID n, source, target, id;
EdgeID m;
bool locatable;
short locatable;
int dir, xcoord, ycoord;// direction (0 = open, 1 = forward, 2+ = open)
ExternalNodeMap ext2IntNodeMap;
ext2IntNodeMap.set_empty_key(UINT_MAX);
@@ -62,9 +62,10 @@ NodeID readOSRMGraphFromStream(istream &in, vector<EdgeT>& edgeList, vector<Node
edgeList.reserve(m);
for (EdgeID i=0; i<m; i++) {
EdgeWeight weight;
short type;
NodeID nameID;
int length;
in >> source >> target >> length >> dir >> weight >> locatable;
in >> source >> target >> length >> dir >> weight >> type >> nameID;
assert(length > 0);
assert(weight > 0);
assert(0<=dir && dir<=2);
@@ -92,7 +93,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, edgeList.size(), weight, forward, backward, locatable);
EdgeT inputEdge(source, target, nameID, weight, forward, backward, type );
edgeList.push_back(inputEdge);
}
ext2IntNodeMap.clear();
@@ -112,6 +113,7 @@ void readHSGRFromStream(istream &in, vector<EdgeT> * edgeList) {
bool shortcut;
bool forward;
bool backward;
short type;
NodeID middle;
NodeID source;
NodeID target;
@@ -122,9 +124,10 @@ void readHSGRFromStream(istream &in, vector<EdgeT> * edgeList) {
in.read((char *)&(forward), sizeof(bool));
in.read((char *)&(backward), sizeof(bool));
in.read((char *)&(middle), sizeof(NodeID));
in.read((char *)&(type), sizeof(short));
in.read((char *)&(source), sizeof(NodeID));
in.read((char *)&(target), sizeof(NodeID));
e.backward = backward; e.distance = distance; e.forward = forward; e.middleName.middle = middle; e.shortcut = shortcut;
e.backward = backward; e.distance = distance; e.forward = forward; e.middleName.middle = middle; e.shortcut = shortcut; e.type = type;
g.data = e; g.source = source; g.target = target;
edgeList->push_back(g);
+33 -21
View File
@@ -40,9 +40,10 @@ template<typename EdgeData, typename GraphT, typename NodeHelperT = NodeInformat
class SearchEngine {
private:
const GraphT * _graph;
std::vector<string> * _names;
inline double absDouble(double input) { if(input < 0) return input*(-1); else return input;}
public:
SearchEngine(GraphT * g, NodeHelperT * nh) : _graph(g), nodeHelpDesk(nh) {}
SearchEngine(GraphT * g, NodeHelperT * nh, vector<string> * n = new vector<string>()) : _graph(g), nodeHelpDesk(nh), _names(n) {}
~SearchEngine() {}
inline const void getNodeInfo(NodeID id, _Coordinate& result) const
@@ -56,10 +57,14 @@ public:
return nodeHelpDesk->getNumberOfNodes();
}
unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<std::pair<NodeID, NodeID> > * path, _Coordinate& startCoord, _Coordinate& targetCoord)
unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<NodeID > * path, _Coordinate& startCoord, _Coordinate& targetCoord)
{
bool onSameEdge = false;
bool onSameEdgeReversed = false;
bool startReverse = false;
bool targetReverse = false;
_Heap * _forwardHeap = new _Heap(nodeHelpDesk->getNumberOfNodes());
_Heap * _backwardHeap = new _Heap(nodeHelpDesk->getNumberOfNodes());
NodeID middle = ( NodeID ) 0;
@@ -111,11 +116,10 @@ public:
} else if(phantomNodes->startNode1 != UINT_MAX)
{
bool reverse = false;
EdgeID edge = _graph->FindEdge( phantomNodes->startNode1, phantomNodes->startNode2);
if(edge == UINT_MAX){
edge = _graph->FindEdge( phantomNodes->startNode2, phantomNodes->startNode1 );
reverse = true;
startReverse = true;
}
if(edge == UINT_MAX){
delete _forwardHeap;
@@ -124,18 +128,17 @@ public:
}
EdgeWeight w = _graph->GetEdgeData( edge ).distance;
if( (_graph->GetEdgeData( edge ).backward && !reverse) || (_graph->GetEdgeData( edge ).forward && reverse) )
if( (_graph->GetEdgeData( edge ).backward && !startReverse) || (_graph->GetEdgeData( edge ).forward && startReverse) )
_forwardHeap->Insert(phantomNodes->startNode1, absDouble( w*phantomNodes->startRatio), phantomNodes->startNode1);
if( (_graph->GetEdgeData( edge ).backward && reverse) || (_graph->GetEdgeData( edge ).forward && !reverse) )
if( (_graph->GetEdgeData( edge ).backward && startReverse) || (_graph->GetEdgeData( edge ).forward && !startReverse) )
_forwardHeap->Insert(phantomNodes->startNode2, absDouble(w-w*phantomNodes->startRatio), phantomNodes->startNode2);
}
if(phantomNodes->targetNode1 != UINT_MAX && !onSameEdgeReversed)
{
bool reverse = false;
EdgeID edge = _graph->FindEdge( phantomNodes->targetNode1, phantomNodes->targetNode2);
if(edge == UINT_MAX){
edge = _graph->FindEdge( phantomNodes->targetNode2, phantomNodes->targetNode1 );
reverse = true;
targetReverse = true;
}
if(edge == UINT_MAX){
delete _forwardHeap;
@@ -144,9 +147,9 @@ public:
}
EdgeWeight w = _graph->GetEdgeData( edge ).distance;
if( (_graph->GetEdgeData( edge ).backward && !reverse) || (_graph->GetEdgeData( edge ).forward && reverse) )
if( (_graph->GetEdgeData( edge ).backward && !targetReverse) || (_graph->GetEdgeData( edge ).forward && targetReverse) )
_backwardHeap->Insert(phantomNodes->targetNode2, absDouble( w*phantomNodes->targetRatio), phantomNodes->targetNode2);
if( (_graph->GetEdgeData( edge ).backward && reverse) || (_graph->GetEdgeData( edge ).forward && !reverse) )
if( (_graph->GetEdgeData( edge ).backward && targetReverse) || (_graph->GetEdgeData( edge ).forward && !targetReverse) )
_backwardHeap->Insert(phantomNodes->targetNode1, absDouble(w-w*phantomNodes->startRatio), phantomNodes->targetNode1);
}
@@ -180,7 +183,7 @@ public:
pathNode = _forwardHeap->GetData( pathNode ).parent;
packedPath.push_front( pathNode );
}
NodeID realStart = pathNode;
packedPath.push_back( middle );
pathNode = middle;
@@ -189,12 +192,7 @@ public:
packedPath.push_back( pathNode );
}
// push start node explicitely
NodeID nameID = GetNameIDForOriginDestinationNodeID( (phantomNodes->startNode1 == packedPath[0] ? phantomNodes->startNode2 : phantomNodes->startNode1) , packedPath[0]);
path->push_back(std::make_pair(packedPath[0], nameID) );
path->push_back(packedPath[0] );
{
for(deque<NodeID>::size_type i = 0; i < packedPath.size()-1; i++)
{
@@ -235,7 +233,7 @@ public:
inline unsigned int findNearestNodeForLatLon(const _Coordinate& coord, _Coordinate& result) const
{
nodeHelpDesk->findNearestNodeIDForLatLon( coord, result );
nodeHelpDesk->findNearestNodeCoordForLatLon( coord, result );
}
inline bool FindRoutingStarts(const _Coordinate start, const _Coordinate target, PhantomNodes * routingStarts)
@@ -252,6 +250,21 @@ public:
const EdgeData ed = _graph->GetEdgeData(e);
return ed.middleName.nameID;
}
inline std::string& GetNameForNameID(const NodeID nameID) const {
assert(nameID < _names->size());
return _names->at(nameID);
}
inline short GetTypeOfEdgeForOriginDestinationNodeID(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.type;
}
private:
NodeHelperT * nodeHelpDesk;
@@ -294,7 +307,7 @@ private:
}
}
bool _UnpackEdge( const NodeID source, const NodeID target, std::vector< std::pair<NodeID, NodeID> >* path ) {
bool _UnpackEdge( const NodeID source, const NodeID target, std::vector< NodeID >* path ) {
assert(source != target);
//find edge first.
typename GraphT::EdgeIterator smallestEdge = SPECIAL_EDGEID;
@@ -334,8 +347,7 @@ private:
return false;
} else {
assert(!ed.shortcut);
//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) );
path->push_back(target);
return true;
}
}