Every node in route carries a bit that indicates if its possible at all to take a turn
This commit is contained in:
parent
e91058c2eb
commit
3b885a492c
@ -34,6 +34,12 @@ struct _HeapData {
|
|||||||
_HeapData( NodeID p ) : parent(p), stalled(false) { }
|
_HeapData( NodeID p ) : parent(p), stalled(false) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _PathData {
|
||||||
|
_PathData(NodeID n, bool t) : node(n), turn(t) { }
|
||||||
|
NodeID node:31;
|
||||||
|
bool turn:1;
|
||||||
|
};
|
||||||
|
|
||||||
typedef BinaryHeap< NodeID, int, int, _HeapData, DenseStorage< NodeID, unsigned > > _Heap;
|
typedef BinaryHeap< NodeID, int, int, _HeapData, DenseStorage< NodeID, unsigned > > _Heap;
|
||||||
|
|
||||||
template<typename EdgeData, typename GraphT, typename NodeHelperT = NodeInformationHelpDesk>
|
template<typename EdgeData, typename GraphT, typename NodeHelperT = NodeInformationHelpDesk>
|
||||||
@ -57,7 +63,7 @@ public:
|
|||||||
return nodeHelpDesk->getNumberOfNodes();
|
return nodeHelpDesk->getNumberOfNodes();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<NodeID > * path, _Coordinate& startCoord, _Coordinate& targetCoord)
|
unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<_PathData > * path, _Coordinate& startCoord, _Coordinate& targetCoord)
|
||||||
{
|
{
|
||||||
bool onSameEdge = false;
|
bool onSameEdge = false;
|
||||||
bool onSameEdgeReversed = false;
|
bool onSameEdgeReversed = false;
|
||||||
@ -192,7 +198,8 @@ public:
|
|||||||
packedPath.push_back( pathNode );
|
packedPath.push_back( pathNode );
|
||||||
}
|
}
|
||||||
|
|
||||||
path->push_back(packedPath[0] );
|
|
||||||
|
path->push_back( _PathData(packedPath[0], false) );
|
||||||
{
|
{
|
||||||
for(deque<NodeID>::size_type i = 0; i < packedPath.size()-1; i++)
|
for(deque<NodeID>::size_type i = 0; i < packedPath.size()-1; i++)
|
||||||
{
|
{
|
||||||
@ -307,9 +314,10 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _UnpackEdge( const NodeID source, const NodeID target, std::vector< NodeID >* path ) {
|
bool _UnpackEdge( const NodeID source, const NodeID target, std::vector< _PathData >* path ) {
|
||||||
assert(source != target);
|
assert(source != target);
|
||||||
//find edge first.
|
//find edge first.
|
||||||
|
bool forward = true;
|
||||||
typename GraphT::EdgeIterator smallestEdge = SPECIAL_EDGEID;
|
typename GraphT::EdgeIterator smallestEdge = SPECIAL_EDGEID;
|
||||||
EdgeWeight smallestWeight = UINT_MAX;
|
EdgeWeight smallestWeight = UINT_MAX;
|
||||||
for(typename GraphT::EdgeIterator eit = _graph->BeginEdges(source); eit < _graph->EndEdges(source); eit++)
|
for(typename GraphT::EdgeIterator eit = _graph->BeginEdges(source); eit < _graph->EndEdges(source); eit++)
|
||||||
@ -331,6 +339,7 @@ private:
|
|||||||
if(_graph->GetTarget(eit) == source && weight < smallestWeight && _graph->GetEdgeData(eit).backward)
|
if(_graph->GetTarget(eit) == source && weight < smallestWeight && _graph->GetEdgeData(eit).backward)
|
||||||
{
|
{
|
||||||
smallestEdge = eit; smallestWeight = weight;
|
smallestEdge = eit; smallestWeight = weight;
|
||||||
|
forward = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -347,7 +356,7 @@ private:
|
|||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
assert(!ed.shortcut);
|
assert(!ed.shortcut);
|
||||||
path->push_back(target);
|
path->push_back(_PathData(target, (forward ? ed.forwardTurn : ed.backwardTurn) ) );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ public:
|
|||||||
_Coordinate startCoord(lat1, lon1);
|
_Coordinate startCoord(lat1, lon1);
|
||||||
_Coordinate targetCoord(lat2, lon2);
|
_Coordinate targetCoord(lat2, lon2);
|
||||||
|
|
||||||
vector<NodeID > * path = new vector<NodeID >();
|
vector< _PathData > * path = new vector< _PathData >();
|
||||||
PhantomNodes * phantomNodes = new PhantomNodes();
|
PhantomNodes * phantomNodes = new PhantomNodes();
|
||||||
sEngine->FindRoutingStarts(startCoord, targetCoord, phantomNodes);
|
sEngine->FindRoutingStarts(startCoord, targetCoord, phantomNodes);
|
||||||
unsigned int distance = sEngine->ComputeRoute(phantomNodes, path, startCoord, targetCoord);
|
unsigned int distance = sEngine->ComputeRoute(phantomNodes, path, startCoord, targetCoord);
|
||||||
@ -118,7 +118,7 @@ public:
|
|||||||
|
|
||||||
if(distance != std::numeric_limits<unsigned int>::max())
|
if(distance != std::numeric_limits<unsigned int>::max())
|
||||||
computeDescription(tmp, path, phantomNodes);
|
computeDescription(tmp, path, phantomNodes);
|
||||||
|
// cout << tmp << endl;
|
||||||
// rep.content += tmp;
|
// rep.content += tmp;
|
||||||
rep.content += ("<Placemark>");
|
rep.content += ("<Placemark>");
|
||||||
rep.content += ("<name>OSM Routing Engine (c) Dennis Luxen and others </name>");
|
rep.content += ("<name>OSM Routing Engine (c) Dennis Luxen and others </name>");
|
||||||
@ -152,9 +152,9 @@ public:
|
|||||||
rep.content += tmp;
|
rep.content += tmp;
|
||||||
rep.content += (" ");
|
rep.content += (" ");
|
||||||
_Coordinate result;
|
_Coordinate result;
|
||||||
for(vector<NodeID >::iterator it = path->begin(); it != path->end(); it++)
|
for(vector< _PathData >::iterator it = path->begin(); it != path->end(); it++)
|
||||||
{
|
{
|
||||||
sEngine->getNodeInfo(*it, result);
|
sEngine->getNodeInfo(it->node, result);
|
||||||
convertLatLon(result.lon, tmp);
|
convertLatLon(result.lon, tmp);
|
||||||
rep.content += tmp;
|
rep.content += tmp;
|
||||||
rep.content += (",");
|
rep.content += (",");
|
||||||
@ -263,7 +263,7 @@ private:
|
|||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeDescription(string &tmp, vector<NodeID> * path, PhantomNodes * phantomNodes)
|
void computeDescription(string &tmp, vector< _PathData > * path, PhantomNodes * phantomNodes)
|
||||||
{
|
{
|
||||||
_Coordinate previous(phantomNodes->startCoord.lat, phantomNodes->startCoord.lon);
|
_Coordinate previous(phantomNodes->startCoord.lat, phantomNodes->startCoord.lon);
|
||||||
_Coordinate next, current, lastPlace;
|
_Coordinate next, current, lastPlace;
|
||||||
@ -277,18 +277,18 @@ private:
|
|||||||
lastPlace.lon = phantomNodes->startCoord.lon;
|
lastPlace.lon = phantomNodes->startCoord.lon;
|
||||||
short nextType = SHRT_MAX;
|
short nextType = SHRT_MAX;
|
||||||
short prevType = SHRT_MAX;
|
short prevType = SHRT_MAX;
|
||||||
tmp += "<Placemark><Name>";
|
tmp += "<Placemark>\n <Name>";
|
||||||
for(vector<NodeID >::iterator it = path->begin(); it != path->end(); it++)
|
for(vector< _PathData >::iterator it = path->begin(); it != path->end(); it++)
|
||||||
{
|
{
|
||||||
sEngine->getNodeInfo(*it, current);
|
sEngine->getNodeInfo(it->node, current);
|
||||||
if(it==path->end()-1){
|
if(it==path->end()-1){
|
||||||
next = _Coordinate(phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon);
|
next = _Coordinate(phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon);
|
||||||
nextID = sEngine->GetNameIDForOriginDestinationNodeID(phantomNodes->targetNode1, phantomNodes->targetNode2);
|
nextID = sEngine->GetNameIDForOriginDestinationNodeID(phantomNodes->targetNode1, phantomNodes->targetNode2);
|
||||||
nextType = sEngine->GetTypeOfEdgeForOriginDestinationNodeID(phantomNodes->targetNode1, phantomNodes->targetNode2);
|
nextType = sEngine->GetTypeOfEdgeForOriginDestinationNodeID(phantomNodes->targetNode1, phantomNodes->targetNode2);
|
||||||
} else {
|
} else {
|
||||||
sEngine->getNodeInfo(*(it+1), next);
|
sEngine->getNodeInfo((it+1)->node, next);
|
||||||
nextID = sEngine->GetNameIDForOriginDestinationNodeID(*it, *(it+1));
|
nextID = sEngine->GetNameIDForOriginDestinationNodeID(it->node, (it+1)->node);
|
||||||
nextType = sEngine->GetTypeOfEdgeForOriginDestinationNodeID(*it, *(it+1));
|
nextType = sEngine->GetTypeOfEdgeForOriginDestinationNodeID(it->node, (it+1)->node);
|
||||||
}
|
}
|
||||||
if(nextID == nameID) {
|
if(nextID == nameID) {
|
||||||
tempDist += ApproximateDistance(previous.lat, previous.lon, current.lat, current.lon);
|
tempDist += ApproximateDistance(previous.lat, previous.lon, current.lat, current.lon);
|
||||||
@ -299,13 +299,20 @@ private:
|
|||||||
tmp += "leave motorway and ";
|
tmp += "leave motorway and ";
|
||||||
|
|
||||||
double angle = GetAngleBetweenTwoEdges(previous, current, next);
|
double angle = GetAngleBetweenTwoEdges(previous, current, next);
|
||||||
|
if(it->turn)
|
||||||
|
tmp += " turn! ";
|
||||||
tmp += "follow road ";
|
tmp += "follow road ";
|
||||||
|
if(nameID != 0)
|
||||||
tmp += sEngine->GetNameForNameID(nameID);
|
tmp += sEngine->GetNameForNameID(nameID);
|
||||||
tmp += " (type: ";
|
tmp += " (type: ";
|
||||||
numberString << type;
|
numberString << type;
|
||||||
tmp += numberString.str();
|
tmp += numberString.str();
|
||||||
numberString.str("");
|
numberString.str("");
|
||||||
tmp += ")</Name><Description>drive for ";
|
tmp += ", id: ";
|
||||||
|
numberString << nameID;
|
||||||
|
tmp += numberString.str();
|
||||||
|
numberString.str("");
|
||||||
|
tmp += ")</Name>\n <Description>drive for ";
|
||||||
numberString << ApproximateDistance(previous.lat, previous.lon, current.lat, current.lon)+tempDist;
|
numberString << ApproximateDistance(previous.lat, previous.lon, current.lat, current.lon)+tempDist;
|
||||||
tmp += numberString.str();
|
tmp += numberString.str();
|
||||||
numberString.str("");
|
numberString.str("");
|
||||||
@ -314,13 +321,17 @@ private:
|
|||||||
convertLatLon(lastPlace.lon, lon);
|
convertLatLon(lastPlace.lon, lon);
|
||||||
convertLatLon(lastPlace.lat, lat);
|
convertLatLon(lastPlace.lat, lat);
|
||||||
lastPlace = current;
|
lastPlace = current;
|
||||||
tmp += "<Point><Coordinates>";
|
tmp += "\n <Point><Coordinates>";
|
||||||
tmp += lon;
|
tmp += lon;
|
||||||
tmp += ",";
|
tmp += ",";
|
||||||
tmp += lat;
|
tmp += lat;
|
||||||
tmp += "</Coordinates></Point>";
|
tmp += "</Coordinates></Point>";
|
||||||
tmp += "</Placemark>";
|
tmp += "\n</Placemark>\n";
|
||||||
tmp += "<Placemark><Name>";
|
tmp += "<Placemark>\n <Name> (";
|
||||||
|
numberString << angle;
|
||||||
|
tmp += numberString.str();
|
||||||
|
numberString.str("");
|
||||||
|
tmp +=") ";
|
||||||
if(angle > 160 && angle < 200) {
|
if(angle > 160 && angle < 200) {
|
||||||
tmp += /* " (" << angle << ")*/"drive ahead, ";
|
tmp += /* " (" << angle << ")*/"drive ahead, ";
|
||||||
} else if (angle > 290 && angle <= 360) {
|
} else if (angle > 290 && angle <= 360) {
|
||||||
@ -351,11 +362,11 @@ private:
|
|||||||
numberString << type;
|
numberString << type;
|
||||||
tmp += numberString.str();
|
tmp += numberString.str();
|
||||||
numberString.str("");
|
numberString.str("");
|
||||||
tmp += ")</name><Description> drive for ";
|
tmp += ")</name>\n <Description> drive for ";
|
||||||
numberString << (previous.lat, previous.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon) + tempDist;
|
numberString << (previous.lat, previous.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon) + tempDist;
|
||||||
tmp += numberString.str();
|
tmp += numberString.str();
|
||||||
numberString.str("");
|
numberString.str("");
|
||||||
tmp += "m</Description>";
|
tmp += "m</Description>\n ";
|
||||||
string lat; string lon;
|
string lat; string lon;
|
||||||
convertLatLon(lastPlace.lon, lon);
|
convertLatLon(lastPlace.lon, lon);
|
||||||
convertLatLon(lastPlace.lat, lat);
|
convertLatLon(lastPlace.lat, lat);
|
||||||
@ -364,16 +375,16 @@ private:
|
|||||||
tmp += ",";
|
tmp += ",";
|
||||||
tmp += lat;
|
tmp += lat;
|
||||||
tmp += "</Coordinates></Point>";
|
tmp += "</Coordinates></Point>";
|
||||||
tmp += "</Placemark>";
|
tmp += "</Placemark>\n";
|
||||||
tmp += "<Placemark><Name>you have reached your destination</Name>";
|
tmp += "<Placemark>\n <Name>you have reached your destination</Name>\n ";
|
||||||
tmp += "<Description>End of Route</Description>";
|
tmp += "<Description>End of Route</Description>";
|
||||||
convertLatLon(phantomNodes->targetCoord.lon, lon);
|
convertLatLon(phantomNodes->targetCoord.lon, lon);
|
||||||
convertLatLon(phantomNodes->targetCoord.lat, lat);
|
convertLatLon(phantomNodes->targetCoord.lat, lat);
|
||||||
tmp += "<Point><Coordinates>";
|
tmp += "\n <Point><Coordinates>";
|
||||||
tmp += lon;
|
tmp += lon;
|
||||||
tmp += ",";
|
tmp += ",";
|
||||||
tmp += lat;
|
tmp += lat;
|
||||||
tmp +="</Coordinates></Point>";
|
tmp +="</Coordinates></Point>\n";
|
||||||
tmp += "</Placemark>";
|
tmp += "</Placemark>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user