59 #ifdef CHECK_MEMORY_LEAKS
61 #endif // CHECK_MEMORY_LEAKS
81 NodeCont::iterator i =
myNodes.find(
id);
87 const float pos[2] = {(float)position.
x(), (float)position.
y()};
95 std::string
id = node->
getID();
96 NodeCont::iterator i =
myNodes.find(
id);
109 NodeCont::const_iterator i =
myNodes.find(
id);
120 const float cmin[2] = {(float)(position.
x() - extOffset), (
float)(position.
y() - extOffset)};
121 const float cmax[2] = {(float)(position.
x() + extOffset), (
float)(position.
y() + extOffset)};
122 std::set<std::string> into;
125 for (std::set<std::string>::const_iterator i = into.begin(); i != into.end(); i++) {
169 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
170 no += (*i).second->removeSelfLoops(dc, ec, tc);
184 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
186 std::map<NBNode*, EdgeVector> connectionCount;
187 const EdgeVector& outgoing = (*i).second->getOutgoingEdges();
188 for (EdgeVector::const_iterator j = outgoing.begin(); j != outgoing.end(); j++) {
191 if (connectionCount.find(connected) == connectionCount.end()) {
194 connectionCount[connected].push_back(e);
197 std::map<NBNode*, EdgeVector>::iterator k;
198 for (k = connectionCount.begin(); k != connectionCount.end(); k++) {
200 if ((*k).second.size() < 2) {
206 const NBEdge*
const first = ev.front();
207 EdgeVector::const_iterator jci;
208 for (jci = ev.begin() + 1; jci != ev.end(); ++jci) {
211 (relativeLengthDifference > lengthThreshold) ||
212 (fabs(first->
getSpeed() - (*jci)->getSpeed()) >= 0.01) ||
220 if (jci == ev.end()) {
233 const std::vector<std::string>& edgeNames = ec.
getAllNames();
234 for (std::vector<std::string>::const_iterator it = edgeNames.begin(); it != edgeNames.end(); ++it) {
243 if (outgoingEdges.size() != 1) {
248 if (incomingEdges.size() > 1) {
251 }
else if (incomingEdges.size() == 1) {
252 NBNode* fromNodeOfIncomingEdge = incomingEdges[0]->getFromNode();
253 NBNode* toNodeOfOutgoingEdge = outgoingEdges[0]->getToNode();
254 if (fromNodeOfIncomingEdge != toNodeOfOutgoingEdge) {
262 bool hasJunction =
false;
266 std::set<NBNode*> adjacentNodes;
274 adjacentNodes.clear();
275 for (EdgeVector::const_iterator itOfOutgoings = outgoingEdgesOfToNode.begin(); itOfOutgoings != outgoingEdgesOfToNode.end(); ++itOfOutgoings) {
276 if ((*itOfOutgoings)->getToNode() != from
277 && (*itOfOutgoings)->getToNode() != to
281 adjacentNodes.insert((*itOfOutgoings)->getToNode());
283 for (EdgeVector::const_iterator itOfIncomings = incomingEdgesOfToNode.begin(); itOfIncomings != incomingEdgesOfToNode.end(); ++itOfIncomings) {
284 adjacentNodes.insert((*itOfIncomings)->getFromNode());
286 adjacentNodes.erase(to);
287 if (adjacentNodes.size() > 2) {
290 }
while (!hasJunction && eOld != e);
292 edgeCounter += int(road.size());
293 std::string warningString =
"Removed a road without junctions: ";
294 for (EdgeVector::iterator roadIt = road.begin(); roadIt != road.end(); ++roadIt) {
295 if (roadIt == road.begin()) {
296 warningString += (*roadIt)->getID();
298 warningString +=
", " + (*roadIt)->getID();
301 NBNode* fromNode = (*roadIt)->getFromNode();
302 NBNode* toNode = (*roadIt)->getToNode();
303 ec.
erase(dc, *roadIt);
317 WRITE_WARNING(
"Detected isolated roads. Use the option --remove-edges.isolated to get a list of all affected edges.");
325 bool removeGeometryNodes) {
327 std::vector<NBNode*> toRemove;
328 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
329 NBNode* current = (*i).second;
331 std::vector<std::pair<NBEdge*, NBEdge*> > toJoin;
338 if (removeGeometryNodes &&
mySplit.count(current) == 0) {
354 for (std::vector<std::pair<NBEdge*, NBEdge*> >::iterator j = toJoin.begin(); j != toJoin.end(); j++) {
356 NBEdge* continuation = (*j).second;
357 begin->
append(continuation);
361 ec.
extract(dc, continuation,
true);
363 toRemove.push_back(current);
367 for (std::vector<NBNode*>::iterator j = toRemove.begin(); j != toRemove.end(); ++j) {
376 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
377 (*i).second->avoidOverlap();
384 std::set<NBNode*> visited;
385 for (NodeCont::const_iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
386 std::vector<NodeAndDist> toProc;
387 if (visited.find((*i).second) != visited.end()) {
390 toProc.push_back(std::make_pair((*i).second, 0));
392 while (!toProc.empty()) {
394 NBNode* n = nodeAndDist.first;
397 if (visited.find(n) != visited.end()) {
403 for (EdgeVector::const_iterator j = edges.begin(); j != edges.end(); ++j) {
414 if (visited.find(s) != visited.end()) {
421 toProc.push_back(std::make_pair(s, 0));
436 for (std::vector<std::string>::const_iterator it = ids.begin(); it != ids.end(); it++) {
440 WRITE_WARNING(
"Ignoring join exclusion for node '" + *it +
"' since it already occured in a list of nodes to be joined");
441 }
else if (check &&
retrieve(*it) == 0) {
442 WRITE_WARNING(
"Ignoring join exclusion for unknown node '" + *it +
"'");
453 for (std::set<std::string>::const_iterator it = cluster.begin(); it != cluster.end(); it++) {
455 WRITE_WARNING(
"Ignoring join-cluster because node '" + *it +
"' was already excluded from joining");
457 }
else if (
myJoined.count(*it) > 0) {
458 WRITE_WARNING(
"Ignoring join-cluster because node '" + *it +
"' already occured in another join-cluster");
473 std::set<NBNode*> cluster;
474 for (std::set<std::string>::iterator it_id = it->begin(); it_id != it->end(); it_id++) {
477 WRITE_WARNING(
"Ignoring unknown node '" + *it_id +
"' while joining");
479 cluster.insert(node);
482 if (cluster.size() > 1) {
483 clusters.push_back(cluster);
488 return (
int)clusters.size();
497 for (NodeClusters::iterator i = cands.begin(); i != cands.end(); ++i) {
498 std::set<NBNode*> cluster = (*i);
500 for (std::set<NBNode*>::iterator j = cluster.begin(); j != cluster.end();) {
501 std::set<NBNode*>::iterator check = j;
504 cluster.erase(check);
508 bool pruneFringe =
true;
509 while (pruneFringe) {
511 for (std::set<NBNode*>::iterator j = cluster.begin(); j != cluster.end();) {
512 std::set<NBNode*>::iterator check = j;
519 NBNode* neighbor = (*it_edge)->getToNode();
520 if (cluster.count(neighbor) != 0) {
521 clusterDist =
MIN2(clusterDist, (*it_edge)->getLoadedLength());
525 NBNode* neighbor = (*it_edge)->getFromNode();
526 if (cluster.count(neighbor) != 0) {
527 clusterDist =
MIN2(clusterDist, (*it_edge)->getLoadedLength());
532 std::set<NBNode*> neighbors;
533 std::set<NBNode*> clusterNeigbors;
534 const SUMOReal pedestrianFringeThreshold = 1.0;
536 NBNode* neighbor = (*it_edge)->getToNode();
537 if (cluster.count(neighbor) == 0) {
538 if ((*it_edge)->getPermissions() !=
SVC_PEDESTRIAN || clusterDist < pedestrianFringeThreshold) {
539 neighbors.insert(neighbor);
542 clusterNeigbors.insert(neighbor);
546 NBNode* neighbor = (*it_edge)->getFromNode();
547 if (cluster.count(neighbor) == 0) {
548 if ((*it_edge)->getPermissions() !=
SVC_PEDESTRIAN || clusterDist < pedestrianFringeThreshold) {
549 neighbors.insert(neighbor);
552 clusterNeigbors.insert(neighbor);
555 if (neighbors.size() <= 1 && clusterNeigbors.size() == 1) {
556 cluster.erase(check);
562 std::set<NBNode*> toRemove;
563 for (std::set<NBNode*>::iterator j = cluster.begin(); j != cluster.end(); ++j) {
566 for (EdgeVector::const_iterator it_edge = edges.begin(); it_edge != edges.end(); ++it_edge) {
575 for (std::set<NBNode*>::iterator j = toRemove.begin(); j != toRemove.end(); ++j) {
578 if (cluster.size() < 2) {
583 std::map<std::string, SUMOReal> finalIncomingAngles;
584 std::map<std::string, SUMOReal> finalOutgoingAngles;
585 std::vector<std::string> nodeIDs;
586 for (std::set<NBNode*>::const_iterator j = cluster.begin(); j != cluster.end(); ++j) {
587 nodeIDs.push_back((*j)->getID());
588 for (EdgeVector::const_iterator it_edge = (*j)->getIncomingEdges().begin(); it_edge != (*j)->getIncomingEdges().end(); ++it_edge) {
595 for (EdgeVector::const_iterator it_edge = (*j)->getOutgoingEdges().begin(); it_edge != (*j)->getOutgoingEdges().end(); ++it_edge) {
604 if (finalIncomingAngles.size() > 4) {
605 std::sort(nodeIDs.begin(), nodeIDs.end());
610 const SUMOReal PARALLEL_INCOMING_THRESHOLD = 10.0;
611 bool foundParallel =
false;
612 for (std::map<std::string, SUMOReal>::const_iterator j = finalIncomingAngles.begin(); j != finalIncomingAngles.end() && !foundParallel; ++j) {
613 std::map<std::string, SUMOReal>::const_iterator k = j;
614 for (++k; k != finalIncomingAngles.end() && !foundParallel; ++k) {
615 if (fabs(j->second - k->second) < PARALLEL_INCOMING_THRESHOLD) {
617 + j->first +
"," + k->first +
")");
618 foundParallel =
true;
623 for (std::map<std::string, SUMOReal>::const_iterator j = finalOutgoingAngles.begin(); j != finalOutgoingAngles.end() && !foundParallel; ++j) {
624 std::map<std::string, SUMOReal>::const_iterator k = j;
625 for (++k; k != finalOutgoingAngles.end() && !foundParallel; ++k) {
626 if (fabs(j->second - k->second) < PARALLEL_INCOMING_THRESHOLD) {
628 + j->first +
"," + k->first +
")");
629 foundParallel =
true;
639 for (std::set<NBNode*>::iterator j = cluster.begin(); j != cluster.end(); ++j) {
641 std::set<NBNode*> newComp;
644 newComp.insert(current);
645 for (NodeClusters::iterator it_comp = components.begin(); it_comp != components.end();) {
646 NodeClusters::iterator check = it_comp;
648 bool connected =
false;
649 for (std::set<NBNode*>::iterator k = (*check).begin(); k != (*check).end(); ++k) {
650 if (current->
getConnectionTo(*k) != 0 || (*k)->getConnectionTo(current) != 0) {
652 newComp.insert((*check).begin(), (*check).end());
653 it_comp = components.erase(check);
663 components.push_back(newComp);
665 for (NodeClusters::iterator it_comp = components.begin(); it_comp != components.end(); ++it_comp) {
666 if ((*it_comp).size() > 1) {
668 clusters.push_back(*it_comp);
673 return (
int)clusters.size();
680 for (NodeClusters::iterator i = clusters.begin(); i != clusters.end(); ++i) {
681 std::set<NBNode*> cluster = *i;
682 assert(cluster.size() > 1);
699 throw ProcessError(
"Could not allocate tls '" +
id +
"'.");
703 std::set<NBEdge*> allEdges;
704 for (std::set<NBNode*>::const_iterator j = cluster.begin(); j != cluster.end(); ++j) {
706 allEdges.insert(edges.begin(), edges.end());
710 for (std::set<NBEdge*>::iterator j = allEdges.begin(); j != allEdges.end();) {
714 if (cluster.count(from) > 0 && cluster.count(to) > 0) {
715 for (std::set<NBEdge*>::iterator l = allEdges.begin(); l != allEdges.end(); ++l) {
728 for (std::set<NBEdge*>::iterator j = allEdges.begin(); j != allEdges.end(); ++j) {
731 const bool outgoing = cluster.count(e->
getFromNode()) > 0;
737 for (std::vector<NBEdge::Connection>::iterator k = conns.begin(); k != conns.end(); ++k) {
743 for (std::set<NBNode*>::const_iterator j = cluster.begin(); j != cluster.end(); ++j) {
752 std::set<std::string> ids;
753 for (std::set<NBNode*>::const_iterator j = cluster.begin(); j != cluster.end(); j++) {
754 ids.insert((*j)->getID());
765 std::vector<std::string> member_ids;
766 bool ambiguousType =
false;
767 for (std::set<NBNode*>::const_iterator j = cluster.begin(); j != cluster.end(); j++) {
768 member_ids.push_back((*j)->getID());
769 pos.
add((*j)->getPosition());
771 if ((*j)->isTLControlled()) {
774 type = (*(*j)->getControllingTLS().begin())->getType();
775 }
else if (type != (*(*j)->getControllingTLS().begin())->getType()) {
776 ambiguousType =
true;
781 pos.
mul(1.0 / cluster.size());
783 sort(member_ids.begin(), member_ids.end());
784 for (std::vector<std::string>::iterator j = member_ids.begin(); j != member_ids.end(); j++) {
785 id =
id +
"_" + (*j);
789 WRITE_WARNING(
"Ambiguous traffic light type for node cluster '" +
id +
"' set to '" +
toString(type) +
"'");
797 unsigned int noIncoming = 0;
798 unsigned int noOutgoing = 0;
799 bool tooFast =
false;
801 std::set<NBEdge*> seen;
802 for (std::set<NBNode*>::const_iterator j = c.begin(); j != c.end(); ++j) {
804 for (EdgeVector::const_iterator k = edges.begin(); k != edges.end(); ++k) {
805 if (c.find((*k)->getFromNode()) != c.end() && c.find((*k)->getToNode()) != c.end()) {
808 if ((*j)->hasIncoming(*k)) {
810 f += (
SUMOReal)(*k)->getNumLanes() * (*k)->getLaneSpeed(0);
814 if ((*k)->getLaneSpeed(0) * 3.6 > 79) {
819 return !tooFast && f >= 150. / 3.6 && c.size() != 0;
826 std::vector<NBNode*> ncontrolled;
827 if (oc.
isSet(
"tls.unset")) {
828 std::vector<std::string> notTLControlledNodes = oc.
getStringVector(
"tls.unset");
829 for (std::vector<std::string>::const_iterator i = notTLControlledNodes.begin(); i != notTLControlledNodes.end(); ++i) {
832 throw ProcessError(
" The node '" + *i +
"' to set as not-controlled is not known.");
835 for (std::set<NBTrafficLightDefinition*>::const_iterator j = tls.begin(); j != tls.end(); ++j) {
839 ncontrolled.push_back(n);
846 if (oc.
exists(
"tls.taz-nodes") && oc.
getBool(
"tls.taz-nodes")) {
847 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
848 NBNode* cur = (*i).second;
849 if (cur->
isNearDistrict() && find(ncontrolled.begin(), ncontrolled.end(), cur) == ncontrolled.end()) {
857 if (oc.
exists(
"tls.guess-signals") && oc.
getBool(
"tls.guess-signals")) {
860 for (std::map<std::string, NBNode*>::const_iterator i =
myNodes.begin(); i !=
myNodes.end(); ++i) {
861 NBNode* node = (*i).second;
864 for (EdgeVector::const_iterator it_o = outgoing.begin(); it_o != outgoing.end(); ++it_o) {
865 (*it_o)->setSignalOffset((*it_o)->getLength());
870 for (std::map<std::string, NBNode*>::const_iterator i =
myNodes.begin(); i !=
myNodes.end(); ++i) {
875 std::vector<NBNode*> signals;
877 for (EdgeVector::const_iterator it_i = incoming.begin(); it_i != incoming.end(); ++it_i) {
878 const NBEdge* inEdge = *it_i;
889 for (EdgeVector::const_iterator it_i = outgoing.begin(); it_i != outgoing.end(); ++it_i) {
890 const NBEdge* outEdge = *it_i;
893 signals.push_back(cand);
897 for (std::vector<NBNode*>::iterator j = signals.begin(); j != signals.end(); ++j) {
900 for (std::set<NBTrafficLightDefinition*>::iterator k = tls.begin(); k != tls.end(); ++k) {
918 if (!oc.
getBool(
"tls.guess")) {
925 std::vector<std::set<NBNode*> > cands;
928 for (std::vector<std::set<NBNode*> >::iterator i = cands.begin(); i != cands.end();) {
929 std::set<NBNode*>& c = (*i);
932 for (std::set<NBNode*>::iterator j = c.begin(); j != c.end();) {
933 if ((*j)->isTLControlled() || find(ncontrolled.begin(), ncontrolled.end(), *j) != ncontrolled.end()) {
947 unsigned int index = 0;
948 for (std::vector<std::set<NBNode*> >::iterator i = cands.begin(); i != cands.end(); ++i) {
949 std::vector<NBNode*> nodes;
950 for (std::set<NBNode*>::iterator j = (*i).begin(); j != (*i).end(); j++) {
953 std::string
id =
"joinedG_" +
toString(index++);
965 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
966 NBNode* cur = (*i).second;
972 if (find(ncontrolled.begin(), ncontrolled.end(), cur) != ncontrolled.end()) {
987 std::vector<std::set<NBNode*> > cands;
989 unsigned int index = 0;
990 for (std::vector<std::set<NBNode*> >::iterator i = cands.begin(); i != cands.end(); ++i) {
991 std::set<NBNode*>& c = (*i);
992 for (std::set<NBNode*>::iterator j = c.begin(); j != c.end();) {
993 if (!(*j)->isTLControlled()) {
1005 std::string dummyId;
1008 for (std::set<NBNode*>::iterator j = c.begin(); j != c.end(); ++j) {
1009 std::set<NBTrafficLightDefinition*> tls = (*j)->getControllingTLS();
1010 (*j)->removeTrafficLights();
1011 for (std::set<NBTrafficLightDefinition*>::iterator k = tls.begin(); k != tls.end(); ++k) {
1015 std::string
id =
"joinedS_" +
toString(index++);
1016 std::vector<NBNode*> nodes;
1017 for (std::set<NBNode*>::iterator j = c.begin(); j != c.end(); j++) {
1018 nodes.push_back(*j);
1021 if (!tlc.
insert(tlDef)) {
1038 if (!tlc.
insert(tlDef)) {
1040 WRITE_WARNING(
"Building a tl-logic for node '" +
id +
"' twice is not possible.");
1050 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
1051 (*i).second->computeLanes2Lanes();
1059 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
1060 (*i).second->computeLogic(ec, oc);
1067 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
1068 delete((*i).second);
1081 std::string ret =
"SUMOGenerated" + toString<int>(
size());
1089 for (NodeCont::iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
1090 (*i).second->computeNodeShape(mismatchThreshold);
1097 int numUnregulatedJunctions = 0;
1098 int numDeadEndJunctions = 0;
1099 int numPriorityJunctions = 0;
1100 int numRightBeforeLeftJunctions = 0;
1101 int numAllWayStopJunctions = 0;
1102 int numRailSignals = 0;
1103 for (NodeCont::const_iterator i =
myNodes.begin(); i !=
myNodes.end(); i++) {
1104 switch ((*i).second->getType()) {
1107 ++numUnregulatedJunctions;
1110 ++numDeadEndJunctions;
1115 ++numPriorityJunctions;
1118 ++numRightBeforeLeftJunctions;
1121 ++numAllWayStopJunctions;
1124 ++numRightBeforeLeftJunctions;
1137 if (numDeadEndJunctions > 0) {
1142 if (numAllWayStopJunctions > 0) {
1145 if (numRailSignals > 0) {
1151 std::vector<std::string>
1153 std::vector<std::string> ret;
1154 for (NodeCont::const_iterator i =
myNodes.begin(); i !=
myNodes.end(); ++i) {
1155 ret.push_back((*i).first);
1163 if (
myNodes.count(newID) != 0) {
1164 throw ProcessError(
"Attempt to rename node using existing id '" + newID +
"'");
1174 for (NodeCont::const_iterator i =
myNodes.begin(); i !=
myNodes.end(); ++i) {
1175 NBNode* node = i->second;
1182 for (EdgeVector::const_iterator it_o = outgoing.begin(); it_o != outgoing.end(); ++it_o) {
1183 (*it_o)->setSignalOffset((*it_o)->getLength());
1186 for (std::set<NBTrafficLightDefinition*>::const_iterator it = tldefs.begin(); it != tldefs.end(); ++it) {
std::set< std::string > myJoinExclusions
NodeCont myNodes
The map of names to nodes.
void Insert(const float a_min[2], const float a_max[2], Named *const &a_data)
Insert entry.
void joinSimilarEdges(NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tlc)
Joins edges connecting the same nodes.
void replaceIncoming(NBEdge *which, NBEdge *by, unsigned int laneOff)
Replaces occurences of the first edge within the list of incoming by the second Connections are remap...
std::vector< std::string > getStringVector(const std::string &name) const
Returns the list of string-vector-value of the named option (only for Option_String) ...
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges.
void removeSelfLoops(NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tc)
Removes self-loop edges (edges where the source and the destination node are the same) ...
std::vector< std::string > getAllNames() const
Returns all ids of known edges.
static const SUMOReal UNSPECIFIED_SIGNAL_OFFSET
unspecified signal offset
void addJoinExclusion(const std::vector< std::string > &ids, bool check=false)
void add(const Position &pos)
Adds the given position to this one.
unsigned int removeUnwishedNodes(NBDistrictCont &dc, NBEdgeCont &ec, NBJoinedEdgesMap &je, NBTrafficLightLogicCont &tlc, bool removeGeometryNodes)
Removes "unwished" nodes.
A container for traffic light definitions and built programs.
void reinit(const Position &position, SumoXMLNodeType type, bool updateEdgeGeometries=false)
Resets initial values.
bool isTLControlled() const
Returns whether this node is controlled by any tls.
unsigned int joinJunctions(SUMOReal maxDist, NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tlc)
Joins junctions that are very close together.
std::vector< std::set< std::string > > myJoinedClusters
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
The representation of a single edge during network building.
void reinitNodes(NBNode *from, NBNode *to)
Resets nodes but keeps all other values the same (used when joining)
A container for districts.
The base class for traffic light logic definitions.
std::pair< NBNode *, SUMOReal > NodeAndDist
NamedRTree myRTree
node positions for faster lookup
void guessTLs(OptionsCont &oc, NBTrafficLightLogicCont &tlc)
Guesses which junctions or junction clusters shall be controlled by tls.
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
void avoidOverlap()
fix overlap
bool checkIsRemovable() const
void removeTrafficLight(NBTrafficLightDefinition *tlDef)
Removes the given traffic light from this node.
void extract(NBTrafficLightDefinition *definition)
Extracts a traffic light definition from myDefinitions but keeps it in myExtracted for eventual * del...
bool hasIncoming(const NBEdge *const e) const
Returns whether the given edge ends at this node.
SUMOReal x() const
Returns the x-position.
#define UNUSED_PARAMETER(x)
#define WRITE_WARNING(msg)
std::string joinToStringSorting(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=OUTPUT_ACCURACY)
static OptionsCont & getOptions()
Retrieves the options.
void computeLogics(const NBEdgeCont &ec, OptionsCont &oc)
build the list of outgoing edges and lanes
void generateNodeClusters(SUMOReal maxDist, NodeClusters &into) const
Builds node clusters.
A class representing a single district.
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges.
SUMOReal getLoadedLength() const
Returns the length was set explicitly or the computed length if it wasn't set.
const std::string & getID() const
Returns the id.
void Remove(const float a_min[2], const float a_max[2], Named *const &a_data)
Remove entry.
unsigned int size() const
Returns the number of known nodes.
const Position & getPosition() const
Returns the position of this node.
const std::set< NBTrafficLightDefinition * > & getControllingTLS() const
Returns the traffic lights that were assigned to this node.
void computeLanes2Lanes()
divides the incoming lanes on outgoing lanes
void joinTLS(NBTrafficLightLogicCont &tlc, SUMOReal maxdist)
Builds clusters of tls-controlled junctions and joins the control if possible.
static StringBijection< TrafficLightType > TrafficLightTypes
void extract(NBDistrictCont &dc, NBEdge *edge, bool remember=false)
Removes the given edge from the container like erase but does not delete it.
A point in 2D or 3D with translation and scaling methods.
unsigned int joinLoadedClusters(NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tlc)
Joins loaded junction clusters (see NIXMLNodesHandler)
bool geometryLike() const
whether this is structurally similar to a geometry node
void removeTrafficLights()
Removes all references to traffic lights that control this tls.
const EdgeVector & getEdges() const
Returns all edges which participate in this node.
Storage for edges, including some functionality operating on multiple edges.
void joinNodeClusters(NodeClusters clusters, NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tlc)
std::set< NBNode * > myExtractedNodes
The extracted nodes which are kept for reference.
std::vector< std::string > getAllNames() const
get all node names
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
The connection was given by the user.
SUMOReal getSignalOffset() const
Returns the offset of a traffic signal from the end of this edge.
NBEdge * getConnectionTo(NBNode *n) const
bool shouldBeTLSControlled(const std::set< NBNode * > &c) const
Returns whethe the given node cluster should be controlled by a tls.
void rename(NBNode *node, const std::string &newID)
Renames the node. Throws exception if newID already exists.
std::vector< std::pair< NBEdge *, NBEdge * > > getEdgesToJoin() const
void joinSameNodeConnectingEdges(NBDistrictCont &dc, NBTrafficLightLogicCont &tlc, EdgeVector edges)
Joins the given edges because they connect the same nodes.
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
void setAsTLControlled(NBNode *node, NBTrafficLightLogicCont &tlc, TrafficLightType type, std::string id="")
Sets the given node as being controlled by a tls.
Allows to store the object; used as context while traveling the rtree in TraCI.
bool addLane2LaneConnection(unsigned int fromLane, NBEdge *dest, unsigned int toLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, bool keepClear=true)
Adds a connection between the specified this edge's lane and an approached one.
NBNode * getToNode() const
Returns the destination node of the edge.
bool isNearDistrict() const
void setID(const std::string &newID)
resets the id
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
void addCluster2Join(std::set< std::string > cluster)
add ids of nodes which shall be joined into a single node
A structure storing information about which edges were joined.
std::vector< NBEdge * > EdgeVector
void analyzeCluster(std::set< NBNode * > cluster, std::string &id, Position &pos, bool &hasTLS, TrafficLightType &type)
void removeIsolatedRoads(NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tc)
Removes sequences of edges that are not connected with a junction. Simple roads without junctions som...
std::set< std::string > myJoined
ids found in loaded join clusters used for error checking
SUMOReal y() const
Returns the y-position.
A storage for options typed value containers)
std::vector< std::set< NBNode * > > NodeClusters
Definition of a node cluster container.
void erase(NBDistrictCont &dc, NBEdge *edge)
Removes the given edge from the container (deleting it)
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
void mul(SUMOReal val)
Multiplies both positions with the given value.
void append(NBEdge *continuation)
std::vector< std::set< std::string > > myClusters2Join
void computeNodeShapes(SUMOReal mismatchThreshold=-1)
Compute the junction shape for this node.
void discardTrafficLights(NBTrafficLightLogicCont &tlc, bool geometryLike, bool guessSignals)
Represents a single node (junction) during network building.
T get(const std::string &str) const
bool removeFully(const std::string id)
Removes a logic definition (and all programs) from the dictionary.
bool insert(NBTrafficLightDefinition *logic, bool forceInsert=false)
Adds a logic definition to the dictionary.
bool isNearEnough2BeJoined2(NBEdge *e, SUMOReal threshold) const
std::set< const NBNode * > mySplit
nodes that were created when splitting an edge
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
SUMOReal getSpeed() const
Returns the speed allowed on this edge.
void printBuiltNodesStatistics() const
Prints statistics about built nodes.
void replaceRemoved(NBEdge *removed, int removedLane, NBEdge *by, int byLane)
Replaces occurences of the removed edge/lane in all definitions by the given edge.
A traffic light logics which must be computed (only nodes/edges are given)
void appended(const std::string &to, const std::string &what)
Informs the map that two edges have been joined.
bool extract(NBNode *node, bool remember=false)
Removes the given node but does not delete it.
int Search(const float a_min[2], const float a_max[2], const Named::StoringVisitor &c) const
Find all within search rectangle.
#define WRITE_MESSAGE(msg)
bool erase(NBNode *node)
Removes the given node, deleting it.
const std::vector< Connection > & getConnections() const
Returns the connections.
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
bool exists(const std::string &name) const
Returns the information whether the named option is known.
SUMOReal getLength() const
Returns the computed length of the edge.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
SUMOReal getAngleAtNode(const NBNode *const node) const
Returns the angle of the edge's geometry at the given node.
void registerJoinedCluster(const std::set< NBNode * > &cluster)
gets all joined clusters (see doc for myClusters2Join)
NBNode * getFromNode() const
Returns the origin node of the edge.