Support for backward speed in extractor
This commit is contained in:
		
							parent
							
								
									a64420d700
								
							
						
					
					
						commit
						7f69857376
					
				| @ -64,42 +64,71 @@ bool ExtractorCallbacks::restrictionFunction(_RawRestrictionContainer &r) { | ||||
| } | ||||
| 
 | ||||
| /** warning: caller needs to take care of synchronization! */ | ||||
| bool ExtractorCallbacks::wayFunction(_Way &w) { | ||||
|     /*** Store name of way and split it into edge segments ***/ | ||||
| 
 | ||||
|     if ( w.speed > 0 ) { //Only true if the way is specified by the speed profile
 | ||||
| 
 | ||||
| bool ExtractorCallbacks::wayFunction(_Way &parsed_way) { | ||||
| 	if ( parsed_way.speed > 0 ) { //Only true if the way is specified by the speed profile
 | ||||
| 		if(parsed_way.id == UINT_MAX){ | ||||
| 			WARN("found bogus way with id: " << parsed_way.id << " of size " << parsed_way.path.size()); | ||||
| 			return true; | ||||
| 		} | ||||
| 		//Get the unique identifier for the street name
 | ||||
|         const StringMap::const_iterator strit = stringMap->find(w.name); | ||||
|         if(strit == stringMap->end()) { | ||||
|             w.nameID = externalMemory->nameVector.size(); | ||||
|             externalMemory->nameVector.push_back(w.name); | ||||
|             stringMap->insert(StringMap::value_type(w.name, w.nameID)); | ||||
| 		const StringMap::const_iterator string_map_iterator = stringMap->find(parsed_way.name); | ||||
| 		if(string_map_iterator == stringMap->end()) { | ||||
| 			parsed_way.nameID = externalMemory->nameVector.size(); | ||||
| 			externalMemory->nameVector.push_back(parsed_way.name); | ||||
| 			stringMap->insert(StringMap::value_type(parsed_way.name, parsed_way.nameID)); | ||||
| 		} else { | ||||
|             w.nameID = strit->second; | ||||
| 			parsed_way.nameID = string_map_iterator->second; | ||||
| 		} | ||||
| 
 | ||||
|         if(fabs(-1. - w.speed) < FLT_EPSILON){ | ||||
|             WARN("found way with bogus speed, id: " << w.id); | ||||
|             return true; | ||||
|         } | ||||
|         if(w.id == UINT_MAX) { | ||||
|             WARN("found way with unknown type: " << w.id); | ||||
|             return true; | ||||
| 		if ( parsed_way.direction == _Way::opposite ){ | ||||
| 			std::reverse( parsed_way.path.begin(), parsed_way.path.end() ); | ||||
| 		} | ||||
| 
 | ||||
|         if ( w.direction == _Way::opposite ){ | ||||
|             std::reverse( w.path.begin(), w.path.end() ); | ||||
| 		if( parsed_way.backward_speed > 0 && parsed_way.direction == _Way::bidirectional) { | ||||
| 			parsed_way.direction == _Way::oneway; | ||||
| 		} | ||||
| 
 | ||||
|         for(std::vector< NodeID >::size_type n = 0; n < w.path.size()-1; ++n) { | ||||
|             externalMemory->allEdges.push_back(_Edge(w.path[n], w.path[n+1], w.type, w.direction, w.speed, w.nameID, w.roundabout, w.ignoreInGrid, w.isDurationSet, w.isAccessRestricted)); | ||||
|             externalMemory->usedNodeIDs.push_back(w.path[n]); | ||||
| 		for(std::vector< NodeID >::size_type n = 0; n < parsed_way.path.size()-1; ++n) { | ||||
| 			externalMemory->allEdges.push_back( | ||||
| 					_Edge(parsed_way.path[n], | ||||
| 							parsed_way.path[n+1], | ||||
| 							parsed_way.type, | ||||
| 							(_Way::bidirectional == parsed_way.direction && parsed_way.backward_speed > 0 ? _Way::oneway : parsed_way.direction), | ||||
| 							parsed_way.speed, | ||||
| 							parsed_way.nameID, | ||||
| 							parsed_way.roundabout, | ||||
| 							parsed_way.ignoreInGrid, | ||||
| 							parsed_way.isDurationSet, | ||||
| 							parsed_way.isAccessRestricted | ||||
| 						) | ||||
| 					); | ||||
| 			externalMemory->usedNodeIDs.push_back(parsed_way.path[n]); | ||||
| 		} | ||||
|         externalMemory->usedNodeIDs.push_back(w.path.back()); | ||||
| 		externalMemory->usedNodeIDs.push_back(parsed_way.path.back()); | ||||
| 
 | ||||
| 		//The following information is needed to identify start and end segments of restrictions
 | ||||
|         externalMemory->wayStartEndVector.push_back(_WayIDStartAndEndEdge(w.id, w.path[0], w.path[1], w.path[w.path.size()-2], w.path[w.path.size()-1])); | ||||
| 		externalMemory->wayStartEndVector.push_back(_WayIDStartAndEndEdge(parsed_way.id, parsed_way.path[0], parsed_way.path[1], parsed_way.path[parsed_way.path.size()-2], parsed_way.path.back())); | ||||
| 
 | ||||
| 		if ( parsed_way.backward_speed > 0 ) { //Only true if the way should be split
 | ||||
| 			std::reverse( parsed_way.path.begin(), parsed_way.path.end() ); | ||||
| 			for(std::vector< NodeID >::size_type n = 0; n < parsed_way.path.size()-1; ++n) { | ||||
| 				externalMemory->allEdges.push_back( | ||||
| 						_Edge(parsed_way.path[n], | ||||
| 								parsed_way.path[n+1], | ||||
| 								parsed_way.type, | ||||
| 								_Way::oneway, | ||||
| 								parsed_way.backward_speed, | ||||
| 								parsed_way.nameID, | ||||
| 								parsed_way.roundabout, | ||||
| 								parsed_way.ignoreInGrid, | ||||
| 								parsed_way.isDurationSet, | ||||
| 								parsed_way.isAccessRestricted, | ||||
| 								(_Way::oneway == parsed_way.direction) | ||||
| 							) | ||||
| 						); | ||||
| 			} | ||||
| 			externalMemory->wayStartEndVector.push_back(_WayIDStartAndEndEdge(parsed_way.id, parsed_way.path[0], parsed_way.path[1], parsed_way.path[parsed_way.path.size()-2], parsed_way.path.back())); | ||||
| 		} | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| @ -52,6 +52,7 @@ struct _Way { | ||||
| 		keyVals.EraseAll(); | ||||
|         direction = _Way::notSure; | ||||
|         speed = -1; | ||||
|         backward_speed = -1; | ||||
|         type = -1; | ||||
|         access = true; | ||||
|         roundabout = false; | ||||
| @ -67,6 +68,7 @@ struct _Way { | ||||
|     unsigned nameID; | ||||
|     std::string name; | ||||
|     double speed; | ||||
|     double backward_speed; | ||||
|     short type; | ||||
|     bool access; | ||||
|     bool roundabout; | ||||
| @ -86,10 +88,13 @@ struct _Relation { | ||||
| }; | ||||
| 
 | ||||
| struct _Edge { | ||||
|     _Edge() : start(0), target(0), type(0), direction(0), speed(0), nameID(0), isRoundabout(false), ignoreInGrid(false), isDurationSet(false), isAccessRestricted(false) {}; | ||||
|     _Edge(NodeID s, NodeID t) : start(s), target(t), type(0), direction(0), speed(0), nameID(0), isRoundabout(false), ignoreInGrid(false), isDurationSet(false), isAccessRestricted(false) { } | ||||
|     _Edge(NodeID s, NodeID t, short tp, short d, double sp): start(s), target(t), type(tp), direction(d), speed(sp), nameID(0), isRoundabout(false), ignoreInGrid(false), isDurationSet(false), isAccessRestricted(false) { } | ||||
|     _Edge(NodeID s, NodeID t, short tp, short d, double sp, unsigned nid, bool isra, bool iing, bool ids, bool iar): start(s), target(t), type(tp), direction(d), speed(sp), nameID(nid), isRoundabout(isra), ignoreInGrid(iing), isDurationSet(ids), isAccessRestricted(iar) { | ||||
|     _Edge() : start(0), target(0), type(0), direction(0), speed(0), nameID(0), isRoundabout(false), ignoreInGrid(false), isDurationSet(false), isAccessRestricted(false), isContraFlow(false) {}; | ||||
|     _Edge(NodeID s, NodeID t) : start(s), target(t), type(0), direction(0), speed(0), nameID(0), isRoundabout(false), ignoreInGrid(false), isDurationSet(false), isAccessRestricted(false), isContraFlow(false) { } | ||||
|     _Edge(NodeID s, NodeID t, short tp, short d, double sp): start(s), target(t), type(tp), direction(d), speed(sp), nameID(0), isRoundabout(false), ignoreInGrid(false), isDurationSet(false), isAccessRestricted(false), isContraFlow(false) { } | ||||
|     _Edge(NodeID s, NodeID t, short tp, short d, double sp, unsigned nid, bool isra, bool iing, bool ids, bool iar): start(s), target(t), type(tp), direction(d), speed(sp), nameID(nid), isRoundabout(isra), ignoreInGrid(iing), isDurationSet(ids), isAccessRestricted(iar), isContraFlow(false) { | ||||
|         assert(0 <= type); | ||||
|     } | ||||
|     _Edge(NodeID s, NodeID t, short tp, short d, double sp, unsigned nid, bool isra, bool iing, bool ids, bool iar, bool icf): start(s), target(t), type(tp), direction(d), speed(sp), nameID(nid), isRoundabout(isra), ignoreInGrid(iing), isDurationSet(ids), isAccessRestricted(iar), isContraFlow(icf) { | ||||
|         assert(0 <= type); | ||||
|     } | ||||
|     NodeID start; | ||||
| @ -102,6 +107,7 @@ struct _Edge { | ||||
|     bool ignoreInGrid; | ||||
|     bool isDurationSet; | ||||
|     bool isAccessRestricted; | ||||
|     bool isContraFlow; | ||||
| 
 | ||||
|     _Coordinate startCoord; | ||||
|     _Coordinate targetCoord; | ||||
|  | ||||
| @ -68,6 +68,7 @@ ScriptingEnvironment::ScriptingEnvironment(const char * fileName) { | ||||
|                                      luabind::class_<_Way>("Way") | ||||
|                                      .def(luabind::constructor<>()) | ||||
|                                      .def_readwrite("name", &_Way::name) | ||||
|                                      .def_readwrite("backward_speed", &_Way::backward_speed) | ||||
|                                      .def_readwrite("speed", &_Way::speed) | ||||
|                                      .def_readwrite("type", &_Way::type) | ||||
|                                      .def_readwrite("access", &_Way::access) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user