SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
NBNetBuilder.cpp
Go to the documentation of this file.
1 /****************************************************************************/
12 // Instance responsible for building networks
13 /****************************************************************************/
14 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
15 // Copyright (C) 2001-2014 DLR (http://www.dlr.de/) and contributors
16 /****************************************************************************/
17 //
18 // This file is part of SUMO.
19 // SUMO is free software: you can redistribute it and/or modify
20 // it under the terms of the GNU General Public License as published by
21 // the Free Software Foundation, either version 3 of the License, or
22 // (at your option) any later version.
23 //
24 /****************************************************************************/
25 
26 
27 // ===========================================================================
28 // included modules
29 // ===========================================================================
30 #ifdef _MSC_VER
31 #include <windows_config.h>
32 #else
33 #include <config.h>
34 #endif
35 
36 #include <string>
37 #include <fstream>
38 #include "NBNetBuilder.h"
39 #include "NBNodeCont.h"
40 #include "NBEdgeCont.h"
42 #include "NBDistrictCont.h"
43 #include "NBDistrict.h"
44 #include "NBDistribution.h"
45 #include "NBRequest.h"
46 #include "NBTypeCont.h"
51 #include <utils/common/ToString.h>
53 #include "NBAlgorithms.h"
54 #include "NBAlgorithms_Ramps.h"
55 #include "NBHeightMapper.h"
56 
57 #ifdef CHECK_MEMORY_LEAKS
58 #include <foreign/nvwa/debug_new.h>
59 #endif // CHECK_MEMORY_LEAKS
60 
61 
62 // ===========================================================================
63 // method definitions
64 // ===========================================================================
66  myEdgeCont(myTypeCont)
67 {}
68 
69 
71 
72 
73 void
75  // we possibly have to load the edges to keep
76  if (oc.isSet("keep-edges.input-file")) {
77  std::ifstream strm(oc.getString("keep-edges.input-file").c_str());
78  if (!strm.good()) {
79  throw ProcessError("Could not load names of edges too keep from '" + oc.getString("keep-edges.input-file") + "'.");
80  }
81  std::ostringstream oss;
82  bool first = true;
83  while (strm.good()) {
84  if (!first) {
85  oss << ',';
86  }
87  std::string name;
88  strm >> name;
89  oss << name;
90  first = false;
91  }
92  oc.set("keep-edges.explicit", oss.str());
93  }
94  // apply options to type control
95  myTypeCont.setDefaults(oc.getInt("default.lanenumber"), oc.getFloat("default.speed"), oc.getInt("default.priority"));
96  // apply options to edge control
98  // apply options to traffic light logics control
100 }
101 
102 
103 void
105  const std::set<std::string>& explicitTurnarounds,
106  bool removeElements) {
107  GeoConvHelper& geoConvHelper = GeoConvHelper::getProcessing();
108 
109 
110  // MODIFYING THE SETS OF NODES AND EDGES
111 
112  // Removes edges that are connecting the same node
113  PROGRESS_BEGIN_MESSAGE("Removing self-loops");
116  //
117  if (oc.exists("remove-edges.isolated") && oc.getBool("remove-edges.isolated")) {
118  PROGRESS_BEGIN_MESSAGE("Finding isolated roads");
121  }
122  //
123  if (oc.exists("keep-edges.postload") && oc.getBool("keep-edges.postload")) {
124  if (oc.isSet("keep-edges.explicit")) {
125  PROGRESS_BEGIN_MESSAGE("Removing unwished edges");
128  }
129  }
130  // join junctions (may create new "geometry"-nodes so it needs to come before removing these
131  if (oc.exists("junctions.join-exclude") && oc.isSet("junctions.join-exclude")) {
132  myNodeCont.addJoinExclusion(oc.getStringVector("junctions.join-exclude"));
133  }
135  if (oc.getBool("junctions.join")) {
136  PROGRESS_BEGIN_MESSAGE("Joining junction clusters");
137  // preliminary geometry computations to determine the length of edges
138  // This depends on turning directions and sorting of edge list
139  // in case junctions are joined geometry computations have to be repeated
142  myNodeCont.computeNodeShapes(oc.getBool("lefthand"));
144  // preliminary roundabout computations to avoid destroying roundabouts
145  if (oc.getBool("roundabouts.guess")) {
147  }
148  const std::set<EdgeSet>& roundabouts = myEdgeCont.getRoundabouts();
149  for (std::set<EdgeSet>::const_iterator it_round = roundabouts.begin();
150  it_round != roundabouts.end(); ++it_round) {
151  std::vector<std::string> nodeIDs;
152  for (EdgeSet::const_iterator it_edge = it_round->begin(); it_edge != it_round->end(); ++it_edge) {
153  nodeIDs.push_back((*it_edge)->getToNode()->getID());
154  }
155  myNodeCont.addJoinExclusion(nodeIDs);
156  }
157  numJoined += myNodeCont.joinJunctions(oc.getFloat("junctions.join-dist"), myDistrictCont, myEdgeCont, myTLLCont);
158  // reset geometry to avoid influencing subsequent steps (ramps.guess)
159  myEdgeCont.computeLaneShapes();
161  }
162  if (numJoined > 0) {
163  // bit of a misnomer since we're already done
164  WRITE_MESSAGE(" Joined " + toString(numJoined) + " junction cluster(s).");
165  }
166  //
167  if (removeElements) {
168  unsigned int no = 0;
169  const bool removeGeometryNodes = oc.exists("geometry.remove") && oc.getBool("geometry.remove");
170  PROGRESS_BEGIN_MESSAGE("Removing empty nodes" + std::string(removeGeometryNodes ? " and geometry nodes" : ""));
173  WRITE_MESSAGE(" " + toString(no) + " nodes removed.");
174  }
175 
176  // MOVE TO ORIGIN
177  // compute new boundary after network modifications have taken place
178  Boundary boundary;
179  for (std::map<std::string, NBNode*>::const_iterator it = myNodeCont.begin(); it != myNodeCont.end(); ++it) {
180  boundary.add(it->second->getPosition());
181  }
182  for (std::map<std::string, NBEdge*>::const_iterator it = myEdgeCont.begin(); it != myEdgeCont.end(); ++it) {
183  boundary.add(it->second->getGeometry().getBoxBoundary());
184  }
185  geoConvHelper.setConvBoundary(boundary);
186 
187  if (!oc.getBool("offset.disable-normalization") && oc.isDefault("offset.x") && oc.isDefault("offset.y")) {
188  moveToOrigin(geoConvHelper);
189  }
190  geoConvHelper.computeFinal(); // information needed for location element fixed at this point
191 
192  if (oc.exists("geometry.min-dist") && oc.isSet("geometry.min-dist")) {
193  PROGRESS_BEGIN_MESSAGE("Reducing geometries");
194  myEdgeCont.reduceGeometries(oc.getFloat("geometry.min-dist"));
196  }
197  // @note: removing geometry can create similar edges so joinSimilarEdges must come afterwards
198  // @note: likewise splitting can destroy similarities so joinSimilarEdges must come before
199  if (removeElements) {
200  PROGRESS_BEGIN_MESSAGE("Joining similar edges");
204  }
205  //
206  if (oc.exists("geometry.split") && oc.getBool("geometry.split")) {
207  PROGRESS_BEGIN_MESSAGE("Splitting geometry edges");
210  }
211  // guess ramps
212  if ((oc.exists("ramps.guess") && oc.getBool("ramps.guess")) || (oc.exists("ramps.set") && oc.isSet("ramps.set"))) {
213  PROGRESS_BEGIN_MESSAGE("Guessing and setting on-/off-ramps");
217  }
218  // guess sidewalks
219  if (oc.getBool("sidewalks.guess")) {
220  const int sidewalks = myEdgeCont.guessSidewalks(oc.getFloat("default.sidewalk-width"),
221  oc.getFloat("sidewalks.guess.min-speed"),
222  oc.getFloat("sidewalks.guess.max-speed"));
223  WRITE_MESSAGE("Guessed " + toString(sidewalks) + " sidewalks.");
224  }
225 
226  // check whether any not previously setable connections may be set now
228  //
229  if (oc.exists("geometry.max-angle")) {
231  oc.getFloat("geometry.max-angle"),
232  oc.getFloat("geometry.min-radius"),
233  oc.getBool("geometry.min-radius.fix"));
234  }
235 
236  // GEOMETRY COMPUTATION
237  //
238  PROGRESS_BEGIN_MESSAGE("Computing turning directions");
241  //
242  PROGRESS_BEGIN_MESSAGE("Sorting nodes' edges");
246  //
247  PROGRESS_BEGIN_MESSAGE("Computing node shapes");
248  if (oc.exists("geometry.junction-mismatch-threshold")) {
249  myNodeCont.computeNodeShapes(oc.getBool("lefthand"), oc.getFloat("geometry.junction-mismatch-threshold"));
250  } else {
251  myNodeCont.computeNodeShapes(oc.getBool("lefthand"));
252  }
254  //
255  PROGRESS_BEGIN_MESSAGE("Computing edge shapes");
258 
259  // APPLY SPEED MODIFICATIONS
260  if (oc.exists("speed.offset")) {
261  const SUMOReal speedOffset = oc.getFloat("speed.offset");
262  const SUMOReal speedFactor = oc.getFloat("speed.factor");
263  if (speedOffset != 0 || speedFactor != 1) {
264  PROGRESS_BEGIN_MESSAGE("Applying speed modifications");
265  for (std::map<std::string, NBEdge*>::const_iterator i = myEdgeCont.begin(); i != myEdgeCont.end(); ++i) {
266  (*i).second->setSpeed(-1, (*i).second->getSpeed() * speedFactor + speedOffset);
267  }
269  }
270  }
271 
272  // CONNECTIONS COMPUTATION
273  //
274  PROGRESS_BEGIN_MESSAGE("Computing node types");
277  //
278  bool buildCrossingsAndWalkingAreas = false;
279  if (oc.getBool("crossings.guess")) {
280  buildCrossingsAndWalkingAreas = true;
281  int crossings = 0;
282  for (std::map<std::string, NBNode*>::const_iterator i = myNodeCont.begin(); i != myNodeCont.end(); ++i) {
283  crossings += (*i).second->guessCrossings();
284  }
285  WRITE_MESSAGE("Guessed " + toString(crossings) + " pedestrian crossings.");
286  }
287  if (!oc.getBool("no-internal-links") && !buildCrossingsAndWalkingAreas) {
288  // recheck whether we had crossings in the input
289  for (std::map<std::string, NBNode*>::const_iterator i = myNodeCont.begin(); i != myNodeCont.end(); ++i) {
290  if (i->second->getCrossings().size() > 0) {
291  buildCrossingsAndWalkingAreas = true;
292  break;
293  }
294  }
295  }
296  //
297  PROGRESS_BEGIN_MESSAGE("Computing priorities");
300  //
301  PROGRESS_BEGIN_MESSAGE("Computing approached edges");
302  myEdgeCont.computeEdge2Edges(oc.getBool("no-left-connections"));
304  //
305  if (oc.getBool("roundabouts.guess")) {
306  PROGRESS_BEGIN_MESSAGE("Guessing and setting roundabouts");
309  }
311  //
312  PROGRESS_BEGIN_MESSAGE("Computing approaching lanes");
313  myEdgeCont.computeLanes2Edges(buildCrossingsAndWalkingAreas);
315  //
316  PROGRESS_BEGIN_MESSAGE("Dividing of lanes on approached lanes");
317  myNodeCont.computeLanes2Lanes(buildCrossingsAndWalkingAreas);
320  //
321  PROGRESS_BEGIN_MESSAGE("Processing turnarounds");
322  if (!oc.getBool("no-turnarounds")) {
323  myEdgeCont.appendTurnarounds(oc.getBool("no-turnarounds.tls"));
324  } else {
325  myEdgeCont.appendTurnarounds(explicitTurnarounds, oc.getBool("no-turnarounds.tls"));
326  }
328  //
329  PROGRESS_BEGIN_MESSAGE("Rechecking of lane endings");
330  myEdgeCont.recheckLanes(buildCrossingsAndWalkingAreas);
332 
333 
334  // GUESS TLS POSITIONS
335  PROGRESS_BEGIN_MESSAGE("Assigning nodes to traffic lights");
336  if (oc.isSet("tls.set")) {
337  std::vector<std::string> tlControlledNodes = oc.getStringVector("tls.set");
339  for (std::vector<std::string>::const_iterator i = tlControlledNodes.begin(); i != tlControlledNodes.end(); ++i) {
340  NBNode* node = myNodeCont.retrieve(*i);
341  if (node == 0) {
342  WRITE_WARNING("Building a tl-logic for node '" + *i + "' is not possible." + "\n The node '" + *i + "' is not known.");
343  } else {
345  }
346  }
347  }
350  //
351  if (oc.getBool("tls.join")) {
352  PROGRESS_BEGIN_MESSAGE("Joining traffic light nodes");
353  myNodeCont.joinTLS(myTLLCont, oc.getFloat("tls.join-dist"));
355  }
356 
357 
358  // COMPUTING RIGHT-OF-WAY AND TRAFFIC LIGHT PROGRAMS
359  //
360  PROGRESS_BEGIN_MESSAGE("Computing traffic light control information");
363  //
364  PROGRESS_BEGIN_MESSAGE("Computing node logics");
367  //
368  PROGRESS_BEGIN_MESSAGE("Computing traffic light logics");
369  std::pair<unsigned int, unsigned int> numbers = myTLLCont.computeLogics(myEdgeCont, oc);
371  std::string progCount = "";
372  if (numbers.first != numbers.second) {
373  progCount = "(" + toString(numbers.second) + " programs) ";
374  }
375  WRITE_MESSAGE(" " + toString(numbers.first) + " traffic light(s) " + progCount + "computed.");
376  //
377  if (oc.isSet("street-sign-output")) {
378  PROGRESS_BEGIN_MESSAGE("Generating street signs");
381  }
382 
383  // FINISHING INNER EDGES
384  if (!oc.getBool("no-internal-links")) {
385  PROGRESS_BEGIN_MESSAGE("Building inner edges");
386  for (std::map<std::string, NBEdge*>::const_iterator i = myEdgeCont.begin(); i != myEdgeCont.end(); ++i) {
387  (*i).second->sortOutgoingConnectionsByIndex();
388  }
389  // walking areas shall only be built if crossings are wished as well
390  for (std::map<std::string, NBNode*>::const_iterator i = myNodeCont.begin(); i != myNodeCont.end(); ++i) {
391  (*i).second->buildInnerEdges(buildCrossingsAndWalkingAreas);
392  }
394  }
395 
396 
397  // report
398  WRITE_MESSAGE("-----------------------------------------------------");
399  WRITE_MESSAGE("Summary:");
401  WRITE_MESSAGE(" Network boundaries:");
402  WRITE_MESSAGE(" Original boundary : " + toString(geoConvHelper.getOrigBoundary()));
403  WRITE_MESSAGE(" Applied offset : " + toString(geoConvHelper.getOffsetBase()));
404  WRITE_MESSAGE(" Converted boundary : " + toString(geoConvHelper.getConvBoundary()));
405  WRITE_MESSAGE("-----------------------------------------------------");
407  // report on very large networks
408  if (MAX2(geoConvHelper.getConvBoundary().xmax(), geoConvHelper.getConvBoundary().ymax()) > 1000000 ||
409  MIN2(geoConvHelper.getConvBoundary().xmin(), geoConvHelper.getConvBoundary().ymin()) < -1000000) {
410  WRITE_WARNING("Network contains very large coordinates and will probably flicker in the GUI. Check for outlying nodes and make sure the network is shifted to the coordinate origin");
411  }
412 }
413 
414 
415 void
417  PROGRESS_BEGIN_MESSAGE("Moving network to origin");
418  Boundary boundary = geoConvHelper.getConvBoundary();
419  const SUMOReal x = -boundary.xmin();
420  const SUMOReal y = -boundary.ymin();
421  for (std::map<std::string, NBNode*>::const_iterator i = myNodeCont.begin(); i != myNodeCont.end(); ++i) {
422  (*i).second->reshiftPosition(x, y);
423  }
424  for (std::map<std::string, NBEdge*>::const_iterator i = myEdgeCont.begin(); i != myEdgeCont.end(); ++i) {
425  (*i).second->reshiftPosition(x, y);
426  }
427  for (std::map<std::string, NBDistrict*>::const_iterator i = myDistrictCont.begin(); i != myDistrictCont.end(); ++i) {
428  (*i).second->reshiftPosition(x, y);
429  }
430  geoConvHelper.moveConvertedBy(x, y);
432 }
433 
434 
435 bool
436 NBNetBuilder::transformCoordinates(Position& from, bool includeInBoundary, GeoConvHelper* from_srs) {
437  Position orig(from);
438  bool ok = GeoConvHelper::getProcessing().x2cartesian(from, includeInBoundary);
439  if (ok) {
440  const NBHeightMapper& hm = NBHeightMapper::get();
441  if (hm.ready()) {
442  if (from_srs != 0 && from_srs->usingGeoProjection()) {
443  from_srs->cartesian2geo(orig);
444  }
445  SUMOReal z = hm.getZ(orig);
446  from = Position(from.x(), from.y(), z);
447  }
448  }
449  return ok;
450 }
451 
452 
453 bool
454 NBNetBuilder::transformCoordinates(PositionVector& from, bool includeInBoundary, GeoConvHelper* from_srs) {
455  const SUMOReal maxLength = OptionsCont::getOptions().getFloat("geometry.max-segment-length");
456  if (maxLength > 0 && from.size() > 1) {
457  // transformation to cartesian coordinates must happen before we can check segment length
458  PositionVector copy = from;
459  for (int i = 0; i < (int) from.size(); i++) {
460  transformCoordinates(copy[i], false);
461  }
462  // check lengths and insert new points where needed (in the original
463  // coordinate system)
464  int inserted = 0;
465  for (int i = 0; i < (int)copy.size() - 1; i++) {
466  Position start = from[i + inserted];
467  Position end = from[i + inserted + 1];
468  SUMOReal length = copy[i].distanceTo(copy[i + 1]);
469  const Position step = (end - start) * (maxLength / length);
470  int steps = 0;
471  while (length > maxLength) {
472  length -= maxLength;
473  steps++;
474  from.insertAt(i + inserted + 1, start + (step * steps));
475  inserted++;
476  }
477  }
478  // now perform the transformation again so that height mapping can be
479  // performed for the new points
480  }
481  bool ok = true;
482  for (int i = 0; i < (int) from.size(); i++) {
483  ok = ok && transformCoordinates(from[i], includeInBoundary, from_srs);
484  }
485  return ok;
486 }
487 
488 /****************************************************************************/
void moveToOrigin(GeoConvHelper &geoConvHelper)
shift network so its lower left corner is at 0,0
NBNetBuilder()
Constructor.
NBTypeCont myTypeCont
The used container for street types.
Definition: NBNetBuilder.h:232
void joinSimilarEdges(NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tlc)
Joins edges connecting the same nodes.
Definition: NBNodeCont.cpp:179
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) ...
void removeSelfLoops(NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tc)
Removes self-loop edges (edges where the source and the destination node are the same) ...
Definition: NBNodeCont.cpp:167
void setTLControllingInformation(const NBEdgeCont &ec)
Informs the edges about being controlled by a tls.
void sortOutgoingLanesConnections()
Sorts all lanes of all edges within the container by their direction.
Definition: NBEdgeCont.cpp:556
void markRoundabouts()
mark edge priorities and prohibit turn-arounds for all roundabout edges
Definition: NBEdgeCont.cpp:907
void cartesian2geo(Position &cartesian) const
Converts the given cartesian (shifted) position to its geo (lat/long) representation.
void setConvBoundary(const Boundary &boundary)
sets the converted boundary
void computeNodeShapes(bool leftHand, SUMOReal mismatchThreshold=-1)
Compute the junction shape for this node.
static bool transformCoordinates(Position &from, bool includeInBoundary=true, GeoConvHelper *from_srs=0)
transforms loaded coordinates handles projections, offsets (using GeoConvHelper) and import of height...
NBJoinedEdgesMap myJoinedEdges
Map of joined edges.
Definition: NBNetBuilder.h:244
void addJoinExclusion(const std::vector< std::string > &ids, bool check=false)
Definition: NBNodeCont.cpp:419
bool ready() const
returns whether the NBHeightMapper has data
unsigned int removeUnwishedNodes(NBDistrictCont &dc, NBEdgeCont &ec, NBJoinedEdgesMap &je, NBTrafficLightLogicCont &tlc, bool removeGeometryNodes)
Removes &quot;unwished&quot; nodes.
Definition: NBNodeCont.cpp:323
const std::set< EdgeSet > getRoundabouts() const
Returns the determined roundabouts.
Definition: NBEdgeCont.cpp:889
void insertAt(int index, const Position &p)
SUMOReal getZ(const Position &geo) const
returns height for the given geo coordinate (WGS84)
void compute(OptionsCont &oc, const std::set< std::string > &explicitTurnarounds=std::set< std::string >(), bool removeElements=true)
Performs the network building steps.
unsigned int joinJunctions(SUMOReal maxDist, NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tlc)
Joins junctions that are very close together.
Definition: NBNodeCont.cpp:477
~NBNetBuilder()
Destructor.
SUMOReal ymin() const
Returns minimum y-coordinate.
Definition: Boundary.cpp:124
static GeoConvHelper & getProcessing()
the coordinate transformation to use for input conversion and processing
Definition: GeoConvHelper.h:97
bool x2cartesian(Position &from, bool includeInBoundary=true)
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
SUMOReal xmin() const
Returns minimum x-coordinate.
Definition: Boundary.cpp:112
T MAX2(T a, T b)
Definition: StdDefs.h:74
void generateStreetSigns()
assigns street signs to edges based on toNode types
Definition: NBEdgeCont.cpp:933
void recheckPostProcessConnections()
Try to set any stored connections.
Definition: NBEdgeCont.cpp:725
void guessTLs(OptionsCont &oc, NBTrafficLightLogicCont &tlc)
Guesses which junctions or junction clusters shall be controlled by tls.
Definition: NBNodeCont.cpp:786
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
SUMOReal x() const
Returns the x-position.
Definition: Position.h:63
SUMOReal xmax() const
Returns maximum x-coordinate.
Definition: Boundary.cpp:118
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:48
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:200
void computeLanes2Lanes(const bool buildCrossingsAndWalkingAreas)
divides the incoming lanes on outgoing lanes
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:67
void applyOptions(OptionsCont &oc)
Initialises the storage by applying given options.
void checkGeometries(const SUMOReal maxAngle, const SUMOReal minRadius, bool fix)
Definition: NBEdgeCont.cpp:537
void computeLogics(const NBEdgeCont &ec, OptionsCont &oc)
build the list of outgoing edges and lanes
static const NBHeightMapper & get()
return the singleton instance (maybe 0)
static void computeFinal()
compute the location attributes which will be used for output based on the loaded location data...
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
static void reportWarnings()
reports warnings if any occured
Definition: NBRequest.cpp:760
void reduceGeometries(const SUMOReal minDist)
Definition: NBEdgeCont.cpp:529
void computeLanes2Edges(const bool buildCrossingsAndWalkingAreas)
Computes for each edge which lanes approach the next edges.
Definition: NBEdgeCont.cpp:572
std::map< std::string, NBEdge * >::const_iterator end() const
Returns the pointer to the end of the stored edges.
Definition: NBEdgeCont.h:198
bool usingGeoProjection() const
Returns whether a transformation from geo to metric coordinates will be performed.
static methods for processing the coordinates conversion for the current net
Definition: GeoConvHelper.h:59
std::map< std::string, NBDistrict * >::const_iterator begin() const
Returns the pointer to the begin of the stored districts.
void removeUnwishedEdges(NBDistrictCont &dc)
Removes unwished edges (not in keep-edges)
Definition: NBEdgeCont.cpp:501
void joinTLS(NBTrafficLightLogicCont &tlc, SUMOReal maxdist)
Builds clusters of tls-controlled junctions and joins the control if possible.
Definition: NBNodeCont.cpp:938
static StringBijection< TrafficLightType > TrafficLightTypes
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:46
void applyOptions(OptionsCont &oc)
Initialises the storage by applying given options.
std::map< std::string, NBDistrict * >::const_iterator end() const
Returns the pointer to the end of the stored districts.
void guessRoundabouts()
Determines which edges belong to roundabouts and increases their priority.
Definition: NBEdgeCont.cpp:797
static void computeEdgePriorities(NBNodeCont &nc)
Computes edge priorities within a node.
A list of positions.
void applyOptions(OptionsCont &oc)
Initialises the storage by applying given options.
Definition: NBEdgeCont.cpp:84
void setDefaults(int defaultNoLanes, SUMOReal defaultSpeed, int defaultPriority)
Sets the default values.
Definition: NBTypeCont.cpp:50
NBEdgeCont myEdgeCont
The used container for edges.
Definition: NBNetBuilder.h:235
unsigned int joinLoadedClusters(NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tlc)
Joins loaded junction clusters (see NIXMLNodesHandler)
Definition: NBNodeCont.cpp:453
void computeEdge2Edges(bool noLeftMovers)
Computes for each edge the approached edges.
Definition: NBEdgeCont.cpp:564
void computeLaneShapes()
Computes the shapes of all lanes of all edges stored in the container.
Definition: NBEdgeCont.cpp:612
NBTrafficLightLogicCont myTLLCont
The used container for traffic light logics.
Definition: NBNetBuilder.h:238
static void computeTurnDirections(NBNodeCont &nc)
Computes turnaround destinations for all edges (if exist)
T MIN2(T a, T b)
Definition: StdDefs.h:68
#define PROGRESS_BEGIN_MESSAGE(msg)
Definition: MsgHandler.h:202
void splitGeometry(NBNodeCont &nc)
Splits edges into multiple if they have a complex geometry.
Definition: NBEdgeCont.cpp:518
const Position getOffsetBase() const
Returns the network base.
std::pair< unsigned int, unsigned int > computeLogics(NBEdgeCont &ec, OptionsCont &oc)
Computes the traffic light logics using the stored definitions and stores the results.
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.
Definition: NBNodeCont.h:135
const Boundary & getConvBoundary() const
Returns the converted boundary.
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
Definition: ToString.h:53
std::map< std::string, NBEdge * >::const_iterator begin() const
Returns the pointer to the begin of the stored edges.
Definition: NBEdgeCont.h:190
void setAsTLControlled(NBNode *node, NBTrafficLightLogicCont &tlc, TrafficLightType type, std::string id="")
Sets the given node as being controlled by a tls.
Definition: NBNodeCont.cpp:984
void add(SUMOReal x, SUMOReal y)
Makes the boundary include the given coordinate.
Definition: Boundary.cpp:76
static void computeRamps(NBNetBuilder &nb, OptionsCont &oc)
Computes highway on-/off-ramps (if wished)
bool set(const std::string &name, const std::string &value)
Sets the given value for the named option.
void appendTurnarounds(bool noTLSControlled)
Appends turnarounds to all edges stored in the container.
Definition: NBEdgeCont.cpp:588
static void computeNodeTypes(NBNodeCont &nc)
Computes node types.
void removeIsolatedRoads(NBDistrictCont &dc, NBEdgeCont &ec, NBTrafficLightLogicCont &tc)
Removes sequences of edges that are not connected with a junction. Simple roads without junctions som...
Definition: NBNodeCont.cpp:229
SUMOReal y() const
Returns the y-position.
Definition: Position.h:68
A storage for options typed value containers)
Definition: OptionsCont.h:108
void recheckLanes(const bool buildCrossingsAndWalkingAreas)
Rechecks whether all lanes have a successor for each of the stored edges.
Definition: NBEdgeCont.cpp:580
void computeEdgeShapes()
Computes the shapes of all edges stored in the container.
Definition: NBEdgeCont.cpp:604
Represents a single node (junction) during network building.
Definition: NBNode.h:75
T get(const std::string &str) const
NBDistrictCont myDistrictCont
The used container for districts.
Definition: NBNetBuilder.h:241
#define SUMOReal
Definition: config.h:218
SUMOReal ymax() const
Returns maximum y-coordinate.
Definition: Boundary.cpp:130
const Boundary & getOrigBoundary() const
Returns the original boundary.
void init(NBEdgeCont &ec)
Initialises the map using the list of edge names.
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
Definition: NBNodeCont.cpp:108
#define PROGRESS_DONE_MESSAGE()
Definition: MsgHandler.h:203
static void sortNodesEdges(NBNodeCont &nc, bool leftHand)
Sorts a node&#39;s edges clockwise regarding driving direction.
void printBuiltNodesStatistics() const
Prints statistics about built nodes.
int guessSidewalks(SUMOReal width, SUMOReal minSpeed, SUMOReal maxSpeed)
add sidwalks to edges within the given limits and return the number of edges affected ...
Definition: NBEdgeCont.cpp:971
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
#define WRITE_MESSAGE(msg)
Definition: MsgHandler.h:201
NBNodeCont myNodeCont
The used container for nodes.
Definition: NBNetBuilder.h:229
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
Definition: NBNodeCont.h:127
Set z-values for all network positions based on data from a height map.
void moveConvertedBy(SUMOReal x, SUMOReal y)
Shifts the converted boundary by the given amounts.
bool exists(const std::string &name) const
Returns the information whether the named option is known.
TrafficLightType
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.