51 #ifdef CHECK_MEMORY_LEAKS 53 #endif // CHECK_MEMORY_LEAKS 66 if (!oc.
isSet(
"output-file")) {
71 const int cornerDetail = oc.
getInt(
"junctions.corner-detail");
72 const int linkDetail = oc.
getInt(
"junctions.internal-link-detail");
73 const std::string junctionCornerDetail = (cornerDetail > 0
75 const std::string junctionLinkDetail = (oc.
isDefault(
"junctions.internal-link-detail") ?
"" :
78 " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo.dlr.de/xsd/net_file.xsd\"");
92 bool origNames = oc.
getBool(
"output.original-names");
93 if (!oc.
getBool(
"no-internal-links")) {
95 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
104 bool noNames = !oc.
getBool(
"output.street-names");
105 for (std::map<std::string, NBEdge*>::const_iterator i = ec.
begin(); i != ec.
end(); ++i) {
106 writeEdge(device, *(*i).second, noNames, origNames);
114 std::set<NBNode*> roundaboutNodes;
115 const bool checkLaneFoesAll = oc.
getBool(
"check-lane-foes.all");
116 const bool checkLaneFoesRoundabout = !checkLaneFoesAll && oc.
getBool(
"check-lane-foes.roundabout");
117 if (checkLaneFoesRoundabout) {
119 for (std::set<EdgeSet>::const_iterator i = roundabouts.begin(); i != roundabouts.end(); ++i) {
120 for (EdgeSet::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
121 roundaboutNodes.insert((*j)->getToNode());
125 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
126 const bool checkLaneFoes = checkLaneFoesAll || (checkLaneFoesRoundabout && roundaboutNodes.count((*i).second) > 0);
130 const bool includeInternal = !oc.
getBool(
"no-internal-links");
131 if (includeInternal) {
134 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
143 unsigned int numConnections = 0;
144 for (std::map<std::string, NBEdge*>::const_iterator it_edge = ec.
begin(); it_edge != ec.
end(); it_edge++) {
145 NBEdge* from = it_edge->second;
147 const std::vector<NBEdge::Connection> connections = from->
getConnections();
148 numConnections += (
unsigned int)connections.size();
149 for (std::vector<NBEdge::Connection>::const_iterator it_c = connections.begin(); it_c != connections.end(); it_c++) {
153 if (numConnections > 0) {
156 if (includeInternal) {
159 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
166 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
167 NBNode* node = (*i).second;
169 const std::vector<NBNode::Crossing>& crossings = node->
getCrossings();
170 for (std::vector<NBNode::Crossing>::const_iterator it = crossings.begin(); it != crossings.end(); it++) {
174 const std::vector<NBNode::WalkingArea>& WalkingAreas = node->
getWalkingAreas();
175 for (std::vector<NBNode::WalkingArea>::const_iterator it = WalkingAreas.begin(); it != WalkingAreas.end(); it++) {
176 if ((*it).nextCrossing !=
"") {
194 for (std::vector<std::string>::const_iterator it_sw = (*it).nextSidewalks.begin(); it_sw != (*it).nextSidewalks.end(); ++it_sw) {
197 for (std::vector<std::string>::const_iterator it_sw = (*it).prevSidewalks.begin(); it_sw != (*it).prevSidewalks.end(); ++it_sw) {
204 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
212 for (std::map<std::string, NBDistrict*>::const_iterator i = dc.
begin(); i != dc.
end(); i++) {
215 if (dc.
size() != 0) {
226 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
227 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
228 if (elv.size() > 0) {
229 bool haveVia =
false;
231 std::string internalEdgeID =
"";
233 std::map<NBEdge*, SUMOReal> lengthSum;
234 std::map<NBEdge*, int> numLanes;
235 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
237 numLanes[(*k).toEdge] += 1;
240 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
241 if ((*k).toEdge == 0) {
245 if (toEdge != (*k).toEdge) {
246 internalEdgeID = (*k).id;
251 toEdge = (*k).toEdge;
259 const NBEdge::Lane& successor = (*k).toEdge->getLanes()[(*k).toLane];
260 const SUMOReal length = lengthSum[toEdge] / numLanes[toEdge];
264 writeLane(into, internalEdgeID, (*k).getInternalLaneID(), (*k).vmax,
267 length, (*k).internalLaneIndex, origNames, &n);
268 haveVia = haveVia || (*k).haveVia;
274 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
278 if ((*k).toEdge == 0) {
282 const NBEdge::Lane& successor = (*k).toEdge->getLanes()[(*k).toLane];
296 const std::vector<NBNode::Crossing>& crossings = n.
getCrossings();
297 for (std::vector<NBNode::Crossing>::const_iterator it = crossings.begin(); it != crossings.end(); it++) {
307 const std::vector<NBNode::WalkingArea>& WalkingAreas = n.
getWalkingAreas();
308 for (std::vector<NBNode::WalkingArea>::const_iterator it = WalkingAreas.begin(); it != WalkingAreas.end(); it++) {
348 const std::vector<NBEdge::Lane>& lanes = e.
getLanes();
361 for (
unsigned int i = 0; i < (
unsigned int) lanes.size(); i++) {
365 length, i, origNames);
376 const std::string& origID,
SUMOReal length,
unsigned int index,
bool origNames,
390 }
else if (speed < 0) {
394 length = length - endOffset;
406 NBNode::CustomShapeMap::const_iterator it = cs.find(lID);
407 if (it != cs.end()) {
414 if (origNames && origID !=
"") {
433 std::string incLanes;
435 for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); ++i) {
436 unsigned int noLanes = (*i)->getNumLanes();
437 for (
unsigned int j = 0; j < noLanes; j++) {
438 incLanes += (*i)->getLaneID(j);
439 if (i != incoming.end() - 1 || j < noLanes - 1) {
444 const std::vector<NBNode::Crossing>& crossings = n.
getCrossings();
445 for (std::vector<NBNode::Crossing>::const_iterator it = crossings.begin(); it != crossings.end(); it++) {
446 incLanes +=
' ' + (*it).prevWalkingArea +
"_0";
450 std::string intLanes;
453 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
454 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
455 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
456 if ((*k).toEdge == 0) {
463 intLanes += (*k).getInternalLaneID();
465 intLanes += (*k).viaID +
"_0";
472 for (std::vector<NBNode::Crossing>::const_iterator it = crossings.begin(); it != crossings.end(); it++) {
473 intLanes +=
' ' + (*it).id +
"_0";
502 std::vector<std::string> internalLaneIDs;
503 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
504 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
505 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
506 if ((*k).toEdge != 0) {
507 internalLaneIDs.push_back((*k).getInternalLaneID());
511 const std::vector<NBNode::Crossing>& crossings = n.
getCrossings();
512 for (std::vector<NBNode::Crossing>::const_iterator it_c = crossings.begin(); it_c != crossings.end(); ++it_c) {
513 internalLaneIDs.push_back((*it_c).id +
"_0");
516 for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
517 const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
518 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
519 if ((*k).toEdge == 0 || !(*k).haveVia) {
526 std::string incLanes = (*k).getInternalLaneID();
527 if ((*k).foeIncomingLanes.length() != 0) {
528 incLanes +=
" " + (*k).foeIncomingLanes;
531 const std::vector<unsigned int>& foes = (*k).foeInternalLinks;
532 std::vector<std::string> foeIDs;
533 for (std::vector<unsigned int>::const_iterator it = foes.begin(); it != foes.end(); ++it) {
534 foeIDs.push_back(internalLaneIDs[*it]);
563 if (style !=
PLAIN) {
564 if (includeInternal) {
591 for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); ++i) {
593 const std::vector<NBEdge::Connection>& connections = from->
getConnections();
594 for (std::vector<NBEdge::Connection>::const_iterator j = connections.begin(); j != connections.end(); ++j) {
614 const std::string& from,
const std::string& to,
615 int fromLane,
int toLane,
const std::string& via) {
634 std::vector<std::vector<std::string> > edgeIDs;
635 for (std::set<EdgeSet>::const_iterator i = roundabouts.begin(); i != roundabouts.end(); ++i) {
636 std::vector<std::string> tEdgeIDs;
637 for (EdgeSet::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
640 tEdgeIDs.push_back((*j)->getID());
642 std::sort(tEdgeIDs.begin(), tEdgeIDs.end());
643 edgeIDs.push_back(tEdgeIDs);
645 std::sort(edgeIDs.begin(), edgeIDs.end());
647 for (std::vector<std::vector<std::string> >::const_iterator i = edgeIDs.begin(); i != edgeIDs.end(); ++i) {
650 if (roundabouts.size() != 0) {
659 std::vector<std::string> validEdgeIDs;
660 std::vector<std::string> invalidEdgeIDs;
661 std::vector<std::string> nodeIDs;
662 for (std::vector<std::string>::const_iterator i = edgeIDs.begin(); i != edgeIDs.end(); ++i) {
666 validEdgeIDs.push_back(edge->
getID());
668 invalidEdgeIDs.push_back(*i);
671 std::sort(nodeIDs.begin(), nodeIDs.end());
672 if (validEdgeIDs.size() > 0) {
677 if (invalidEdgeIDs.size() > 0) {
679 +
joinToString(invalidEdgeIDs,
" ") +
"' no longer exist'");
699 for (i = 0; i < sources.size(); i++) {
706 for (i = 0; i < sinks.size(); i++) {
719 if (time == std::floor(time)) {
729 for (NBConnectionProhibits::const_iterator j = prohibitions.begin(); j != prohibitions.end(); j++) {
732 for (NBConnectionVector::const_iterator k = prohibiting.begin(); k != prohibiting.end(); k++) {
751 std::vector<NBTrafficLightLogic*> logics = tllCont.
getComputed();
752 for (std::vector<NBTrafficLightLogic*>::iterator it = logics.begin(); it != logics.end(); it++) {
759 const std::map<std::string, std::string>& params = (*it)->getMap();
760 for (std::map<std::string, std::string>::const_iterator i = params.begin(); i != params.end(); ++i) {
767 const std::vector<NBTrafficLightLogic::PhaseDefinition>& phases = (*it)->getPhases();
768 for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator j = phases.begin(); j != phases.end(); ++j) {
776 if (logics.size() > 0) {
static void writeRoundabout(OutputDevice &into, const std::vector< std::string > &r, const NBEdgeCont &ec)
Writes a roundabout.
The information about how to spread the lanes from the given position.
void writePermissions(OutputDevice &into, SVCPermissions permissions)
writes allowed disallowed attributes if needed;
PositionVector cutAtIntersection(const PositionVector &old) const
cut shape at the intersection shapes
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges.
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
SUMOReal endOffset
This lane's offset to the intersection begin.
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.
Position getCenter() const
Returns a position that is guaranteed to lie within the node shape.
a list of node ids, used for controlling joining
static const SUMOReal UNSPECIFIED_WIDTH
unspecified lane width
NBTypeCont & getTypeCont()
Returns the type container.
Whether vehicles must keep the junction clear.
PositionVector shape
The lane's shape.
whether a given shape is user-defined
static void writeDistrict(OutputDevice &into, const NBDistrict &d)
Writes a district.
NBEdge * toEdge
The edge the connections yields in.
bool hasDefaultGeometry() const
Returns whether the geometry consists only of the node positions.
SUMOReal getRadius() const
Returns the turning radius of this node.
const std::set< EdgeSet > getRoundabouts() const
Returns the determined roundabouts.
size_t size() const
Returns the number of districts inside the container.
A container for traffic light definitions and built programs.
SUMOReal length
This lane's width.
SUMOReal width
This lane's width.
bool isTLControlled() const
Returns whether this node is controlled by any tls.
void writePreferences(OutputDevice &into, SVCPermissions preferred)
writes allowed disallowed attributes if needed;
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
const Crossing & getCrossing(const std::string &id) const
return the crossing with the given id
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.
static std::string escapeXML(const std::string &orig)
Replaces the standard escapes by their XML entities.
static void writeProhibitions(OutputDevice &into, const NBConnectionProhibits &prohibitions)
writes the given prohibitions
const std::vector< NBEdge * > & getSinkEdges() const
Returns the sinks.
A container for districts.
const std::vector< Crossing > & getCrossings() const
return this junctions pedestrian crossings
the weight of a district's source or sink
bool hasCustomShape() const
return whether the shape was set by the user
bool mayDefinitelyPass
Information about being definitely free to drive (on-ramps)
std::string id
the (edge)-id of this walkingArea
static const SUMOReal UNSPECIFIED_CONTPOS
unspecified internal junction position
const SVCPermissions SVCAll
static void writeTrafficLights(OutputDevice &into, const NBTrafficLightLogicCont &tllCont)
writes the traffic light logics to the given device
static const SUMOReal UNSPECIFIED_OFFSET
unspecified lane offset
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)
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
bool priority
whether the pedestrians have priority
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)...
bool writeXMLHeader(const std::string &rootElement, const std::string &attrs="", const std::string &comment="")
Writes an XML header with optional configuration.
The link is a straight direction.
SUMOReal speed
The speed allowed on this lane.
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
static std::string prohibitionConnection(const NBConnection &c)
the attribute value for a prohibition
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.
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.
void push_front_noDoublePos(const Position &p)
const Position & getPosition() const
Returns the position of this node.
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.
const std::set< NBTrafficLightDefinition * > & getControllingTLS() const
Returns the traffic lights that were assigned to this node.
int getPriority() const
Returns the priority of the edge.
std::map< std::string, NBDistrict * >::const_iterator begin() const
Returns the pointer to the begin of the stored districts.
std::string getLaneID(unsigned int lane) const
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
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.
A point in 2D or 3D with translation and scaling methods.
std::map< std::string, NBDistrict * >::const_iterator end() const
Returns the pointer to the end of the stored districts.
NBEdgeCont & getEdgeCont()
Returns the edge container.
static void writeLane(OutputDevice &into, const std::string &eID, const std::string &lID, SUMOReal speed, SVCPermissions permissions, SVCPermissions preferred, SUMOReal endOffset, SUMOReal width, PositionVector shape, const std::string &origID, SUMOReal length, unsigned int index, bool origNames, const NBNode *node=0)
Writes a lane (<lane ...) of an edge.
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.
SUMOReal contPos
custom position for internal junction on this connection
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
static void writePositionLong(const Position &pos, OutputDevice &dev)
Writes the given position to device in long format (one attribute per dimension)
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.
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
const PositionVector & getShape() const
retrieve the junction shape
std::vector< NBConnection > NBConnectionVector
Definition of a connection vector.
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 (.
std::map< std::string, NBEdge * >::const_iterator begin() const
Returns the pointer to the begin of the stored edges.
static bool writeInternalEdges(OutputDevice &into, const NBNode &n, bool origNames)
Writes internal edges (<edge ... with id[0]==':') of the given node.
SUMOReal length() const
Returns the length.
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.
NBNodeCont & getNodeCont()
Returns 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
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.
A definition of a pedestrian walking area.
bool isMacroscopicConnector() const
Returns whether this edge was marked as a macroscopic connector.
A storage for options typed value containers)
This is an uncontrolled, major link, may pass.
void sortOutgoingConnectionsByIndex()
sorts the outgoing connections by their from-lane-index and their to-lane-index
NBTrafficLightLogicCont & getTLLogicCont()
Returns the traffic light logics container.
unsigned int tlLinkNo
The index of this connection within the controlling traffic light.
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.
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=OUTPUT_ACCURACY)
A definition of a pedestrian crossing.
Static storage of an output device and its base (abstract) implementation.
bool closeTag()
Closes the most recently opened tag.
static const SUMOReal UNSPECIFIED_RADIUS
unspecified lane width
static void writeJunction(OutputDevice &into, const NBNode &n, const bool checkLaneFoes)
Writes a junction (<junction ...)
bool writeLogic(OutputDevice &into, const bool checkLaneFoes) const
const std::vector< SUMOReal > & getSourceWeights() const
Returns the weights of the sources.
void push_back_noDoublePos(const Position &p)
const std::vector< SUMOReal > & getSinkWeights() const
Returns the weights of the sinks.
Container for nodes during the netbuilding process.
unsigned int internalLaneIndex
The lane index of this internal lane within the internal edge.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
const std::vector< WalkingArea > & getWalkingAreas() const
return this junctions pedestrian walking areas
NBDistrictCont & getDistrictCont()
Returns the districts container.
const std::string & getStreetName() const
Returns the street name of this edge.
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.
PositionVector getSubpart(SUMOReal beginOffset, SUMOReal endOffset) const
static std::string writeSUMOTime(SUMOTime time)
writes a SUMOTime as int if possible, otherwise as a float
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
void lf()
writes a line feed if applicable
const SVCPermissions SVC_UNSPECIFIED
SUMOReal width
This lane's width.
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)
NBNode * getFromNode() const
Returns the origin node of the edge.