59 #ifdef CHECK_MEMORY_LEAKS 61 #endif // CHECK_MEMORY_LEAKS 70 myVehicleClasses2Keep(0),
71 myVehicleClasses2Remove(0),
72 myNeedGeoTransformedPrunningBoundary(false) {
87 if (oc.
isSet(
"keep-edges.input-file")) {
90 if (oc.
isSet(
"remove-edges.input-file")) {
93 if (oc.
isSet(
"keep-edges.explicit")) {
94 const std::vector<std::string> edges = oc.
getStringVector(
"keep-edges.explicit");
97 if (oc.
isSet(
"remove-edges.explicit")) {
98 const std::vector<std::string> edges = oc.
getStringVector(
"remove-edges.explicit");
101 if (oc.
exists(
"keep-edges.by-vclass") && oc.
isSet(
"keep-edges.by-vclass")) {
104 if (oc.
exists(
"remove-edges.by-vclass") && oc.
isSet(
"remove-edges.by-vclass")) {
107 if (oc.
exists(
"keep-edges.by-type") && oc.
isSet(
"keep-edges.by-type")) {
108 const std::vector<std::string> types = oc.
getStringVector(
"keep-edges.by-type");
111 if (oc.
exists(
"remove-edges.by-type") && oc.
isSet(
"remove-edges.by-type")) {
112 const std::vector<std::string> types = oc.
getStringVector(
"remove-edges.by-type");
116 if (oc.
isSet(
"keep-edges.in-boundary") || oc.
isSet(
"keep-edges.in-geo-boundary")) {
118 "keep-edges.in-boundary" :
"keep-edges.in-geo-boundary");
120 std::vector<SUMOReal> poly;
121 for (std::vector<std::string>::iterator i = polyS.begin(); i != polyS.end(); ++i) {
124 if (poly.size() < 4) {
125 throw ProcessError(
"Invalid boundary: need at least 2 coordinates");
126 }
else if (poly.size() % 2 != 0) {
127 throw ProcessError(
"Invalid boundary: malformed coordinate");
128 }
else if (poly.size() == 4) {
135 for (std::vector<SUMOReal>::iterator j = poly.begin(); j != poly.end();) {
148 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
173 if (oc.
exists(
"dismiss-vclasses") && oc.
getBool(
"dismiss-vclasses")) {
239 WRITE_ERROR(
"Cannot prune edges using a geo-boundary because no projection has been loaded");
256 EdgeCont::const_iterator i =
myEdges.find(
id);
258 if (retrieveExtracted) {
299 if (downstream ==
true) {
323 hints.push_back(hintedge);
326 for (EdgeVector::iterator i = hints.begin(); i != hints.end(); i++) {
328 for (EdgeVector::iterator j = candidates.begin(); j != candidates.end(); j++) {
329 NBEdge* poss_searched = (*j);
331 ? poss_searched->
myTo : poss_searched->
myFrom;
334 if (find(cont.begin(), cont.end(), hintedge) != cont.end()) {
335 return poss_searched;
351 std::string tid =
id +
"[";
352 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
353 if ((*i).first.find(tid) == 0) {
354 maxLength =
MAX2(maxLength, (
int)(*i).first.length());
359 std::vector<std::string> names;
360 names.push_back(
id +
"[1]");
361 names.push_back(
id +
"[0]");
362 while (names.size() > 0) {
364 std::string cid = names.back();
370 if ((
int)cid.length() + 3 < maxLength) {
371 names.push_back(cid +
"[1]");
372 names.push_back(cid +
"[0]");
409 if (
myEdges.count(newID) != 0) {
410 throw ProcessError(
"Attempt to rename edge using existing id '" + newID +
"'");
428 const std::string& firstEdgeName,
429 const std::string& secondEdgeName,
430 int noLanesFirstEdge,
int noLanesSecondEdge,
432 const int changedLeft) {
443 return splitAt(dc, edge, pos, node, firstEdgeName, secondEdgeName,
444 noLanesFirstEdge, noLanesSecondEdge, speed, changedLeft);
451 const std::string& firstEdgeName,
452 const std::string& secondEdgeName,
453 int noLanesFirstEdge,
int noLanesSecondEdge,
455 const int changedLeft
458 assert(changedLeft > -((
int)noLanesFirstEdge));
459 assert(changedLeft < (
int)noLanesSecondEdge);
462 std::pair<PositionVector, PositionVector> geoms =
465 geoms.first.pop_back();
473 NBEdge* one =
new NBEdge(firstEdgeName, edge->
myFrom, node, edge, geoms.first, noLanesFirstEdge);
474 NBEdge* two =
new NBEdge(secondEdgeName, node, edge->
myTo, edge, geoms.second, noLanesSecondEdge);
484 for (std::set<NBTrafficLightDefinition*>::iterator i = fromTLS.begin(); i != fromTLS.end(); ++i) {
485 (*i)->replaceRemoved(edge, -1, one, -1);
488 for (std::set<NBTrafficLightDefinition*>::iterator i = toTLS.begin(); i != toTLS.end(); ++i) {
489 (*i)->replaceRemoved(edge, -1, two, -1);
500 for (
int i2 = 0; i2 < (int)two->
getNumLanes(); i2++) {
529 for (std::set<EdgeSet>::iterator it = roundabouts.begin(); it != roundabouts.end(); ++it) {
531 if (roundaboutSet.count(orig) > 0) {
532 roundabouts.erase(roundaboutSet);
533 roundaboutSet.erase(orig);
534 roundaboutSet.insert(part1);
535 roundaboutSet.insert(part2);
536 roundabouts.insert(roundaboutSet);
543 std::vector<std::string>
545 std::vector<std::string> ret;
546 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
547 ret.push_back((*i).first);
557 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
558 NBEdge* edge = (*i).second;
562 toRemove.push_back(edge);
565 for (EdgeVector::iterator j = toRemove.begin(); j != toRemove.end(); ++j) {
573 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
574 if ((*i).second->getGeometry().size() < 3) {
577 (*i).second->splitGeometry(*
this, nc);
584 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
585 (*i).second->reduceGeometry(minDist);
592 if (maxAngle > 0 || minRadius > 0) {
593 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
594 (*i).second->checkGeometry(maxAngle, minRadius, fix);
603 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
604 (*i).second->clearControllingTLInformation();
611 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
612 (*i).second->sortOutgoingConnectionsByAngle();
619 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
620 (*i).second->computeEdge2Edges(noLeftMovers);
627 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
628 (*i).second->computeLanes2Edges();
635 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
640 const std::string& oppositeID = edge->
getLanes().back().oppositeID;
641 if (oppositeID !=
"" && oppositeID !=
"-") {
642 NBEdge* oppEdge =
retrieve(oppositeID.substr(0, oppositeID.rfind(
"_")));
644 WRITE_WARNING(
"Removing unknown opposite lane '" + oppositeID +
"' for edge '" + edge->
getID() +
"'.");
653 throw ProcessError(
"Opposite lane '" + oppositeID +
"' does not connect the same nodes as edge '" + edge->
getID() +
"'!");
663 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
664 (*i).second->appendTurnaround(noTLSControlled,
true);
671 for (std::set<std::string>::const_iterator it = ids.begin(); it != ids.end(); it++) {
672 myEdges[*it]->appendTurnaround(noTLSControlled,
false);
679 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
680 (*i).second->computeEdgeShape();
687 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
688 (*i).second->computeLaneShapes();
709 NBEdge* tpledge = *(edges.begin());
710 NBNode* from = tpledge->getFromNode();
711 NBNode* to = tpledge->getToNode();
712 EdgeVector::const_iterator i;
713 for (i = edges.begin(); i != edges.end(); i++) {
715 assert((*i)->getFromNode() == from);
716 assert((*i)->getToNode() == to);
718 nolanes += (*i)->getNumLanes();
720 if (i != edges.begin()) {
725 speed += (*i)->getSpeed();
727 priority =
MAX2(priority, (*i)->getPriority());
729 speed /= edges.size();
731 NBEdge* newEdge =
new NBEdge(
id, from, to,
"", speed, nolanes, priority,
733 tpledge->getStreetName(), tpledge->myLaneSpreadFunction);
736 for (i = edges.begin(); i != edges.end(); ++i) {
737 const std::vector<NBEdge::Lane>& lanes = (*i)->
getLanes();
738 for (
int j = 0; j < (int)lanes.size(); ++j) {
752 for (i = edges.begin(); i != edges.end(); i++) {
754 for (EdgeVector::iterator j = ev.begin(); j != ev.end(); j++) {
760 for (i = edges.begin(); i != edges.end(); i++) {
762 currLane += (*i)->getNumLanes();
766 for (i = edges.begin(); i != edges.end(); i++) {
767 int noLanes = (*i)->getNumLanes();
768 for (
int j = 0; j < noLanes; j++, currLane++) {
774 for (i = edges.begin(); i != edges.end(); i++) {
783 const SUMOReal distanceThreshold = 7;
784 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
793 if ((*j)->getToNode() == edge->
getFromNode() && !(*j)->getLanes().empty()) {
795 if (distance < distanceThreshold) {
812 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
826 const std::string oppositeID = edgeID[0] ==
'-' ? edgeID.substr(1) :
"-" + edgeID;
827 EdgeCont::const_iterator it =
myEdges.find(oppositeID);
844 if (from == 0 || to == 0 ||
846 WRITE_ERROR(
"Could not insert connection between '" + (*i).from +
"' and '" + (*i).to +
"' after build.");
851 for (EdgeCont::iterator it =
myEdges.begin(); it !=
myEdges.end(); ++it) {
852 NBEdge* edge = it->second;
855 std::vector<NBEdge::Connection> connections = edge->
getConnections();
856 for (std::vector<NBEdge::Connection>::iterator it_con = connections.begin(); it_con != connections.end(); ++it_con) {
860 "' to edge '" + c.
toEdge->
getID() +
"' via junction '" + to->
getID() +
"'.");
870 int len = (int)
id.length();
872 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
873 std::string curr = (*i).first;
876 if ((
int)curr.length() <= len) {
881 if (curr.substr(0, len) ==
id && curr[len] ==
'[') {
882 ret.push_back((*i).second);
886 std::string::size_type pos = curr.find(
id);
888 if (pos == std::string::npos) {
893 if (curr[pos - 1] !=
']' && curr[pos - 1] !=
'+') {
898 if (pos +
id.length() < curr.length()) {
899 if (curr[pos +
id.length()] !=
'[' && curr[pos +
id.length()] !=
'+') {
904 ret.push_back((*i).second);
913 std::set<NBEdge*> loadedRoundaboutEdges;
915 loadedRoundaboutEdges.insert(it->begin(), it->end());
919 std::set<NBEdge*> candidates;
920 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
924 candidates.insert(e);
929 std::set<NBEdge*> visited;
930 for (std::set<NBEdge*>::const_iterator i = candidates.begin(); i != candidates.end(); ++i) {
937 if (visited.count(e) > 0) {
941 loopEdges.push_back(e);
946 if (edges.size() < 2) {
955 EdgeVector::const_iterator me = find(edges.begin(), edges.end(), e);
964 EdgeVector::const_iterator loopClosed = find(loopEdges.begin(), loopEdges.end(), left);
965 const int loopSize = (int)(loopEdges.end() - loopClosed);
970 }
else if (loopSize < (
int)loopEdges.size()) {
972 EdgeVector(loopEdges.begin() + (loopEdges.size() - loopSize), loopEdges.end()).swap(loopEdges);
976 for (EdgeVector::const_iterator j = loopEdges.begin(); j != loopEdges.end(); ++j) {
977 if ((*j)->getToNode()->getEdges().size() > 2) {
981 if (attachments < 3) {
986 if (visited.count(left) > 0) {
990 loopEdges.push_back(left);
1009 for (EdgeVector::const_iterator it = loopEdges.begin(); it != loopEdges.end(); ++it) {
1010 points.
append((*it)->getGeometry());
1013 return 4 *
M_PI * points.
area() / (circumference * circumference);
1017 const std::set<EdgeSet>
1027 if (roundabout.size() > 0) {
1040 for (std::set<EdgeSet>::const_iterator it = roundabouts.begin(); it != roundabouts.end(); ++it) {
1041 const EdgeSet roundaboutSet = *it;
1042 for (std::set<NBEdge*>::const_iterator j = roundaboutSet.begin(); j != roundaboutSet.end(); ++j) {
1044 NBNode* node = (*j)->getToNode();
1046 for (EdgeVector::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
1048 if (roundaboutSet.count(inEdge) > 0) {
1066 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
1106 int sidewalksCreated = 0;
1108 std::set<std::string> exclude(edges.begin(), edges.end());
1109 for (EdgeCont::iterator it =
myEdges.begin(); it !=
myEdges.end(); it++) {
1110 NBEdge* edge = it->second;
1112 exclude.count(edge->
getID()) == 0
1119 || (!fromPermissions && edge->
getSpeed() > minSpeed && edge->
getSpeed() <= maxSpeed)
1122 sidewalksCreated += 1;
1125 return sidewalksCreated;
1132 std::set<std::string> reserve;
1135 avoid.insert(avoid.end(), reserve.begin(), reserve.end());
1138 std::set<NBEdge*, Named::ComparatorIdLess> toChange;
1139 for (EdgeCont::iterator it =
myEdges.begin(); it !=
myEdges.end(); it++) {
1144 toChange.insert(it->second);
1147 if (reservedIDs && reserve.count(it->first) > 0) {
1148 toChange.insert(it->second);
1151 for (std::set<NBEdge*, Named::ComparatorIdLess>::iterator it = toChange.begin(); it != toChange.end(); ++it) {
1157 return (
int)toChange.size();
1163 for (EdgeCont::const_iterator it =
myEdges.begin(); it !=
myEdges.end(); it++) {
1164 const NBEdge* e1 = it->second;
1170 for (EdgeCont::const_iterator it2 = it; it2 !=
myEdges.end(); it2++) {
1171 const NBEdge* e2 = it2->second;
1181 if (overlap > threshold) {
1192 for (EdgeCont::const_iterator it =
myEdges.begin(); it !=
myEdges.end(); it++) {
1193 const NBEdge* edge = it->second;
1194 for (
int i = 0; i < (int)edge->
getNumLanes(); i++) {
1196 if (grade > threshold) {
1201 const std::vector<NBEdge::Connection>& connections = edge->
getConnections();
1202 for (std::vector<NBEdge::Connection>::const_iterator it_con = connections.begin(); it_con != connections.end(); ++it_con) {
1205 if (grade > threshold) {
int guessSidewalks(SUMOReal width, SUMOReal minSpeed, SUMOReal maxSpeed, bool fromPermissions)
add sidwalks to edges within the given limits or permissions and return the number of edges affected ...
std::vector< Lane > myLanes
Lane information.
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 (The edges which yield in this node)
const std::string & getTypeID() const
get ID of type
A structure which describes a connection between edges or lanes.
void sortOutgoingLanesConnections()
Sorts all lanes of all edges within the container by their direction.
void markRoundabouts()
mark edge priorities and prohibit turn-arounds for all roundabout edges
void setRoundabout()
update the type of this node as a roundabout
NBEdge * retrievePossiblySplit(const std::string &id, bool downstream) const
Tries to retrieve an edge, even if it is splitted.
static const SUMOReal UNSPECIFIED_WIDTH
unspecified lane width
A class representing a single street sign.
PositionVector shape
The lane's shape.
bool x2cartesian_const(Position &from) const
Converts the given coordinate into a cartesian using the previous initialisation. ...
SUMOReal nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
std::vector< std::string > getAllNames() const
Returns all ids of known edges.
void addSign(NBSign sign)
add Sign
NBEdge * toEdge
The edge the connections yields in.
static void loadPrefixedIDsFomFile(const std::string &file, const std::string prefix, std::set< std::string > &into)
Add prefixed ids defined in file.
const std::set< EdgeSet > getRoundabouts() const
Returns the determined roundabouts.
static SUMOReal _2SUMOReal(const E *const data)
converts a char-type array into the SUMOReal value described by it
bool myNeedGeoTransformedPrunningBoundary
whether a geo transform has been applied to the pruning boundary
A container for traffic light definitions and built programs.
int guessRoundabouts()
Determines which edges belong to roundabouts and increases their priority.
void setLaneWidth(int lane, SUMOReal width)
set lane specific width (negative lane implies set for all lanes)
bool myRemoveEdgesAfterJoining
Whether edges shall be joined first, then removed.
void setSpeed(int lane, SUMOReal speed)
set lane specific speed (negative lane implies set for all lanes)
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
void addSidewalk(SUMOReal width)
add a pedestrian sidewalk of the given width and shift existing connctions
static GeoConvHelper & getProcessing()
the coordinate transformation to use for input conversion and processing
void removeEdge(NBEdge *edge, bool removeFromConnections=true)
Removes edge from this node and optionally removes connections as well.
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 addPostProcessConnection(const std::string &from, int fromLane, const std::string &to, int toLane, bool mayDefinitelyPass, bool keepClear, SUMOReal contPos, SUMOReal visibility)
Adds a connection which could not be set during loading.
void guessOpposites()
Sets opposite lane information for geometrically close edges.
PositionVector getCCWBoundaryLine(const NBNode &n) const
get the outer boundary of this edge when going counter-clock-wise around the given node ...
std::string getDescription(const NBEdge *parent) const
get string describing this connection
A container for districts.
static GeoConvHelper & getLoaded()
the coordinate transformation that was loaded fron an input file
SUMOReal getTotalWidth() const
Returns the combined width of all lanes of this edge.
void removeDoubleEdges()
remove duble edges
void clearControllingTLInformation() const
Clears information about controlling traffic lights for all connenections of all edges.
void setPermissions(SVCPermissions permissions, int lane=-1)
set allowed/disallowed classes for the given lane or for all lanes if -1 is given ...
SUMOReal getOverlapWith(const PositionVector &poly, SUMOReal zThreshold) const
Returns the maximum overlaps between this and the given polygon (when not separated by at least zThre...
void generateStreetSigns()
assigns street signs to edges based on toNode types
void rename(NBEdge *edge, const std::string &newID)
Renames the edge. Throws exception if newID already exists.
bool splitAt(NBDistrictCont &dc, NBEdge *edge, NBNode *node)
Splits the edge at the position nearest to the given node.
void recheckPostProcessConnections()
Try to set any stored connections.
static bool transformCoordinates(PositionVector &from, bool includeInBoundary=true, GeoConvHelper *from_srs=0)
static long long int _str2long(const std::string &sData)
converts a string into the long value described by it by calling the char-type converter, which
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
static void nextCW(const EdgeVector &edges, EdgeVector::const_iterator &from)
Lane & getLaneStruct(int lane)
static const SUMOReal UNSPECIFIED_OFFSET
unspecified lane offset
static void loadEdgesFromFile(const std::string &file, std::set< std::string > &into)
Add edge ids defined in file (either ID or edge:ID per line) into the given set.
void computeLanes2Edges()
Computes for each edge which lanes approach the next edges.
A class that stores a 2D geometrical boundary.
std::vector< PostProcessConnection > myConnections
The list of connections to recheck.
void replaceOutgoing(NBEdge *which, NBEdge *by, int laneOff)
Replaces occurences of the first edge within the list of outgoing by the second Connections are remap...
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
void checkGeometries(const SUMOReal maxAngle, const SUMOReal minRadius, bool fix)
PositionVector shape
shape of Connection
NBEdgeCont(NBTypeCont &tc)
Constructor.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node)
SUMOReal getLoadedLength() const
Returns the length was set explicitly or the computed length if it wasn't set.
An (internal) definition of a single lane of an edge.
const std::string & getID() const
Returns the id.
SUMOReal length2D() const
Returns the length.
std::vector< SUMOReal > distances(const PositionVector &s, bool perpendicular=false) const
distances of all my points to s and all of s points to myself
bool addEdge2EdgeConnection(NBEdge *dest)
Adds a connection to another edge.
bool overlapsWith(const AbstractPoly &poly, SUMOReal offset=0) const
Returns whether the boundary overlaps with the given polygon.
SVCPermissions myVehicleClasses2Keep
Set of vehicle types which must be allowed on edges in order to keep them.
const Position & getPosition() const
void reduceGeometries(const SUMOReal minDist)
Lanes to lanes - relationships are loaded; no recheck is necessary/wished.
std::set< NBEdge * > EdgeSet
container for unique edges
void patchRoundabouts(NBEdge *orig, NBEdge *part1, NBEdge *part2, std::set< EdgeSet > &roundabouts)
fix roundabout information after splitting an edge
std::string getNext()
Returns the next id.
bool usingGeoProjection() const
Returns whether a transformation from geo to metric coordinates will be performed.
const std::set< NBTrafficLightDefinition * > & getControllingTLS() const
Returns the traffic lights that were assigned to this node (The set of tls that control this node) ...
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
void checkOverlap(SUMOReal threshold, SUMOReal zThreshold) const
check whether edges overlap
void removeUnwishedEdges(NBDistrictCont &dc)
Removes unwished edges (not in keep-edges)
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.
void applyOptions(OptionsCont &oc)
Initialises the storage by applying given options.
void moveOutgoingConnectionsFrom(NBEdge *e, int laneOff)
move outgoing connection
std::set< std::string > myEdges2Keep
Set of ids of edges which shall explicitly be kept.
SumoXMLNodeType getType() const
Returns the type of this node.
void computeEdge2Edges(bool noLeftMovers)
Computes for each edge the approached edges.
void computeLaneShapes()
Computes the shapes of all lanes of all edges stored in the container.
bool addLane2LaneConnection(int fromLane, NBEdge *dest, int toLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, bool keepClear=true, SUMOReal contPos=UNSPECIFIED_CONTPOS, SUMOReal visibility=UNSPECIFIED_VISIBILITY_DISTANCE)
Adds a connection between the specified this edge's lane and an approached one.
int getNumLanes() const
Returns the number of lanes.
const EdgeVector & getEdges() const
Returns all edges which participate in this node (Edges that start or end at this node) ...
void splitGeometry(NBNodeCont &nc)
Splits edges into multiple if they have a complex geometry.
EdgeCont myEdges
The instance of the dictionary (id->edge)
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
void clear()
Deletes all edges.
EdgeCont myExtractedEdges
The extracted nodes which are kept for reference.
bool knows(const std::string &type) const
Returns whether the named type is in the container.
The connection was given by the user.
std::set< EdgeSet > myGuessedRoundabouts
Edges marked as belonging to a roundabout after guessing.
void removeFromConnections(NBEdge *toEdge, int fromLane=-1, int toLane=-1, bool tryLater=false)
Removes the specified connection(s)
std::set< EdgeSet > myRoundabouts
Edges marked as belonging to a roundabout by the user (each EdgeVector is a roundabout) ...
NBEdge * getConnectionTo(NBNode *n) const
get connection to certain node
bool recheckLanes()
recheck whether all lanes within the edge are all right and optimises the connections once again ...
int getJunctionPriority(const NBNode *const node) const
Returns the junction priority (normalised for the node currently build)
void joinSameNodeConnectingEdges(NBDistrictCont &dc, NBTrafficLightLogicCont &tlc, EdgeVector edges)
Joins the given edges because they connect the same nodes.
static SUMOReal formFactor(const EdgeVector &loopEdges)
compute the form factor for a loop of edges
std::pair< PositionVector, PositionVector > splitAt(SUMOReal where) const
Returns the two lists made when this list vector is splitted at the given point.
SVCPermissions myVehicleClasses2Remove
Set of vehicle types which need not be supported (edges which allow ONLY these are removed) ...
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
PositionVector myPrunningBoundary
Boundary within which an edge must be located in order to be kept.
SUMOReal length() const
Returns the length.
std::set< std::string > myTypes2Keep
Set of edges types which shall be kept.
Boundary & grow(SUMOReal by)
extends the boundary by the given amount
NBNode * getToNode() const
Returns the destination node of the edge.
SUMOReal myEdgesMinSpeed
The minimum speed an edge may have in order to be kept (default: -1)
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.
PositionVector viaShape
shape of via
std::string oppositeID
An opposite lane ID, if given.
void appendTurnarounds(bool noTLSControlled)
Appends turnarounds to all edges stored in the container.
void replaceIncoming(NBEdge *which, NBEdge *by, int laneOff)
Replaces occurences of the first edge within the list of incoming by the second Connections are remap...
SumoXMLNodeType
Numbers representing special SUMO-XML-attribute values for representing node- (junction-) types used ...
void checkGrade(SUMOReal threshold) const
check whether edges are to steep
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
bool getShallBeDiscarded(const std::string &type) const
Returns the information whether edges of this type shall be discarded.
const PositionVector & getGeometry() const
Returns the geometry of the edge.
A storage for options typed value containers)
static SUMOReal nearest_offset_on_line_to_point2D(const Position &lineStart, const Position &lineEnd, const Position &p, bool perpendicular=true)
void erase(NBDistrictCont &dc, NBEdge *edge)
Removes the given edge from the container (deleting it)
A structure representing a connection between two lanes.
void computeEdgeShapes()
Computes the shapes of all edges stored in the container.
The connection was computed.
NBEdge * getOppositeByID(const std::string &edgeID) const
Returns the edge with negated id if it exists.
Represents a single node (junction) during network building.
void dismissVehicleClassInformation()
dimiss vehicle class information
bool isSimpleContinuation(bool checkLaneNumbers=true) const
check if node is a simple continuation
NBTypeCont & myTypeCont
The network builder; used to obtain type information.
void recheckLaneSpread()
Rechecks whether the lane spread is proper.
void setEndOffset(int lane, SUMOReal offset)
set lane specific end-offset (negative lane implies set for all lanes)
static SUMOReal relAngle(SUMOReal angle1, SUMOReal angle2)
computes the relative angle between the two angles
std::string getLaneID(int lane) const
get Lane ID (Secure)
void removeFromSinksAndSources(NBEdge *const e)
Removes the given edge from the lists of sources and sinks in all stored districts.
std::set< std::string > myTypes2Remove
Set of edges types which shall be removed.
void recheckLanes()
Rechecks whether all lanes have a successor for each of the stored edges.
SUMOReal getSpeed() const
Returns the speed allowed on this edge.
Container for nodes during the netbuilding process.
static T maxValue(const std::vector< T > &v)
std::set< std::string > myIgnoredEdges
The ids of ignored edges.
EdgeVector getGeneratedFrom(const std::string &id) const
Returns the edges which have been built by splitting the edge of the given id.
void replaceRemoved(NBEdge *removed, int removedLane, NBEdge *by, int byLane)
Replaces occurences of the removed edge/lane in all definitions by the given edge.
SUMOReal area() const
Returns the area (0 for non-closed)
void addRoundabout(const EdgeSet &roundabout)
add user specified roundabout
void setLaneSpreadFunction(LaneSpreadFunction spread)
(Re)sets how the lanes lateral offset shall be computed
int remapIDs(bool numericaIDs, bool reservedIDs)
remap node IDs accoring to options –numerical-ids and –reserved-ids
SUMOReal getMaxGrade() const
return the maximum grade of all segments as a fraction of zRange/length2D
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
const std::vector< Connection > & getConnections() const
Returns the connections.
NBNode * myFrom
The source and the destination node.
NBEdge * getTurnDestination(bool possibleDestination=false) const
const PositionVector & getLaneShape(int i) const
Returns the shape of the nth lane.
bool exists(const std::string &name) const
Returns the information whether the named option is known.
void append(const PositionVector &v, SUMOReal sameThreshold=2.0)
void copyConnectionsFrom(NBEdge *src)
copy connections from antoher edge
bool ignoreFilterMatch(NBEdge *edge)
Returns true if this edge matches one of the removal criteria.
A storage for available types of edges.
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.
int myEdgesSplit
the number of splits of edges during the building
std::set< std::string > myEdges2Remove
Set of ids of edges which shall explicitly be removed.
NBNode * getFromNode() const
Returns the origin node of the edge.