62 if (!oc.
isSet(
"output-file")) {
66 std::map<SumoXMLAttr, std::string> attrs;
71 const int cornerDetail = oc.
getInt(
"junctions.corner-detail");
72 if (cornerDetail > 0) {
75 if (!oc.
isDefault(
"junctions.internal-link-detail")) {
78 if (oc.
getBool(
"rectangular-lane-cut")) {
98 bool origNames = oc.
getBool(
"output.original-names");
99 if (!oc.
getBool(
"no-internal-links")) {
101 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
110 bool noNames = !oc.
getBool(
"output.street-names");
111 for (std::map<std::string, NBEdge*>::const_iterator i = ec.
begin(); i != ec.
end(); ++i) {
112 writeEdge(device, *(*i).second, noNames, origNames);
120 std::set<NBNode*> roundaboutNodes;
121 const bool checkLaneFoesAll = oc.
getBool(
"check-lane-foes.all");
122 const bool checkLaneFoesRoundabout = !checkLaneFoesAll && oc.
getBool(
"check-lane-foes.roundabout");
123 if (checkLaneFoesRoundabout) {
125 for (std::set<EdgeSet>::const_iterator i = roundabouts.begin(); i != roundabouts.end(); ++i) {
126 for (EdgeSet::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
127 roundaboutNodes.insert((*j)->getToNode());
131 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
132 const bool checkLaneFoes = checkLaneFoesAll || (checkLaneFoesRoundabout && roundaboutNodes.count((*i).second) > 0);
136 const bool includeInternal = !oc.
getBool(
"no-internal-links");
137 if (includeInternal) {
140 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
149 int numConnections = 0;
150 for (std::map<std::string, NBEdge*>::const_iterator it_edge = ec.
begin(); it_edge != ec.
end(); it_edge++) {
151 NBEdge* from = it_edge->second;
152 const std::vector<NBEdge::Connection> connections = from->
getConnections();
153 numConnections += (int)connections.size();
154 for (std::vector<NBEdge::Connection>::const_iterator it_c = connections.begin(); it_c != connections.end(); it_c++) {
158 if (numConnections > 0) {
161 if (includeInternal) {
164 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
171 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
172 NBNode* node = (*i).second;
174 std::vector<NBNode::Crossing*> crossings = node->
getCrossings();
175 for (
auto c : crossings) {
179 const std::vector<NBNode::WalkingArea>& WalkingAreas = node->
getWalkingAreas();
180 for (std::vector<NBNode::WalkingArea>::const_iterator it = WalkingAreas.begin(); it != WalkingAreas.end(); it++) {
181 if ((*it).nextCrossing !=
"") {
189 if (nextCrossing.
tlID !=
"") {
199 for (std::vector<std::string>::const_iterator it_sw = (*it).nextSidewalks.begin(); it_sw != (*it).nextSidewalks.end(); ++it_sw) {
202 for (std::vector<std::string>::const_iterator it_sw = (*it).prevSidewalks.begin(); it_sw != (*it).prevSidewalks.end(); ++it_sw) {
209 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
217 for (std::map<std::string, NBDistrict*>::const_iterator i = dc.
begin(); i != dc.
end(); i++) {
220 if (dc.
size() != 0) {
235 assert(succOpp != 0);
236 assert(predOpp != 0);
237 const std::vector<NBEdge::Connection>& connections = succOpp->
getConnections();
238 for (std::vector<NBEdge::Connection>::const_iterator it_c = connections.begin(); it_c != connections.end(); it_c++) {
240 if (succOpp != from &&
242 predOpp == conOpp.
toEdge &&
260 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
261 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
262 if (elv.size() > 0) {
263 bool haveVia =
false;
264 std::string edgeID =
"";
265 std::string internalEdgeID =
"";
267 std::map<std::string, double> lengthSum;
268 std::map<std::string, int> numLanes;
269 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
271 numLanes[(*k).id] += 1;
274 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
275 if ((*k).toEdge == 0) {
279 if (edgeID != (*k).id) {
280 internalEdgeID = (*k).id;
293 const NBEdge::Lane& successor = (*k).toEdge->getLanes()[(*k).toLane];
294 const double length = lengthSum[edgeID] / numLanes[edgeID];
298 writeLane(into, (*k).getInternalLaneID(), (*k).vmax,
302 haveVia = haveVia || (*k).haveVia;
308 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
312 if ((*k).toEdge == 0) {
316 const NBEdge::Lane& successor = (*k).toEdge->getLanes()[(*k).toLane];
323 0, origNames,
"", &n);
340 const std::vector<NBNode::WalkingArea>& WalkingAreas = n.
getWalkingAreas();
341 for (std::vector<NBNode::WalkingArea>::const_iterator it = WalkingAreas.begin(); it != WalkingAreas.end(); it++) {
381 const std::vector<NBEdge::Lane>& lanes = e.
getLanes();
384 for (
int i = 0; i < (int) lanes.size(); i++) {
399 const std::string& origID,
double length,
int index,
bool origNames,
400 const std::string& oppositeID,
const NBNode* node,
bool accelRamp,
bool customShape) {
412 WRITE_WARNING(
"Lane '" + lID +
"' has a maximum allowed speed of 0.");
413 }
else if (speed < 0) {
414 throw ProcessError(
"Negative allowed speed (" +
toString(speed) +
") on lane '" + lID +
"', use --speed.minimum to prevent this.");
417 length = length - endOffset;
432 NBNode::CustomShapeMap::const_iterator it = cs.find(lID);
433 if (it != cs.end()) {
437 }
else if (customShape) {
442 if (oppositeID !=
"" && oppositeID !=
"-") {
447 if (origNames && origID !=
"") {
465 std::string incLanes;
467 for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); ++i) {
468 int noLanes = (*i)->getNumLanes();
469 for (
int j = 0; j < noLanes; j++) {
470 incLanes += (*i)->getLaneID(j);
471 if (i != incoming.end() - 1 || j < noLanes - 1) {
476 std::vector<NBNode::Crossing*> crossings = n.
getCrossings();
477 for (
auto c : crossings) {
478 incLanes +=
' ' + c->prevWalkingArea +
"_0";
482 std::string intLanes;
485 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
486 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
487 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
488 if ((*k).toEdge == 0) {
495 intLanes += (*k).getInternalLaneID();
497 intLanes += (*k).viaID +
"_0";
504 for (
auto c : crossings) {
505 intLanes +=
' ' + c->id +
"_0";
534 std::vector<std::string> internalLaneIDs;
535 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
536 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
537 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
538 if ((*k).toEdge != 0) {
539 internalLaneIDs.push_back((*k).getInternalLaneID());
544 internalLaneIDs.push_back(c->id +
"_0");
547 for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
548 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
549 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
550 if ((*k).toEdge == 0 || !(*k).haveVia) {
557 std::string incLanes = (*k).getInternalLaneID();
558 if ((*k).foeIncomingLanes.length() != 0) {
559 incLanes +=
" " + (*k).foeIncomingLanes;
562 const std::vector<int>& foes = (*k).foeInternalLinks;
563 std::vector<std::string> foeIDs;
564 for (std::vector<int>::const_iterator it = foes.begin(); it != foes.end(); ++it) {
565 foeIDs.push_back(internalLaneIDs[*it]);
597 if (style !=
PLAIN) {
598 if (includeInternal) {
625 for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); ++i) {
627 const std::vector<NBEdge::Connection>& connections = from->
getConnections();
628 for (std::vector<NBEdge::Connection>::const_iterator j = connections.begin(); j != connections.end(); ++j) {
648 const std::string& from,
const std::string& to,
649 int fromLane,
int toLane,
const std::string& via) {
668 std::vector<std::vector<std::string> > edgeIDs;
669 for (std::set<EdgeSet>::const_iterator i = roundabouts.begin(); i != roundabouts.end(); ++i) {
670 std::vector<std::string> tEdgeIDs;
671 for (EdgeSet::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
674 tEdgeIDs.push_back((*j)->getID());
676 std::sort(tEdgeIDs.begin(), tEdgeIDs.end());
677 edgeIDs.push_back(tEdgeIDs);
679 std::sort(edgeIDs.begin(), edgeIDs.end());
681 for (std::vector<std::vector<std::string> >::const_iterator i = edgeIDs.begin(); i != edgeIDs.end(); ++i) {
684 if (roundabouts.size() != 0) {
693 std::vector<std::string> validEdgeIDs;
694 std::vector<std::string> invalidEdgeIDs;
695 std::vector<std::string> nodeIDs;
696 for (std::vector<std::string>::const_iterator i = edgeIDs.begin(); i != edgeIDs.end(); ++i) {
700 validEdgeIDs.push_back(edge->
getID());
702 invalidEdgeIDs.push_back(*i);
705 std::sort(nodeIDs.begin(), nodeIDs.end());
706 if (validEdgeIDs.size() > 0) {
711 if (invalidEdgeIDs.size() > 0) {
713 +
joinToString(invalidEdgeIDs,
" ") +
"' no longer exist'");
732 for (
int i = 0; i < (int)sources.size(); i++) {
739 for (
int i = 0; i < (int)sinks.size(); i++) {
752 if (time == std::floor(time)) {
762 for (NBConnectionProhibits::const_iterator j = prohibitions.begin(); j != prohibitions.end(); j++) {
765 for (NBConnectionVector::const_iterator k = prohibiting.begin(); k != prohibiting.end(); k++) {
784 std::vector<NBTrafficLightLogic*> logics = tllCont.
getComputed();
785 for (std::vector<NBTrafficLightLogic*>::iterator it = logics.begin(); it != logics.end(); it++) {
792 (*it)->writeParams(into);
794 const bool varPhaseLength = (*it)->getType() !=
TLTYPE_STATIC;
795 const std::vector<NBTrafficLightLogic::PhaseDefinition>& phases = (*it)->getPhases();
796 for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator j = phases.begin(); j != phases.end(); ++j) {
800 if (varPhaseLength) {
812 if (logics.size() > 0) {
static void writeRoundabout(OutputDevice &into, const std::vector< std::string > &r, const NBEdgeCont &ec)
Writes a roundabout.
std::string id
id of Connection
The information about how to spread the lanes from the given position.
int tlLinkNo
The index of this connection within the controlling traffic light.
void writePermissions(OutputDevice &into, SVCPermissions permissions)
writes allowed disallowed attributes if needed;
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
void close()
Closes the device and removes it from the dictionary.
static void writeLocation(OutputDevice &into)
writes the location element
const std::string & getTypeID() const
get ID of type
bool getKeepClear() const
Returns the keepClear flag.
A structure which describes a connection between edges or lanes.
int toLane
The lane the connections yields in.
a list of node ids, used for controlling joining
NBTypeCont & getTypeCont()
Returns a reference to the type container.
Whether vehicles must keep the junction clear.
PositionVector shape
The lane's shape.
whether a given shape is user-defined
a source within a district (connection road)
static void writeDistrict(OutputDevice &into, const NBDistrict &d)
Writes a district.
const std::vector< double > & getSourceWeights() const
Returns the weights of the sources.
std::string viaID
if Connection have a via, ID of it
NBEdge * toEdge
The edge the connections yields in.
bool hasDefaultGeometry() const
Returns whether the geometry consists only of the node positions.
begin/end of the description of a junction
begin/end of the description of a single lane
static const double UNSPECIFIED_VISIBILITY_DISTANCE
unspecified foe visibility for connections
const std::set< EdgeSet > getRoundabouts() const
Returns the determined roundabouts.
static void writeLane(OutputDevice &into, const std::string &lID, double speed, SVCPermissions permissions, SVCPermissions preferred, double endOffset, double width, PositionVector shape, const std::string &origID, double length, int index, bool origNames, const std::string &oppositeID, const NBNode *node=0, bool accelRamp=false, bool customShape=false)
Writes a lane (<lane ...) of an edge.
double getLoadedLength() const
Returns the length was set explicitly or the computed length if it wasn't set.
A container for traffic light definitions and built programs.
a traffic assignment zone
static bool writeInternalEdges(OutputDevice &into, const NBEdgeCont &ec, const NBNode &n, bool origNames)
Writes internal edges (<edge ... with id[0]==':') of the given node.
void writePreferences(OutputDevice &into, SVCPermissions preferred)
writes allowed disallowed attributes if needed;
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
connectio between two lanes
double length
This lane's width.
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
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.
foe visibility distance of a link
static void writeProhibitions(OutputDevice &into, const NBConnectionProhibits &prohibitions)
writes the given prohibitions
static const double UNSPECIFIED_RADIUS
unspecified lane width
const std::vector< NBEdge * > & getSinkEdges() const
Returns the sinks.
A container for districts.
static const double UNSPECIFIED_OFFSET
unspecified lane offset
link,node: the traffic light id responsible for this link
static const SUMOTime UNSPECIFIED_DURATION
bool hasCustomShape() const
return whether the shape was set by the user
bool mayDefinitelyPass
Information about being definitely free to drive (on-ramps)
double endOffset
This lane's offset to the intersection begin.
double visibility
custom foe visiblity for connection
std::string id
the (edge)-id of this walkingArea
maximum duration of a phase
const SVCPermissions SVCAll
all VClasses are allowed
static void writeTrafficLights(OutputDevice &into, const NBTrafficLightLogicCont &tllCont)
writes the traffic light logics to the given device
static void writeInternalConnection(OutputDevice &into, const std::string &from, const std::string &to, int fromLane, int toLane, const std::string &via)
Writes a single internal connection.
NBEdge * getFrom() const
returns the from-edge (start of the connection)
static std::string getOppositeInternalID(const NBEdgeCont &ec, const NBEdge *from, const NBEdge::Connection &con)
retrieve the id of the opposite direction internal lane if it exists
static const double UNSPECIFIED_WIDTH
unspecified lane width
prohibition of circulation between two edges
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
bool accelRamp
Whether this lane is an acceleration lane.
bool priority
whether the pedestrians have priority
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)...
The link is a straight direction.
PositionVector shape
shape of Connection
A class representing a single district.
bool keepClear
whether the junction must be kept clear when using this connection
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
std::map< std::string, PositionVector > CustomShapeMap
map for custon shapes
static std::string prohibitionConnection(const NBConnection &c)
the attribute value for a prohibition
An (internal) definition of a single lane of an edge.
const std::string & getID() const
Returns the id.
SVCPermissions permissions
List of vehicle types that are allowed on this lane.
static void writeNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Writes the network into a SUMO-file.
const Position & getPosition() const
The turning radius at an intersection in m.
std::map< std::string, NBEdge * >::const_iterator end() const
Returns the pointer to the end of the stored edges.
int getPriority() const
Returns the priority of the edge.
PositionVector simplified() const
return the same shape with intermediate colinear points removed
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
std::map< std::string, NBDistrict * >::const_iterator begin() const
Returns the pointer to the begin of the stored districts.
const std::vector< NBEdge * > & getSourceEdges() const
Returns the sources.
std::string tlID
The id of the traffic light that controls this connection.
SVCPermissions preferred
List of vehicle types that are preferred on this lane.
std::string getInternalLaneID() const
get ID of internal lane
This is an uncontrolled, minor link, has to brake.
static bool writeInternalConnections(OutputDevice &into, const NBNode &n)
Writes inner connections within the node.
int fromLane
The lane the connections starts at.
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >())
Writes an XML header with optional configuration.
A point in 2D or 3D with translation and scaling methods.
parameter associated to a certain key
std::map< std::string, NBDistrict * >::const_iterator end() const
Returns the pointer to the end of the stored districts.
Crossing * getCrossing(const std::string &id) const
return the crossing with the given id
NBEdgeCont & getEdgeCont()
static const double UNSPECIFIED_CONTPOS
unspecified internal junction position
SumoXMLNodeType getType() const
Returns the type of this node.
static void writeEdge(OutputDevice &into, const NBEdge &e, bool noNames, bool origNames)
Writes an edge (<edge ...)
bool hasLoadedLength() const
Returns whether a length was set explicitly.
const PositionVector & getShape() const
Returns the shape.
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic, in MSLink and GNEInternalLane.
double length() const
Returns the length.
roundabout defined in junction
Storage for edges, including some functionality operating on multiple edges.
const CustomShapeMap & getCustomLaneShapes() const
sets a custom shape for an internal lane
LinkState getLinkState(const NBEdge *incoming, NBEdge *outgoing, int fromLane, int toLane, bool mayDefinitelyPass, const std::string &tlID) const
get link state
static void writePositionLong(const Position &pos, OutputDevice &dev)
Writes the given position to device in long format (one attribute per dimension)
edge: the shape in xml-definition
std::vector< NBTrafficLightLogic * > getComputed() const
Returns a list of all computed logics.
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
begin/end of the description of a neighboring lane
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
const PositionVector & getShape() const
retrieve the junction shape
static std::string escapeXML(const std::string &orig, const bool maskDoubleHyphen=false)
Replaces the standard escapes by their XML entities.
double speed
The speed allowed on this lane.
double width
This lane's width.
std::vector< NBConnection > NBConnectionVector
Definition of a connection vector.
begin/end of the description of an edge
static void normaliseSum(std::vector< T > &v, T msum=1.0)
void writeTypes(OutputDevice &into) const
writes all types a s XML
std::string origID
An original ID, if given.
int internalLaneIndex
The lane index of this internal lane within the internal edge.
std::map< std::string, NBEdge * >::const_iterator begin() const
Returns the pointer to the begin of the stored edges.
NBNode * getToNode() const
Returns the destination node of the edge.
std::map< NBConnection, NBConnectionVector > NBConnectionProhibits
Definition of a container for connection block dependencies Includes a list of all connections which ...
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
std::string oppositeID
An opposite lane ID, if given.
a sink within a district (connection road)
the edges crossed by a pedestrian crossing
NBNodeCont & getNodeCont()
Returns a reference to the node container.
Instance responsible for building networks.
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
int tlLinkNo
the traffic light index of this crossing (if controlled)
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
static bool writeInternalNodes(OutputDevice &into, const NBNode &n)
Writes internal junctions (<junction with id[0]==':' ...) of the given node.
const PositionVector & getGeometry() const
Returns the geometry of the edge.
double getFinalLength() const
get length that will be assigned to the lanes in the final network
A definition of a pedestrian walking area.
double contPos
custom position for internal junction on this connection
bool isMacroscopicConnector() const
Returns whether this edge was marked as a macroscopic connector.
A storage for options typed value containers)
const std::vector< double > & getSinkWeights() const
Returns the weights of the sinks.
This is an uncontrolled, major link, may pass.
NBTrafficLightLogicCont & getTLLogicCont()
Returns a reference to the traffic light logics container.
const std::string SUMO_PARAM_ORIGID
double getRadius() const
Returns the turning radius of this node.
NBEdge * getTo() const
returns the to-edge (end of the connection)
The abstract direction of a link.
LaneSpreadFunction getLaneSpreadFunction() const
Returns how this edge's lanes' lateral offset is computed.
Represents a single node (junction) during network building.
A definition of a pedestrian crossing.
PositionVector getSubpart(double beginOffset, double endOffset) const
get subpart of a position vector
Static storage of an output device and its base (abstract) implementation.
bool closeTag()
Closes the most recently opened tag.
static void writeJunction(OutputDevice &into, const NBNode &n, const bool checkLaneFoes)
Writes a junction (<junction ...)
bool writeLogic(OutputDevice &into, const bool checkLaneFoes) const
writes the XML-representation of the logic as a bitset-logic XML representation
link: the index of the link within the traffic light
std::string tlID
The id of the traffic light that controls this connection.
std::string getLaneID(int lane) const
get Lane ID (Secure)
Container for nodes during the netbuilding process.
bool haveVia
check if Connection have a Via
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
std::vector< Crossing * > getCrossings() const
return this junctions pedestrian crossings
const std::vector< WalkingArea > & getWalkingAreas() const
return this junctions pedestrian walking areas
NBDistrictCont & getDistrictCont()
Returns a reference the districts container.
const std::string & getStreetName() const
Returns the street name of this edge.
PositionVector customShape
A custom shape for this lane set by the user.
const std::vector< Connection > & getConnections() const
Returns the connections.
static const std::string MAJOR_VERSION
The version number for written files.
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
static void writeRoundabouts(OutputDevice &into, const std::set< EdgeSet > &roundabouts, const NBEdgeCont &ec)
Writes roundabouts.
int size() const
Returns the number of districts inside the container.
a single phase description
static std::string writeSUMOTime(SUMOTime time)
writes a SUMOTime as int if possible, otherwise as a float
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
void lf()
writes a line feed if applicable
const SVCPermissions SVC_UNSPECIFIED
permissions not specified
static void writeConnection(OutputDevice &into, const NBEdge &from, const NBEdge::Connection &c, bool includeInternal, ConnectionStyle style=SUMONET)
Writes connections outgoing from the given edge (also used in NWWriter_XML)
PositionVector shape
The polygonal shape.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
The link has no direction (is a dead end link)
double width
This lane's width.
NBNode * getFromNode() const
Returns the origin node of the edge.