BREAKING CHANGE, REPROCESS YOUR OSM FILES
Ferry egdes are now ignores by nearest neighbor grid
This commit is contained in:
parent
e79e36bea9
commit
1ba915cbed
@ -25,7 +25,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#else
|
#else
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#endif
|
#endif
|
||||||
#include "DynamicGraph.h"
|
#include "../DataStructures/DynamicGraph.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -460,65 +460,8 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeID GetNumberOfComponents()
|
|
||||||
{
|
|
||||||
NodeID unique = 1;
|
|
||||||
NodeID largestRun = 0;
|
|
||||||
NodeID tmp = 1;
|
|
||||||
_components = new std::vector<NodeID>(_graph->GetNumberOfNodes(), 0);
|
|
||||||
for(NodeID i = 0; i < _graph->GetNumberOfNodes(); i++)
|
|
||||||
{
|
|
||||||
BFSAtNode(i);
|
|
||||||
}
|
|
||||||
#ifdef _GLIBCXX_PARALLEL
|
|
||||||
__gnu_parallel::sort( _components->begin(), _components->end() );
|
|
||||||
#else
|
|
||||||
std::sort(_components->begin(), _components->end());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for(NodeID i = 0; i < _graph->GetNumberOfNodes()-1; i++)
|
|
||||||
{
|
|
||||||
if( _components->at(i) != _components->at(i+1)){
|
|
||||||
if(tmp > largestRun)
|
|
||||||
{
|
|
||||||
largestRun = tmp;
|
|
||||||
}
|
|
||||||
tmp = 1;
|
|
||||||
unique++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
tmp++;
|
|
||||||
}
|
|
||||||
if(tmp > largestRun)
|
|
||||||
largestRun = tmp;
|
|
||||||
_components->clear();
|
|
||||||
cout << "Largest component has size: " << largestRun << endl;
|
|
||||||
return unique;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void BFSAtNode(const NodeID n){
|
|
||||||
std::stack<NodeID> * bfsStack = new std::stack<NodeID>();
|
|
||||||
if(_components->at(n) != 0)
|
|
||||||
return;
|
|
||||||
_components->at(n) = n+1;
|
|
||||||
bfsStack->push(n);
|
|
||||||
while(!bfsStack->empty())
|
|
||||||
{
|
|
||||||
NodeID node = bfsStack->top();
|
|
||||||
bfsStack->pop();
|
|
||||||
for(_DynamicGraph::EdgeIterator e = _graph->BeginEdges(node); e < _graph->EndEdges(node); e++)
|
|
||||||
{
|
|
||||||
if(_components->at(_graph->GetTarget(e))!=0)
|
|
||||||
continue;
|
|
||||||
_components->at(_graph->GetTarget(e)) = n+1;
|
|
||||||
bfsStack->push(_graph->GetTarget(e));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete bfsStack;
|
|
||||||
}
|
|
||||||
|
|
||||||
double _Timestamp() {
|
double _Timestamp() {
|
||||||
return time(NULL);
|
return time(NULL);
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,7 @@ template<typename EdgeT>
|
|||||||
inline NodeID readOSMRGraphFromStream(istream &in, vector<EdgeT>& edgeList, vector<NodeInfo> * int2ExtNodeMap) {
|
inline NodeID readOSMRGraphFromStream(istream &in, vector<EdgeT>& edgeList, vector<NodeInfo> * int2ExtNodeMap) {
|
||||||
NodeID n, source, target, id;
|
NodeID n, source, target, id;
|
||||||
EdgeID m;
|
EdgeID m;
|
||||||
|
bool locatable;
|
||||||
int dir, xcoord, ycoord;// direction (0 = open, 1 = forward, 2+ = open)
|
int dir, xcoord, ycoord;// direction (0 = open, 1 = forward, 2+ = open)
|
||||||
ExternalNodeMap ext2IntNodeMap;
|
ExternalNodeMap ext2IntNodeMap;
|
||||||
ext2IntNodeMap.set_empty_key(UINT_MAX);
|
ext2IntNodeMap.set_empty_key(UINT_MAX);
|
||||||
@ -62,7 +63,7 @@ inline NodeID readOSMRGraphFromStream(istream &in, vector<EdgeT>& edgeList, vect
|
|||||||
for (EdgeID i=0; i<m; i++) {
|
for (EdgeID i=0; i<m; i++) {
|
||||||
EdgeWeight weight;
|
EdgeWeight weight;
|
||||||
int length;
|
int length;
|
||||||
in >> source >> target >> length >> dir >> weight;
|
in >> source >> target >> length >> dir >> weight >> locatable;
|
||||||
|
|
||||||
assert(length > 0);
|
assert(length > 0);
|
||||||
assert(weight > 0);
|
assert(weight > 0);
|
||||||
@ -91,7 +92,7 @@ inline NodeID readOSMRGraphFromStream(istream &in, vector<EdgeT>& edgeList, vect
|
|||||||
|
|
||||||
if(source == UINT_MAX || target == UINT_MAX) { cerr << "nonexisting source or target" << endl; exit(0); }
|
if(source == UINT_MAX || target == UINT_MAX) { cerr << "nonexisting source or target" << endl; exit(0); }
|
||||||
|
|
||||||
EdgeT inputEdge(source, target, weight, forward, backward);
|
EdgeT inputEdge(source, target, weight, forward, backward, locatable);
|
||||||
edgeList.push_back(inputEdge);
|
edgeList.push_back(inputEdge);
|
||||||
}
|
}
|
||||||
ext2IntNodeMap.clear();
|
ext2IntNodeMap.clear();
|
||||||
|
@ -73,7 +73,7 @@ public:
|
|||||||
currentEdge = _graph->FindEdge( phantomNodes->startNode2, phantomNodes->startNode1 );
|
currentEdge = _graph->FindEdge( phantomNodes->startNode2, phantomNodes->startNode1 );
|
||||||
if(currentEdge != UINT_MAX && _graph->GetEdgeData(currentEdge).forward && phantomNodes->startRatio < phantomNodes->targetRatio)
|
if(currentEdge != UINT_MAX && _graph->GetEdgeData(currentEdge).forward && phantomNodes->startRatio < phantomNodes->targetRatio)
|
||||||
{ //upperbound auf kantenlänge setzen
|
{ //upperbound auf kantenlänge setzen
|
||||||
cout << "start and target on same edge" << endl;
|
// cout << "start and target on same edge" << endl;
|
||||||
onSameEdge = true;
|
onSameEdge = true;
|
||||||
_upperbound = 10 * ApproximateDistance(phantomNodes->startCoord.lat, phantomNodes->startCoord.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon);
|
_upperbound = 10 * ApproximateDistance(phantomNodes->startCoord.lat, phantomNodes->startCoord.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon);
|
||||||
} else if (currentEdge != UINT_MAX && !_graph->GetEdgeData(currentEdge).backward) {
|
} else if (currentEdge != UINT_MAX && !_graph->GetEdgeData(currentEdge).backward) {
|
||||||
|
@ -44,7 +44,7 @@ public:
|
|||||||
/** Default constructor. target and weight are set to 0.*/
|
/** Default constructor. target and weight are set to 0.*/
|
||||||
Edge() { assert(false); } //shall not be used.
|
Edge() { assert(false); } //shall not be used.
|
||||||
|
|
||||||
explicit Edge(NodeID s, NodeID t, EdgeWeight w, bool f, bool b) : _source(s), _target(t), _weight(w), forward(f), backward(b) { }
|
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) { }
|
||||||
|
|
||||||
NodeID target() const {return _target; }
|
NodeID target() const {return _target; }
|
||||||
NodeID source() const {return _source;}
|
NodeID source() const {return _source;}
|
||||||
@ -54,12 +54,15 @@ public:
|
|||||||
|
|
||||||
bool isForward() const { return forward; }
|
bool isForward() const { return forward; }
|
||||||
|
|
||||||
|
bool isLocatable() const { return locatable; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NodeID _source;
|
NodeID _source;
|
||||||
NodeID _target;
|
NodeID _target;
|
||||||
EdgeWeight _weight:30;
|
EdgeWeight _weight:29;
|
||||||
bool forward:1;
|
bool forward:1;
|
||||||
bool backward:1;
|
bool backward:1;
|
||||||
|
bool locatable:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Edge ImportEdge;
|
typedef Edge ImportEdge;
|
||||||
|
@ -45,8 +45,6 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#include "Contractor/BinaryHeap.h"
|
#include "Contractor/BinaryHeap.h"
|
||||||
#include "Contractor/Contractor.h"
|
#include "Contractor/Contractor.h"
|
||||||
#include "Contractor/ContractionCleanup.h"
|
#include "Contractor/ContractionCleanup.h"
|
||||||
#include "Contractor/DynamicGraph.h"
|
|
||||||
|
|
||||||
#include "DataStructures/NNGrid.h"
|
#include "DataStructures/NNGrid.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@ -95,6 +93,8 @@ int main (int argc, char *argv[])
|
|||||||
Percent p(edgeList.size());
|
Percent p(edgeList.size());
|
||||||
for(NodeID i = 0; i < edgeList.size(); i++)
|
for(NodeID i = 0; i < edgeList.size(); i++)
|
||||||
{
|
{
|
||||||
|
if(!edgeList[i].isLocatable())
|
||||||
|
continue;
|
||||||
p.printIncrement();
|
p.printIncrement();
|
||||||
int slat = int2ExtNodeMap->at(edgeList[i].source()).lat;
|
int slat = int2ExtNodeMap->at(edgeList[i].source()).lat;
|
||||||
int slon = int2ExtNodeMap->at(edgeList[i].source()).lon;
|
int slon = int2ExtNodeMap->at(edgeList[i].source()).lon;
|
||||||
|
@ -246,20 +246,21 @@ int main (int argc, char *argv[])
|
|||||||
double weight = ( distance * 10. ) / (eit->speed / 3.6);
|
double weight = ( distance * 10. ) / (eit->speed / 3.6);
|
||||||
int intWeight = max(1, (int) weight);
|
int intWeight = max(1, (int) weight);
|
||||||
int intDist = max(1, (int)distance);
|
int intDist = max(1, (int)distance);
|
||||||
|
int ferryIndex = settings.indexInAccessListOf("ferry");
|
||||||
|
|
||||||
switch(eit->direction)
|
switch(eit->direction)
|
||||||
{
|
{
|
||||||
case _Way::notSure:
|
case _Way::notSure:
|
||||||
fout << startit->first << " " << targetit->first << " " << intDist << " " << 0 << " " << intWeight << "\n";
|
fout << startit->first << " " << targetit->first << " " << intDist << " " << 0 << " " << intWeight << " " << (eit->type == ferryIndex ? false :true ) << "\n";
|
||||||
break;
|
break;
|
||||||
case _Way::oneway:
|
case _Way::oneway:
|
||||||
fout << startit->first << " " << targetit->first << " " << intDist << " " << 1 << " " << intWeight << "\n";
|
fout << startit->first << " " << targetit->first << " " << intDist << " " << 1 << " " << intWeight << " " << (eit->type == ferryIndex ? false :true ) << "\n";
|
||||||
break;
|
break;
|
||||||
case _Way::bidirectional:
|
case _Way::bidirectional:
|
||||||
fout << startit->first << " " << targetit->first << " " << intDist << " " << 0 << " " << intWeight << "\n";
|
fout << startit->first << " " << targetit->first << " " << intDist << " " << 0 << " " << intWeight << " " << (eit->type == ferryIndex ? false :true ) << "\n";
|
||||||
break;
|
break;
|
||||||
case _Way::opposite:
|
case _Way::opposite:
|
||||||
fout << startit->first << " " << targetit->first << " " << intDist << " " << 1 << " " << intWeight << "\n";
|
fout << startit->first << " " << targetit->first << " " << intDist << " " << 1 << " " << intWeight << " " << (eit->type == ferryIndex ? false :true ) << "\n";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
|
61
routed.cpp
61
routed.cpp
@ -47,7 +47,6 @@ typedef http::server<StaticGraph<EdgeData> > server;
|
|||||||
/*
|
/*
|
||||||
* TODO: Description of command line arguments
|
* TODO: Description of command line arguments
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int main (int argc, char *argv[])
|
int main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
double time;
|
double time;
|
||||||
@ -99,38 +98,38 @@ int main (int argc, char *argv[])
|
|||||||
cout << "deserializing node map and building nearest neighbor grid ..." << flush;
|
cout << "deserializing node map and building nearest neighbor grid ..." << flush;
|
||||||
nodeInfoHelper->initNNGrid(in2);
|
nodeInfoHelper->initNNGrid(in2);
|
||||||
cout << "in " << get_timestamp() - time << "s" << endl;
|
cout << "in " << get_timestamp() - time << "s" << endl;
|
||||||
time = get_timestamp();
|
// time = get_timestamp();
|
||||||
StaticGraph<EdgeData> * graph = new StaticGraph<EdgeData>(nodeInfoHelper->getNumberOfNodes()-1, *edgelist);
|
StaticGraph<EdgeData> * graph = new StaticGraph<EdgeData>(nodeInfoHelper->getNumberOfNodes()-1, *edgelist);
|
||||||
delete edgelist;
|
delete edgelist;
|
||||||
cout << "checking data sanity ..." << flush;
|
// cout << "checking data sanity ..." << flush;
|
||||||
NodeID numberOfNodes = graph->GetNumberOfNodes();
|
// NodeID numberOfNodes = graph->GetNumberOfNodes();
|
||||||
for ( NodeID node = 0; node < numberOfNodes; ++node ) {
|
// for ( NodeID node = 0; node < numberOfNodes; ++node ) {
|
||||||
for ( StaticGraph<EdgeData>::EdgeIterator edge = graph->BeginEdges( node ), endEdges = graph->EndEdges( node ); edge != endEdges; ++edge ) {
|
// for ( StaticGraph<EdgeData>::EdgeIterator edge = graph->BeginEdges( node ), endEdges = graph->EndEdges( node ); edge != endEdges; ++edge ) {
|
||||||
const NodeID start = node;
|
// const NodeID start = node;
|
||||||
const NodeID target = graph->GetTarget( edge );
|
// const NodeID target = graph->GetTarget( edge );
|
||||||
const EdgeData& data = graph->GetEdgeData( edge );
|
// const EdgeData& data = graph->GetEdgeData( edge );
|
||||||
const NodeID middle = data.middle;
|
// const NodeID middle = data.middle;
|
||||||
assert(start != target);
|
// assert(start != target);
|
||||||
if(data.shortcut)
|
// if(data.shortcut)
|
||||||
{
|
// {
|
||||||
if(graph->FindEdge(start, middle) == SPECIAL_EDGEID && graph->FindEdge(middle, start) == SPECIAL_EDGEID)
|
// if(graph->FindEdge(start, middle) == SPECIAL_EDGEID && graph->FindEdge(middle, start) == SPECIAL_EDGEID)
|
||||||
{
|
// {
|
||||||
assert(false);
|
// assert(false);
|
||||||
cerr << "hierarchy broken" << endl; exit(-1);
|
// cerr << "hierarchy broken" << endl; exit(-1);
|
||||||
}
|
// }
|
||||||
if(graph->FindEdge(middle, target) == SPECIAL_EDGEID && graph->FindEdge(target, middle) == SPECIAL_EDGEID)
|
// if(graph->FindEdge(middle, target) == SPECIAL_EDGEID && graph->FindEdge(target, middle) == SPECIAL_EDGEID)
|
||||||
{
|
// {
|
||||||
assert(false);
|
// assert(false);
|
||||||
cerr << "hierarchy broken" << endl; exit(-1);
|
// cerr << "hierarchy broken" << endl; exit(-1);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
if(graph->GetOutDegree(node) == 0)
|
// if(graph->GetOutDegree(node) == 0)
|
||||||
{
|
// {
|
||||||
cerr << "found node with degree 0: " << node << endl;
|
// cerr << "found node with degree 0: " << node << endl;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
cout << "in " << get_timestamp() - time << "s" << endl;
|
// cout << "in " << get_timestamp() - time << "s" << endl;
|
||||||
time = get_timestamp();
|
time = get_timestamp();
|
||||||
cout << "building search graph ..." << flush;
|
cout << "building search graph ..." << flush;
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ typedef NodeCoords<NodeID> NodeInfo;
|
|||||||
#include "Contractor/Contractor.h"
|
#include "Contractor/Contractor.h"
|
||||||
#include "Contractor/ContractionCleanup.h"
|
#include "Contractor/ContractionCleanup.h"
|
||||||
typedef ContractionCleanup::Edge::EdgeData EdgeData;
|
typedef ContractionCleanup::Edge::EdgeData EdgeData;
|
||||||
#include "Contractor/DynamicGraph.h"
|
#include "DataStructures/DynamicGraph.h"
|
||||||
#include "Contractor/SearchEngine.h"
|
#include "Contractor/SearchEngine.h"
|
||||||
|
|
||||||
#endif /* TYPEDEFS_H_ */
|
#endif /* TYPEDEFS_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user