61 #ifdef CHECK_MEMORY_LEAKS
63 #endif // CHECK_MEMORY_LEAKS
71 myVehicleClasses2Keep(0),
72 myVehicleClasses2Remove(0),
88 if (oc.
isSet(
"keep-edges.explicit")) {
89 const std::vector<std::string> edges = oc.
getStringVector(
"keep-edges.explicit");
92 if (oc.
isSet(
"remove-edges.explicit")) {
93 const std::vector<std::string> edges = oc.
getStringVector(
"remove-edges.explicit");
96 if (oc.
exists(
"keep-edges.by-vclass") && oc.
isSet(
"keep-edges.by-vclass")) {
97 const std::vector<std::string> classes = oc.
getStringVector(
"keep-edges.by-vclass");
98 for (std::vector<std::string>::const_iterator i = classes.begin(); i != classes.end(); ++i) {
102 if (oc.
exists(
"remove-edges.by-vclass") && oc.
isSet(
"remove-edges.by-vclass")) {
103 const std::vector<std::string> classes = oc.
getStringVector(
"remove-edges.by-vclass");
104 for (std::vector<std::string>::const_iterator i = classes.begin(); i != classes.end(); ++i) {
108 if (oc.
exists(
"keep-edges.by-type") && oc.
isSet(
"keep-edges.by-type")) {
109 const std::vector<std::string> types = oc.
getStringVector(
"keep-edges.by-type");
112 if (oc.
exists(
"remove-edges.by-type") && oc.
isSet(
"remove-edges.by-type")) {
113 const std::vector<std::string> types = oc.
getStringVector(
"remove-edges.by-type");
117 if (oc.
isSet(
"keep-edges.in-boundary") || oc.
isSet(
"keep-edges.in-geo-boundary")) {
119 "keep-edges.in-boundary" :
"keep-edges.in-geo-boundary");
121 std::vector<SUMOReal> poly;
122 for (std::vector<std::string>::iterator i = polyS.begin(); i != polyS.end(); ++i) {
125 if (poly.size() < 4) {
126 throw ProcessError(
"Invalid boundary: need at least 2 coordinates");
127 }
else if (poly.size() % 2 != 0) {
128 throw ProcessError(
"Invalid boundary: malformed coordinate");
129 }
else if (poly.size() == 4) {
136 for (std::vector<SUMOReal>::iterator j = poly.begin(); j != poly.end();) {
142 if (oc.
isSet(
"keep-edges.in-geo-boundary")) {
151 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
179 if (oc.
exists(
"dismiss-vclasses") && oc.
getBool(
"dismiss-vclasses")) {
241 EdgeCont::const_iterator i =
myEdges.find(
id);
243 if (retrieveExtracted) {
270 hints.push_back(hintedge);
273 for (EdgeVector::iterator i = hints.begin(); i != hints.end(); i++) {
275 for (EdgeVector::iterator j = candidates.begin(); j != candidates.end(); j++) {
276 NBEdge* poss_searched = (*j);
278 ? poss_searched->
myTo : poss_searched->
myFrom;
281 if (find(cont.begin(), cont.end(), hintedge) != cont.end()) {
282 return poss_searched;
297 size_t maxLength = 0;
298 std::string tid =
id +
"[";
299 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
300 if ((*i).first.find(tid) == 0) {
301 maxLength =
MAX2(maxLength, (*i).first.length());
306 std::vector<std::string> names;
307 names.push_back(
id +
"[1]");
308 names.push_back(
id +
"[0]");
309 while (names.size() > 0) {
311 std::string cid = names.back();
317 if (cid.length() + 3 < maxLength) {
318 names.push_back(cid +
"[1]");
319 names.push_back(cid +
"[0]");
356 if (
myEdges.count(newID) != 0) {
357 throw ProcessError(
"Attempt to rename edge using existing id '" + newID +
"'");
375 const std::string& firstEdgeName,
376 const std::string& secondEdgeName,
377 unsigned int noLanesFirstEdge,
unsigned int noLanesSecondEdge) {
388 return splitAt(dc, edge, pos, node, firstEdgeName, secondEdgeName,
389 noLanesFirstEdge, noLanesSecondEdge);
396 const std::string& firstEdgeName,
397 const std::string& secondEdgeName,
398 unsigned int noLanesFirstEdge,
unsigned int noLanesSecondEdge) {
400 std::pair<PositionVector, PositionVector> geoms =
403 geoms.first.pop_back();
408 geoms.second.pop_front();
416 for (
unsigned int i = 0; i < noLanesFirstEdge && i < edge->
getNumLanes(); i++) {
423 for (
unsigned int i = 0; i < noLanesSecondEdge && i < edge->
getNumLanes(); i++) {
437 if (noLanesFirstEdge == noLanesSecondEdge - 1) {
438 for (
unsigned int i = 0; i < one->
getNumLanes(); i++) {
472 std::vector<std::string>
474 std::vector<std::string> ret;
475 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
476 ret.push_back((*i).first);
486 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
487 NBEdge* edge = (*i).second;
491 toRemove.push_back(edge);
494 for (EdgeVector::iterator j = toRemove.begin(); j != toRemove.end(); ++j) {
502 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
503 if ((*i).second->getGeometry().size() < 3) {
506 (*i).second->splitGeometry(*
this, nc);
513 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
514 (*i).second->reduceGeometry(minDist);
521 if (maxAngle > 0 || minRadius > 0) {
522 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
523 (*i).second->checkGeometry(maxAngle, minRadius, fix);
532 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
533 (*i).second->clearControllingTLInformation();
540 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
541 (*i).second->sortOutgoingConnectionsByAngle();
548 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
549 (*i).second->computeEdge2Edges(noLeftMovers);
556 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
557 (*i).second->computeLanes2Edges();
564 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
565 (*i).second->recheckLanes();
572 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
573 (*i).second->appendTurnaround(noTLSControlled);
580 for (std::set<std::string>::const_iterator it = ids.begin(); it != ids.end(); it++) {
581 myEdges[*it]->appendTurnaround(noTLSControlled);
588 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); i++) {
589 (*i).second->computeEdgeShape();
596 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
597 (*i).second->computeLaneShapes();
612 unsigned int nolanes = 0;
618 NBEdge* tpledge = *(edges.begin());
619 NBNode* from = tpledge->getFromNode();
620 NBNode* to = tpledge->getToNode();
621 EdgeVector::const_iterator i;
622 for (i = edges.begin(); i != edges.end(); i++) {
624 assert((*i)->getFromNode() == from);
625 assert((*i)->getToNode() == to);
627 nolanes += (*i)->getNumLanes();
629 if (i != edges.begin()) {
634 speed += (*i)->getSpeed();
636 priority =
MAX2(priority, (*i)->getPriority());
638 speed /= edges.size();
642 NBEdge* newEdge =
new NBEdge(
id, from, to,
"", speed, nolanes, priority,
644 tpledge->getStreetName(), tpledge->myLaneSpreadFunction);
652 for (i = edges.begin(); i != edges.end(); i++) {
654 for (EdgeVector::iterator j = ev.begin(); j != ev.end(); j++) {
659 unsigned int currLane = 0;
660 for (i = edges.begin(); i != edges.end(); i++) {
662 currLane += (*i)->getNumLanes();
666 for (i = edges.begin(); i != edges.end(); i++) {
667 unsigned int noLanes = (*i)->getNumLanes();
668 for (
unsigned int j = 0; j < noLanes; j++, currLane++) {
674 for (i = edges.begin(); i != edges.end(); i++) {
682 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
683 std::string oppositeID;
684 if ((*i).first[0] ==
'-') {
685 oppositeID = (*i).first.substr(1);
687 oppositeID =
"-" + (*i).first;
712 if (from != 0 && to != 0) {
714 WRITE_WARNING(
"Could not insert connection between '" + (*i).from +
"' and '" + (*i).to +
"' after build.");
720 for (EdgeCont::iterator it =
myEdges.begin(); it !=
myEdges.end(); ++it) {
721 NBEdge* edge = it->second;
724 std::vector<NBEdge::Connection> connections = edge->
getConnections();
725 for (std::vector<NBEdge::Connection>::iterator it_con = connections.begin(); it_con != connections.end(); ++it_con) {
739 size_t len =
id.length();
741 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
742 std::string curr = (*i).first;
745 if (curr.length() <= len) {
750 if (curr.substr(0, len) ==
id && curr[len] ==
'[') {
751 ret.push_back((*i).second);
755 size_t pos = curr.find(
id);
757 if (pos == std::string::npos) {
762 if (curr[pos - 1] !=
']' && curr[pos - 1] !=
'+') {
767 if (pos +
id.length() < curr.length()) {
768 if (curr[pos +
id.length()] !=
'[' && curr[pos +
id.length()] !=
'+') {
773 ret.push_back((*i).second);
782 std::set<NBEdge*> candidates;
783 for (EdgeCont::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
787 candidates.insert(e);
792 std::set<NBEdge*> visited;
793 for (std::set<NBEdge*>::const_iterator i = candidates.begin(); i != candidates.end(); ++i) {
800 if (visited.count(e) > 0) {
804 loopEdges.push_back(e);
809 if (edges.size() < 2) {
818 EdgeVector::const_iterator me = find(edges.begin(), edges.end(), e);
827 EdgeVector::const_iterator loopClosed = find(loopEdges.begin(), loopEdges.end(), left);
828 const size_t loopSize = loopEdges.end() - loopClosed;
833 }
else if (loopSize < loopEdges.size()) {
835 EdgeVector(loopEdges.begin() + (loopEdges.size() - loopSize), loopEdges.end()).swap(loopEdges);
839 for (EdgeVector::const_iterator j = loopEdges.begin(); j != loopEdges.end(); ++j) {
840 if ((*j)->getToNode()->getEdges().size() > 2) {
844 if (attachments < 3) {
849 if (visited.count(left) > 0) {
853 loopEdges.push_back(left);
859 std::set<NBEdge*> loopEdgesSet(loopEdges.begin(), loopEdges.end());
860 for (std::set<NBEdge*>::const_iterator j = loopEdgesSet.begin(); j != loopEdgesSet.end(); ++j) {
862 NBNode* node = (*j)->getToNode();
864 for (EdgeVector::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
866 if (loopEdgesSet.count(inEdge) > 0) {
875 (*j)->setJunctionPriority(node, 1000);
877 marked.push_back(loopEdges);
885 for (EdgeCont::iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
SUMOVehicleClass getVehicleClassID(const std::string &name)
Returns the class id of the abstract class given by its name.
std::vector< Lane > myLanes
Lane information.
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.
const std::string & getTypeID() const
A structure which describes a connection between edges or lanes.
void sortOutgoingLanesConnections()
Sorts all lanes of all edges within the container by their direction.
bool myAmLeftHanded
Whether the network is left-handed.
static const SUMOReal UNSPECIFIED_WIDTH
unspecified lane width
A class representing a single street sign.
SUMOReal nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
std::vector< std::string > getAllNames() const
Returns all ids of known edges.
LaneSpreadFunction myLaneSpreadFunction
The information about how to spread the lanes.
static bool transformCoordinates(Position &from, bool includeInBoundary=true, GeoConvHelper *from_srs=0)
transforms loaded coordinates handles projections, offsets (using GeoConvHelper) and import of height...
void addSign(NBSign sign)
NBEdge * toEdge
The edge the connections yields in.
static SUMOReal _2SUMOReal(const E *const data)
A container for traffic light definitions and built programs.
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)
void moveOutgoingConnectionsFrom(NBEdge *e, unsigned int laneOff)
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.
A container for districts.
bool addLane2LaneConnection(unsigned int fromLane, NBEdge *dest, unsigned int toLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false)
Adds a connection between the specified this edge's lane and an approached one.
void clearControllingTLInformation() const
Clears information about controlling traffic lights for all connenections of all edges.
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.
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)
unsigned int myEdgesSplit
the number of splits of edges during the building
static const SUMOReal UNSPECIFIED_OFFSET
unspecified lane offset
void computeLanes2Edges()
Computes for each edge which lanes approach the next edges.
std::vector< PostProcessConnection > myConnections
The list of connections to recheck.
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
void checkGeometries(const SUMOReal maxAngle, const SUMOReal minRadius, bool fix)
void guessRoundabouts(std::vector< EdgeVector > &marked)
Determines which edges belong to roundabouts and increases their priority.
NBEdgeCont(NBTypeCont &tc)
Constructor.
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges.
const std::string & getID() const
Returns the id.
SUMOReal mySpeed
The maximal speed.
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.
static SUMOReal nearest_offset_on_line_to_point2D(const Position &l1, const Position &l2, const Position &p, bool perpendicular=true)
SVCPermissions myVehicleClasses2Keep
Set of vehicle types which must be allowed on edges in order to keep them.
const Position & getPosition() const
Returns the position of this node.
void reduceGeometries(const SUMOReal minDist)
Lanes to lanes - relationships are loaded; no recheck is necessary/wished.
int getPriority() const
Returns the priority of the edge.
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
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.
unsigned int getNumLanes() const
Returns the number of lanes.
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.
void setLeftHanded()
Marks this edge to be left-handed.
const EdgeVector & getEdges() const
Returns all edges which participate in this node.
SUMOReal myLaneWidth
This width of this edge's lanes.
void splitGeometry(NBNodeCont &nc)
Splits edges into multiple if they have a complex geometry.
EdgeCont myEdges
The instance of the dictionary (id->edge)
SUMOReal myOffset
This edges's offset to the intersection begin (will be applied to all lanes)
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.
void removeFromConnections(NBEdge *toEdge, int fromLane=-1, int toLane=-1, bool tryLater=false)
Removes the specified connection(s)
NBEdge * getConnectionTo(NBNode *n) const
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.
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.
void push_back(const PositionVector &p)
Appends all positions from the given vector.
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
void replaceOutgoing(NBEdge *which, NBEdge *by, unsigned int laneOff)
Replaces occurences of the first edge within the list of outgoing by the second Connections are remap...
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
void appendTurnarounds(bool noTLSControlled)
Appends turnarounds to all edges stored in the container.
std::vector< NBEdge * > EdgeVector
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)
void erase(NBDistrictCont &dc, NBEdge *edge)
Removes the given edge from the container (deleting it)
std::string myType
The type of the edge.
A structure representing a connection between two lanes.
SUMOReal getLaneSpeed(unsigned int lane) const
void computeEdgeShapes()
Computes the shapes of all edges stored in the container.
The connection was computed.
Represents a single node (junction) during network building.
void dismissVehicleClassInformation()
NBTypeCont & myTypeCont
The network builder; used to obtain type information.
void recheckLaneSpread()
Rechecks whether the lane spread is proper.
NBEdge * getTurnDestination() const
static SUMOReal relAngle(SUMOReal angle1, SUMOReal angle2)
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.
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.
NBEdge * retrievePossiblySplit(const std::string &id, const std::string &hint, bool incoming) const
Tries to retrieve an edge, even if it is splitted.
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
const std::string & getStreetName() const
Returns the street name of this edge.
const std::vector< Connection > & getConnections() const
Returns the connections.
void addPostProcessConnection(const std::string &from, int fromLane, const std::string &to, int toLane, bool mayDefinitelyPass)
Adds a connection which could not be set during loading.
NBNode * myFrom
The source and the destination node.
bool exists(const std::string &name) const
Returns the information whether the named option is known.
void copyConnectionsFrom(NBEdge *src)
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.
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.