Exploration of tiny components.
This commit is contained in:
parent
6f78bd7a85
commit
7467e11147
@ -19,6 +19,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <queue>
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/property_tree/ptree.hpp>
|
#include <boost/property_tree/ptree.hpp>
|
||||||
@ -76,7 +77,7 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(int nodes, std::vector<NodeBasedEdg
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// INFO("traffic signal penalty: " << trafficSignalPenalty << ", U-Turn penalty: " << uturnPenalty << ", takeMinimumOfSpeeds=" << (takeMinimumOfSpeeds ? "yes" : "no"));
|
// INFO("traffic signal penalty: " << trafficSignalPenalty << ", U-Turn penalty: " << uturnPenalty << ", takeMinimumOfSpeeds=" << (takeMinimumOfSpeeds ? "yes" : "no"));
|
||||||
|
|
||||||
BOOST_FOREACH(NodeID id, bn) {
|
BOOST_FOREACH(NodeID id, bn) {
|
||||||
_barrierNodes[id] = true;
|
_barrierNodes[id] = true;
|
||||||
@ -86,7 +87,7 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(int nodes, std::vector<NodeBasedEdg
|
|||||||
}
|
}
|
||||||
|
|
||||||
DeallocatingVector< _NodeBasedEdge > edges;
|
DeallocatingVector< _NodeBasedEdge > edges;
|
||||||
// edges.reserve( 2 * inputEdges.size() );
|
// edges.reserve( 2 * inputEdges.size() );
|
||||||
for ( std::vector< NodeBasedEdge >::const_iterator i = inputEdges.begin(); i != inputEdges.end(); ++i ) {
|
for ( std::vector< NodeBasedEdge >::const_iterator i = inputEdges.begin(); i != inputEdges.end(); ++i ) {
|
||||||
|
|
||||||
_NodeBasedEdge edge;
|
_NodeBasedEdge edge;
|
||||||
@ -179,7 +180,8 @@ bool EdgeBasedGraphFactory::CheckIfTurnIsRestricted(const NodeID u, const NodeID
|
|||||||
void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
||||||
_NodeBasedDynamicGraph::EdgeIterator e1,
|
_NodeBasedDynamicGraph::EdgeIterator e1,
|
||||||
_NodeBasedDynamicGraph::NodeIterator u,
|
_NodeBasedDynamicGraph::NodeIterator u,
|
||||||
_NodeBasedDynamicGraph::NodeIterator v) {
|
_NodeBasedDynamicGraph::NodeIterator v,
|
||||||
|
bool belongsToTinyComponent) {
|
||||||
_NodeBasedDynamicGraph::EdgeData & data = _nodeBasedGraph->GetEdgeData(e1);
|
_NodeBasedDynamicGraph::EdgeData & data = _nodeBasedGraph->GetEdgeData(e1);
|
||||||
EdgeBasedNode currentNode;
|
EdgeBasedNode currentNode;
|
||||||
currentNode.nameID = data.nameID;
|
currentNode.nameID = data.nameID;
|
||||||
@ -187,10 +189,10 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
|||||||
currentNode.lon1 = inputNodeInfoList[u].lon;
|
currentNode.lon1 = inputNodeInfoList[u].lon;
|
||||||
currentNode.lat2 = inputNodeInfoList[v].lat;
|
currentNode.lat2 = inputNodeInfoList[v].lat;
|
||||||
currentNode.lon2 = inputNodeInfoList[v].lon;
|
currentNode.lon2 = inputNodeInfoList[v].lon;
|
||||||
|
currentNode.belongsToTinyComponent = belongsToTinyComponent;
|
||||||
currentNode.id = data.edgeBasedNodeID;
|
currentNode.id = data.edgeBasedNodeID;
|
||||||
currentNode.ignoreInGrid = data.ignoreInGrid;
|
currentNode.ignoreInGrid = data.ignoreInGrid;
|
||||||
currentNode.weight = data.distance;
|
currentNode.weight = data.distance;
|
||||||
//currentNode.weight += ComputeHeightPenalty(u, v);
|
|
||||||
edgeBasedNodes.push_back(currentNode);
|
edgeBasedNodes.push_back(currentNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,6 +205,63 @@ void EdgeBasedGraphFactory::Run(const char * originalEdgeDataFilename) {
|
|||||||
originalEdgeDataOutFile.write((char*)&numberOfOriginalEdges, sizeof(unsigned));
|
originalEdgeDataOutFile.write((char*)&numberOfOriginalEdges, sizeof(unsigned));
|
||||||
|
|
||||||
|
|
||||||
|
INFO("Identifying small components");
|
||||||
|
//Run a BFS on the undirected graph and identify small components
|
||||||
|
std::queue<std::pair<NodeID, NodeID> > bfsQueue;
|
||||||
|
std::vector<unsigned> componentsIndex(_nodeBasedGraph->GetNumberOfNodes(), UINT_MAX);
|
||||||
|
std::vector<NodeID> vectorOfComponentSizes;
|
||||||
|
unsigned currentComponent = 0, sizeOfCurrentComponent = 0, settledNodes = 0;
|
||||||
|
//put unexplorered node with parent pointer into queue
|
||||||
|
for(NodeID node = 0, endNodes = _nodeBasedGraph->GetNumberOfNodes(); node < endNodes; ++node) {
|
||||||
|
if(UINT_MAX == componentsIndex[node]) {
|
||||||
|
bfsQueue.push(std::make_pair(node, node));
|
||||||
|
//mark node as read
|
||||||
|
componentsIndex[node] = currentComponent;
|
||||||
|
p.printIncrement();
|
||||||
|
while(!bfsQueue.empty()) {
|
||||||
|
//fetch element from BFS queue
|
||||||
|
std::pair<NodeID, NodeID> currentQueueItem = bfsQueue.front();
|
||||||
|
bfsQueue.pop();
|
||||||
|
// INFO("sizeof queue: " << bfsQueue.size() << ", sizeOfCurrentComponents: " << sizeOfCurrentComponent << ", settled nodes: " << settledNodes++ << ", max: " << endNodes);
|
||||||
|
const NodeID v = currentQueueItem.first; //current node
|
||||||
|
const NodeID u = currentQueueItem.second; //parent
|
||||||
|
//increment size counter of current component
|
||||||
|
++sizeOfCurrentComponent;
|
||||||
|
const bool isBollardNode = (_barrierNodes.find(v) != _barrierNodes.end());
|
||||||
|
if(!isBollardNode) {
|
||||||
|
const NodeID onlyToNode = CheckForEmanatingIsOnlyTurn(u, v);
|
||||||
|
|
||||||
|
//relaxieren edge outgoing edge like below where edge-expanded graph
|
||||||
|
for(_NodeBasedDynamicGraph::EdgeIterator e2 = _nodeBasedGraph->BeginEdges(v); e2 < _nodeBasedGraph->EndEdges(v); ++e2) {
|
||||||
|
_NodeBasedDynamicGraph::NodeIterator w = _nodeBasedGraph->GetTarget(e2);
|
||||||
|
|
||||||
|
if(onlyToNode != UINT_MAX && w != onlyToNode) { //We are at an only_-restriction but not at the right turn.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( u != w ) { //only add an edge if turn is not a U-turn except it is the end of dead-end street.
|
||||||
|
if (!CheckIfTurnIsRestricted(u, v, w) ) { //only add an edge if turn is not prohibited
|
||||||
|
//insert next (node, parent) only if w has not yet been explored
|
||||||
|
if(UINT_MAX == componentsIndex[w]) {
|
||||||
|
//mark node as read
|
||||||
|
componentsIndex[w] = currentComponent;
|
||||||
|
bfsQueue.push(std::make_pair(w,v));
|
||||||
|
p.printIncrement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//push size into vector
|
||||||
|
vectorOfComponentSizes.push_back(sizeOfCurrentComponent);
|
||||||
|
//reset counters;
|
||||||
|
sizeOfCurrentComponent = 0;
|
||||||
|
++currentComponent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
INFO("identified: " << vectorOfComponentSizes.size() << " many components");
|
||||||
|
|
||||||
|
p.reinit(_nodeBasedGraph->GetNumberOfNodes());
|
||||||
//loop over all edges and generate new set of nodes.
|
//loop over all edges and generate new set of nodes.
|
||||||
for(_NodeBasedDynamicGraph::NodeIterator u = 0; u < _nodeBasedGraph->GetNumberOfNodes(); ++u ) {
|
for(_NodeBasedDynamicGraph::NodeIterator u = 0; u < _nodeBasedGraph->GetNumberOfNodes(); ++u ) {
|
||||||
for(_NodeBasedDynamicGraph::EdgeIterator e1 = _nodeBasedGraph->BeginEdges(u); e1 < _nodeBasedGraph->EndEdges(u); ++e1) {
|
for(_NodeBasedDynamicGraph::EdgeIterator e1 = _nodeBasedGraph->BeginEdges(u); e1 < _nodeBasedGraph->EndEdges(u); ++e1) {
|
||||||
@ -212,7 +271,8 @@ void EdgeBasedGraphFactory::Run(const char * originalEdgeDataFilename) {
|
|||||||
assert(e1 != UINT_MAX);
|
assert(e1 != UINT_MAX);
|
||||||
assert(u != UINT_MAX);
|
assert(u != UINT_MAX);
|
||||||
assert(v != UINT_MAX);
|
assert(v != UINT_MAX);
|
||||||
InsertEdgeBasedNode(e1, u, v);
|
//edges that end on bollard nodes may actually be in two distinct components
|
||||||
|
InsertEdgeBasedNode(e1, u, v, (std::min(vectorOfComponentSizes[componentsIndex[u]], vectorOfComponentSizes[componentsIndex[v]]) < 1000) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -240,6 +300,9 @@ void EdgeBasedGraphFactory::Run(const char * originalEdgeDataFilename) {
|
|||||||
assert(edgeData1.edgeBasedNodeID < _nodeBasedGraph->GetNumberOfEdges());
|
assert(edgeData1.edgeBasedNodeID < _nodeBasedGraph->GetNumberOfEdges());
|
||||||
assert(edgeData2.edgeBasedNodeID < _nodeBasedGraph->GetNumberOfEdges());
|
assert(edgeData2.edgeBasedNodeID < _nodeBasedGraph->GetNumberOfEdges());
|
||||||
|
|
||||||
|
if(!edgeData1.forward || !edgeData2.forward)
|
||||||
|
continue;
|
||||||
|
|
||||||
unsigned distance = edgeData1.distance;
|
unsigned distance = edgeData1.distance;
|
||||||
if(_trafficLights.find(v) != _trafficLights.end()) {
|
if(_trafficLights.find(v) != _trafficLights.end()) {
|
||||||
distance += trafficSignalPenalty;
|
distance += trafficSignalPenalty;
|
||||||
@ -252,6 +315,7 @@ void EdgeBasedGraphFactory::Run(const char * originalEdgeDataFilename) {
|
|||||||
turnInstruction |= TurnInstructions.AccessRestrictionFlag;
|
turnInstruction |= TurnInstructions.AccessRestrictionFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//distance += heightPenalty;
|
//distance += heightPenalty;
|
||||||
//distance += ComputeTurnPenalty(u, v, w);
|
//distance += ComputeTurnPenalty(u, v, w);
|
||||||
assert(edgeData1.edgeBasedNodeID != edgeData2.edgeBasedNodeID);
|
assert(edgeData1.edgeBasedNodeID != edgeData2.edgeBasedNodeID);
|
||||||
|
@ -85,7 +85,8 @@ public:
|
|||||||
int lat1;
|
int lat1;
|
||||||
int lat2;
|
int lat2;
|
||||||
int lon1;
|
int lon1;
|
||||||
int lon2;
|
int lon2:31;
|
||||||
|
bool belongsToTinyComponent;
|
||||||
NodeID nameID;
|
NodeID nameID;
|
||||||
unsigned weight:31;
|
unsigned weight:31;
|
||||||
bool ignoreInGrid:1;
|
bool ignoreInGrid:1;
|
||||||
@ -114,7 +115,8 @@ private:
|
|||||||
void InsertEdgeBasedNode(
|
void InsertEdgeBasedNode(
|
||||||
_NodeBasedDynamicGraph::EdgeIterator e1,
|
_NodeBasedDynamicGraph::EdgeIterator e1,
|
||||||
_NodeBasedDynamicGraph::NodeIterator u,
|
_NodeBasedDynamicGraph::NodeIterator u,
|
||||||
_NodeBasedDynamicGraph::NodeIterator v);
|
_NodeBasedDynamicGraph::NodeIterator v,
|
||||||
|
bool belongsToTinyComponent);
|
||||||
template<class CoordinateT>
|
template<class CoordinateT>
|
||||||
double GetAngleBetweenTwoEdges(const CoordinateT& A, const CoordinateT& C, const CoordinateT& B) const;
|
double GetAngleBetweenTwoEdges(const CoordinateT& A, const CoordinateT& C, const CoordinateT& B) const;
|
||||||
// SRTMLookup srtmLookup;
|
// SRTMLookup srtmLookup;
|
||||||
|
@ -22,13 +22,15 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#define GRIDEDGE_H_
|
#define GRIDEDGE_H_
|
||||||
|
|
||||||
struct _GridEdge {
|
struct _GridEdge {
|
||||||
_GridEdge(NodeID n, NodeID na, int w, _Coordinate sc, _Coordinate tc) : edgeBasedNode(n), nameID(na), weight(w), startCoord(sc), targetCoord(tc) {}
|
_GridEdge(NodeID n, NodeID na, int w, _Coordinate sc, _Coordinate tc, bool bttc) : edgeBasedNode(n), nameID(na), weight(w), startCoord(sc), targetCoord(tc), belongsToTinyComponent(bttc) {}
|
||||||
_GridEdge() : edgeBasedNode(UINT_MAX), nameID(UINT_MAX), weight(INT_MAX) {}
|
_GridEdge() : edgeBasedNode(UINT_MAX), nameID(UINT_MAX), weight(INT_MAX), belongsToTinyComponent(false) {}
|
||||||
NodeID edgeBasedNode;
|
NodeID edgeBasedNode;
|
||||||
NodeID nameID;
|
NodeID nameID;
|
||||||
int weight;
|
int weight;
|
||||||
_Coordinate startCoord;
|
_Coordinate startCoord;
|
||||||
_Coordinate targetCoord;
|
_Coordinate targetCoord;
|
||||||
|
bool belongsToTinyComponent;
|
||||||
|
|
||||||
bool operator< ( const _GridEdge& right) const {
|
bool operator< ( const _GridEdge& right) const {
|
||||||
return edgeBasedNode < right.edgeBasedNode;
|
return edgeBasedNode < right.edgeBasedNode;
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ public:
|
|||||||
int slon = edge.lon1;
|
int slon = edge.lon1;
|
||||||
int tlat = 100000*lat2y(edge.lat2/100000.);
|
int tlat = 100000*lat2y(edge.lat2/100000.);
|
||||||
int tlon = edge.lon2;
|
int tlon = edge.lon2;
|
||||||
AddEdge( _GridEdge( edge.id, edge.nameID, edge.weight, _Coordinate(slat, slon), _Coordinate(tlat, tlon) ) );
|
AddEdge( _GridEdge( edge.id, edge.nameID, edge.weight, _Coordinate(slat, slon), _Coordinate(tlat, tlon), edge.belongsToTinyComponent ) );
|
||||||
}
|
}
|
||||||
double timestamp = get_timestamp();
|
double timestamp = get_timestamp();
|
||||||
//create index file on disk, old one is over written
|
//create index file on disk, old one is over written
|
||||||
@ -148,7 +148,9 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FindPhantomNodeForCoordinate( const _Coordinate & location, PhantomNode & resultNode) {
|
bool FindPhantomNodeForCoordinate( const _Coordinate & location, PhantomNode & resultNode, const unsigned zoomLevel) {
|
||||||
|
bool ignoreTinyComponents = (zoomLevel <= 14);
|
||||||
|
// INFO("ZoomLevel: " << zoomLevel << ", ignoring tinyComponentents: " << (ignoreTinyComponents ? "yes" : "no"));
|
||||||
// double time1 = get_timestamp();
|
// double time1 = get_timestamp();
|
||||||
bool foundNode = false;
|
bool foundNode = false;
|
||||||
_Coordinate startCoord(100000*(lat2y(static_cast<double>(location.lat)/100000.)), location.lon);
|
_Coordinate startCoord(100000*(lat2y(static_cast<double>(location.lat)/100000.)), location.lon);
|
||||||
@ -166,10 +168,12 @@ public:
|
|||||||
double r, tmpDist;
|
double r, tmpDist;
|
||||||
|
|
||||||
BOOST_FOREACH(_GridEdge candidate, candidates) {
|
BOOST_FOREACH(_GridEdge candidate, candidates) {
|
||||||
|
if(candidate.belongsToTinyComponent && ignoreTinyComponents)
|
||||||
|
continue;
|
||||||
r = 0.;
|
r = 0.;
|
||||||
tmpDist = ComputeDistance(startCoord, candidate.startCoord, candidate.targetCoord, tmp, &r);
|
tmpDist = ComputeDistance(startCoord, candidate.startCoord, candidate.targetCoord, tmp, &r);
|
||||||
if(tmpDist < dist && !DoubleEpsilonCompare(dist, tmpDist)) {
|
if(tmpDist < dist && !DoubleEpsilonCompare(dist, tmpDist)) {
|
||||||
//INFO("a) " << candidate.edgeBasedNode << ", dist: " << tmpDist);
|
// INFO("a) " << candidate.edgeBasedNode << ", dist: " << tmpDist << ", tinyCC: " << (candidate.belongsToTinyComponent ? "yes" : "no"));
|
||||||
dist = tmpDist;
|
dist = tmpDist;
|
||||||
resultNode.edgeBasedNode = candidate.edgeBasedNode;
|
resultNode.edgeBasedNode = candidate.edgeBasedNode;
|
||||||
resultNode.nodeBasedEdgeNameID = candidate.nameID;
|
resultNode.nodeBasedEdgeNameID = candidate.nameID;
|
||||||
@ -212,41 +216,23 @@ public:
|
|||||||
}
|
}
|
||||||
resultNode.ratio = ratio;
|
resultNode.ratio = ratio;
|
||||||
// INFO("New weight1: " << resultNode.weight1 << ", new weight2: " << resultNode.weight2 << ", ratio: " << ratio);
|
// INFO("New weight1: " << resultNode.weight1 << ", new weight2: " << resultNode.weight2 << ", ratio: " << ratio);
|
||||||
// INFO("selected node: " << resultNode.edgeBasedNode << ", bidirected: " << (resultNode.isBidirected() ? "yes" : "no") << "\n--");
|
// INFO("selected node: " << resultNode.edgeBasedNode << ", bidirected: " << (resultNode.isBidirected() ? "yes" : "no") << "\n--");
|
||||||
// double time2 = get_timestamp();
|
// double time2 = get_timestamp();
|
||||||
// INFO("NN-Lookup in " << 1000*(time2-time1) << "ms");
|
// INFO("NN-Lookup in " << 1000*(time2-time1) << "ms");
|
||||||
return foundNode;
|
return foundNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FindRoutingStarts(const _Coordinate& start, const _Coordinate& target, PhantomNodes & routingStarts) {
|
bool FindRoutingStarts(const _Coordinate& start, const _Coordinate& target, PhantomNodes & routingStarts, unsigned zoomLevel) {
|
||||||
routingStarts.Reset();
|
routingStarts.Reset();
|
||||||
return (FindPhantomNodeForCoordinate( start, routingStarts.startPhantom) &&
|
return (FindPhantomNodeForCoordinate( start, routingStarts.startPhantom, zoomLevel) &&
|
||||||
FindPhantomNodeForCoordinate( target, routingStarts.targetPhantom) );
|
FindPhantomNodeForCoordinate( target, routingStarts.targetPhantom, zoomLevel) );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FindNearestCoordinateOnEdgeInNodeBasedGraph(const _Coordinate& inputCoordinate, _Coordinate& outputCoordinate) {
|
bool FindNearestCoordinateOnEdgeInNodeBasedGraph(const _Coordinate& inputCoordinate, _Coordinate& outputCoordinate, unsigned zoomLevel = 18) {
|
||||||
bool found = false;
|
PhantomNode resultNode;
|
||||||
unsigned fileIndex = GetFileIndexForLatLon(100000*(lat2y(static_cast<double>(inputCoordinate.lat)/100000.)), inputCoordinate.lon);
|
bool foundNode = FindPhantomNodeForCoordinate(inputCoordinate, resultNode, zoomLevel);
|
||||||
std::vector<_GridEdge> candidates;
|
outputCoordinate = resultNode.location;
|
||||||
boost::unordered_map< unsigned, unsigned > cellMap;
|
return foundNode;
|
||||||
for(int j = -32768; j < (32768+1); j+=32768) {
|
|
||||||
for(int i = -1; i < 2; ++i) {
|
|
||||||
GetContentsOfFileBucket(fileIndex+i+j, candidates, cellMap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_Coordinate tmp;
|
|
||||||
double dist = (std::numeric_limits<double>::max)();
|
|
||||||
BOOST_FOREACH(_GridEdge candidate, candidates) {
|
|
||||||
double r = 0.;
|
|
||||||
double tmpDist = ComputeDistance(inputCoordinate, candidate.startCoord, candidate.targetCoord, tmp, &r);
|
|
||||||
if(tmpDist < dist) {
|
|
||||||
found = true;
|
|
||||||
dist = tmpDist;
|
|
||||||
outputCoordinate = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
outputCoordinate.lat = 100000*(y2lat(static_cast<double>(outputCoordinate.lat)/100000.));
|
|
||||||
return found;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FindNearestPointOnEdge(const _Coordinate& inputCoordinate, _Coordinate& outputCoordinate) {
|
void FindNearestPointOnEdge(const _Coordinate& inputCoordinate, _Coordinate& outputCoordinate) {
|
||||||
|
@ -53,7 +53,6 @@ public:
|
|||||||
coordinateVector.push_back(_Coordinate(b.lat, b.lon));
|
coordinateVector.push_back(_Coordinate(b.lat, b.lon));
|
||||||
}
|
}
|
||||||
std::vector<_Coordinate>(coordinateVector).swap(coordinateVector);
|
std::vector<_Coordinate>(coordinateVector).swap(coordinateVector);
|
||||||
numberOfNodes = coordinateVector.size();
|
|
||||||
nodesInstream.close();
|
nodesInstream.close();
|
||||||
|
|
||||||
DEBUG("Loading edge data");
|
DEBUG("Loading edge data");
|
||||||
@ -95,12 +94,13 @@ public:
|
|||||||
inline bool FindNearestNodeCoordForLatLon(const _Coordinate& coord, _Coordinate& result) const {
|
inline bool FindNearestNodeCoordForLatLon(const _Coordinate& coord, _Coordinate& result) const {
|
||||||
return readOnlyGrid->FindNearestCoordinateOnEdgeInNodeBasedGraph(coord, result);
|
return readOnlyGrid->FindNearestCoordinateOnEdgeInNodeBasedGraph(coord, result);
|
||||||
}
|
}
|
||||||
inline bool FindPhantomNodeForCoordinate( const _Coordinate & location, PhantomNode & resultNode) const {
|
|
||||||
return readOnlyGrid->FindPhantomNodeForCoordinate(location, resultNode);
|
inline bool FindPhantomNodeForCoordinate( const _Coordinate & location, PhantomNode & resultNode, const unsigned zoomLevel) const {
|
||||||
|
return readOnlyGrid->FindPhantomNodeForCoordinate(location, resultNode, zoomLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void FindRoutingStarts(const _Coordinate &start, const _Coordinate &target, PhantomNodes & phantomNodes) const {
|
inline void FindRoutingStarts(const _Coordinate &start, const _Coordinate &target, PhantomNodes & phantomNodes, const unsigned zoomLevel) const {
|
||||||
readOnlyGrid->FindRoutingStarts(start, target, phantomNodes);
|
readOnlyGrid->FindRoutingStarts(start, target, phantomNodes, zoomLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void FindNearestPointOnEdge(const _Coordinate & input, _Coordinate& output){
|
inline void FindNearestPointOnEdge(const _Coordinate & input, _Coordinate& output){
|
||||||
@ -116,8 +116,8 @@ private:
|
|||||||
std::vector<OriginalEdgeData> origEdgeData;
|
std::vector<OriginalEdgeData> origEdgeData;
|
||||||
|
|
||||||
ReadOnlyGrid * readOnlyGrid;
|
ReadOnlyGrid * readOnlyGrid;
|
||||||
unsigned numberOfNodes;
|
const unsigned numberOfNodes;
|
||||||
unsigned checkSum;
|
const unsigned checkSum;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*NODEINFORMATIONHELPDESK_H_*/
|
#endif /*NODEINFORMATIONHELPDESK_H_*/
|
||||||
|
@ -129,8 +129,8 @@ public:
|
|||||||
_queryData.nodeHelpDesk->FindRoutingStarts(start, target, routingStarts);
|
_queryData.nodeHelpDesk->FindRoutingStarts(start, target, routingStarts);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void FindPhantomNodeForCoordinate(const _Coordinate & location, PhantomNode & result) const {
|
inline void FindPhantomNodeForCoordinate(const _Coordinate & location, PhantomNode & result, unsigned zoomLevel) const {
|
||||||
_queryData.nodeHelpDesk->FindPhantomNodeForCoordinate(location, result);
|
_queryData.nodeHelpDesk->FindPhantomNodeForCoordinate(location, result, zoomLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline NodeID GetNameIDForOriginDestinationNodeID(const NodeID s, const NodeID t) const {
|
inline NodeID GetNameIDForOriginDestinationNodeID(const NodeID s, const NodeID t) const {
|
||||||
|
@ -65,9 +65,17 @@ public:
|
|||||||
reply = http::Reply::stockReply(http::Reply::badRequest);
|
reply = http::Reply::stockReply(http::Reply::badRequest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned zoomLevel = 18;
|
||||||
|
if(routeParameters.options.Find("z") != ""){
|
||||||
|
zoomLevel = atoi(routeParameters.options.Find("z").c_str());
|
||||||
|
if(18 < zoomLevel)
|
||||||
|
zoomLevel = 18;
|
||||||
|
}
|
||||||
|
|
||||||
//query to helpdesk
|
//query to helpdesk
|
||||||
PhantomNode result;
|
PhantomNode result;
|
||||||
nodeHelpDesk->FindPhantomNodeForCoordinate(myCoordinate, result);
|
nodeHelpDesk->FindPhantomNodeForCoordinate(myCoordinate, result, zoomLevel);
|
||||||
|
|
||||||
std::string tmp;
|
std::string tmp;
|
||||||
std::string JSONParameter;
|
std::string JSONParameter;
|
||||||
|
@ -79,6 +79,13 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned zoomLevel = 18;
|
||||||
|
if(routeParameters.options.Find("z") != ""){
|
||||||
|
zoomLevel = atoi(routeParameters.options.Find("z").c_str());
|
||||||
|
if(18 < zoomLevel)
|
||||||
|
zoomLevel = 18;
|
||||||
|
}
|
||||||
|
|
||||||
RawRouteData rawRoute;
|
RawRouteData rawRoute;
|
||||||
rawRoute.checkSum = nodeHelpDesk->GetCheckSum();
|
rawRoute.checkSum = nodeHelpDesk->GetCheckSum();
|
||||||
bool checksumOK = ((unsigned)atoi(routeParameters.options.Find("checksum").c_str()) == rawRoute.checkSum);
|
bool checksumOK = ((unsigned)atoi(routeParameters.options.Find("checksum").c_str()) == rawRoute.checkSum);
|
||||||
@ -110,7 +117,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// INFO("Brute force lookup of coordinate " << i);
|
// INFO("Brute force lookup of coordinate " << i);
|
||||||
searchEngine->FindPhantomNodeForCoordinate( rawRoute.rawViaNodeCoordinates[i], phantomNodeVector[i]);
|
searchEngine->FindPhantomNodeForCoordinate( rawRoute.rawViaNodeCoordinates[i], phantomNodeVector[i], zoomLevel);
|
||||||
}
|
}
|
||||||
//unsigned distance = 0;
|
//unsigned distance = 0;
|
||||||
|
|
||||||
@ -159,13 +166,7 @@ public:
|
|||||||
|
|
||||||
_DescriptorConfig descriptorConfig;
|
_DescriptorConfig descriptorConfig;
|
||||||
unsigned descriptorType = descriptorTable[routeParameters.options.Find("output")];
|
unsigned descriptorType = descriptorTable[routeParameters.options.Find("output")];
|
||||||
unsigned short zoom = 18;
|
descriptorConfig.z = zoomLevel;
|
||||||
if(routeParameters.options.Find("z") != ""){
|
|
||||||
zoom = atoi(routeParameters.options.Find("z").c_str());
|
|
||||||
if(18 < zoom)
|
|
||||||
zoom = 18;
|
|
||||||
}
|
|
||||||
descriptorConfig.z = zoom;
|
|
||||||
if(routeParameters.options.Find("instructions") == "false") {
|
if(routeParameters.options.Find("instructions") == "false") {
|
||||||
descriptorConfig.instructions = false;
|
descriptorConfig.instructions = false;
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ typedef boost::unordered_map<NodeID, NodeID> ExternalNodeMap;
|
|||||||
|
|
||||||
template<class EdgeT>
|
template<class EdgeT>
|
||||||
struct _ExcessRemover {
|
struct _ExcessRemover {
|
||||||
bool operator()( EdgeT & edge ) const {
|
inline bool operator()( EdgeT & edge ) const {
|
||||||
return edge.source() == UINT_MAX;
|
return edge.source() == UINT_MAX;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -155,9 +155,31 @@ NodeID readBinaryOSRMGraphFromStream(std::istream &in, std::vector<EdgeT>& edgeL
|
|||||||
std::sort(edgeList.begin(), edgeList.end());
|
std::sort(edgeList.begin(), edgeList.end());
|
||||||
for(unsigned i = 1; i < edgeList.size(); ++i) {
|
for(unsigned i = 1; i < edgeList.size(); ++i) {
|
||||||
if( (edgeList[i-1].target() == edgeList[i].target()) && (edgeList[i-1].source() == edgeList[i].source()) ) {
|
if( (edgeList[i-1].target() == edgeList[i].target()) && (edgeList[i-1].source() == edgeList[i].source()) ) {
|
||||||
if( (edgeList[i-1].isForward() == edgeList[i].isForward()) && (edgeList[i-1].isBackward() == edgeList[i].isBackward()) ) {
|
bool edgeFlagsAreEquivalent = (edgeList[i-1].isForward() == edgeList[i].isForward()) && (edgeList[i-1].isBackward() == edgeList[i].isBackward());
|
||||||
|
bool edgeFlagsAreSuperSet1 = (edgeList[i-1].isForward() && edgeList[i-1].isBackward()) && (edgeList[i].isBackward() != edgeList[i].isBackward() );
|
||||||
|
bool edgeFlagsAreSuperSet2 = (edgeList[i].isForward() && edgeList[i].isBackward()) && (edgeList[i-1].isBackward() != edgeList[i-1].isBackward() );
|
||||||
|
|
||||||
|
if( edgeFlagsAreEquivalent ) {
|
||||||
edgeList[i]._weight = std::min(edgeList[i-1].weight(), edgeList[i].weight());
|
edgeList[i]._weight = std::min(edgeList[i-1].weight(), edgeList[i].weight());
|
||||||
edgeList[i-1]._source = UINT_MAX;
|
edgeList[i-1]._source = UINT_MAX;
|
||||||
|
} else if (edgeFlagsAreSuperSet1) {
|
||||||
|
if(edgeList[i-1].weight() <= edgeList[i].weight()) {
|
||||||
|
//edge i-1 is smaller and goes in both directions. Throw away the other edge
|
||||||
|
edgeList[i]._source = UINT_MAX;
|
||||||
|
} else {
|
||||||
|
//edge i-1 is open in both directions, but edge i is smaller in one direction. Close edge i-1 in this direction
|
||||||
|
edgeList[i-1].forward = ~edgeList[i].isForward();
|
||||||
|
edgeList[i-1].backward = ~edgeList[i].isBackward();
|
||||||
|
}
|
||||||
|
} else if (edgeFlagsAreSuperSet2) {
|
||||||
|
if(edgeList[i-1].weight() <= edgeList[i].weight()) {
|
||||||
|
//edge i-1 is smaller for one direction. edge i is open in both. close edge i in the other direction
|
||||||
|
edgeList[i].forward = ~edgeList[i-1].isForward();
|
||||||
|
edgeList[i].backward = ~edgeList[i-1].isBackward();
|
||||||
|
} else {
|
||||||
|
//edge i is smaller and goes in both direction. Throw away edge i-1
|
||||||
|
edgeList[i-1]._source = UINT_MAX;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user