 |
Eclipse SUMO - Simulation of Urban MObility
|
Go to the documentation of this file.
36 #define DEBUGNODEID "260479469"
37 #define DEBUGCOND(obj) ((obj != 0 && (obj)->getID() == DEBUGNODEID))
52 const bool guessAndAdd = oc.
getBool(
"ramps.guess");
53 double minHighwaySpeed = oc.
getFloat(
"ramps.min-highway-speed");
54 double maxRampSpeed = oc.
getFloat(
"ramps.max-ramp-speed");
55 double rampLength = oc.
getFloat(
"ramps.ramp-length");
56 bool dontSplit = oc.
getBool(
"ramps.no-split");
58 std::set<NBEdge*> incremented;
60 std::set<std::string> noramps;
61 if (oc.
isSet(
"ramps.unset")) {
63 noramps.insert(edges.begin(), edges.end());
67 for (std::set<EdgeSet>::const_iterator it_round = roundabouts.begin();
68 it_round != roundabouts.end(); ++it_round) {
69 for (EdgeSet::const_iterator it_edge = it_round->begin(); it_edge != it_round->end(); ++it_edge) {
70 noramps.insert((*it_edge)->getID());
79 if (guessAndAdd || oc.
getBool(
"ramps.guess-acceleration-lanes")) {
84 std::set<NBNode*, ComparatorIdLess> potOnRamps;
85 std::set<NBNode*, ComparatorIdLess> potOffRamps;
86 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
88 if (
mayNeedOnRamp(cur, minHighwaySpeed, maxRampSpeed, noramps)) {
89 potOnRamps.insert(cur);
93 potOffRamps.insert(cur);
97 for (std::set<NBNode*, ComparatorIdLess>::const_iterator i = potOnRamps.begin(); i != potOnRamps.end(); ++i) {
98 buildOnRamp(*i, nc, ec, dc, rampLength, dontSplit || !guessAndAdd, guessAndAdd);
100 for (std::set<NBNode*, ComparatorIdLess>::const_iterator i = potOffRamps.begin(); i != potOffRamps.end(); ++i) {
105 if (oc.
isSet(
"ramps.set")) {
110 for (std::vector<std::string>::iterator i = edges.begin(); i != edges.end(); ++i) {
112 if (noramps.count(*i) != 0) {
113 WRITE_WARNING(
"Can not build ramp on edge '" + *i +
"' - the edge is unsuitable.");
117 WRITE_WARNING(
"Can not build on ramp on edge '" + *i +
"' - the edge is not known.");
122 buildOnRamp(from, nc, ec, dc, rampLength, dontSplit,
true);
127 WRITE_WARNING(
"Can not build off ramp on edge '" + *i +
"' - the edge is not known.");
144 NBEdge* potHighway, *potRamp, *cont;
157 NBEdge* potHighway, *potRamp, *prev;
165 NBEdge* potHighway, *potRamp, *cont;
169 std::cout <<
"buildOnRamp cur=" << cur->
getID() <<
" hw=" << potHighway->
getID() <<
" ramp=" << potRamp->
getID() <<
" cont=" << cont->
getID() <<
"\n";
178 std::set<NBEdge*> incremented;
179 if (addLanes && toAdd > 0 && std::find(incremented.begin(), incremented.end(), cont) == incremented.end()) {
180 double currLength = 0;
182 if (find(incremented.begin(), incremented.end(), curr) == incremented.end()) {
187 incremented.insert(curr);
205 }
else if (curr == potHighway || curr == potRamp) {
215 if (curr !=
nullptr && !dontSplit && currLength - POSITION_EPS < rampLength && curr->getNumLanes() == firstLaneNumber && std::find(incremented.begin(), incremented.end(), curr) == incremented.end()) {
217 bool wasFirst = first == curr;
220 throw ProcessError(
"Ups - could not build on-ramp for edge '" + curr->
getID() +
"' (node could not be build)!");
222 std::string name = curr->
getID();
225 WRITE_ERROR(
"Ups - could not build on-ramp for edge '" + curr->
getID() +
"'!");
230 incremented.insert(curr);
241 if (curr == cont && dontSplit && addLanes) {
242 WRITE_WARNING(
"Could not build on-ramp for edge '" + curr->
getID() +
"' due to option '--ramps.no-split'");
247 for (
int i = 0; i < firstLaneNumber - potHighway->
getNumLanes(); ++i) {
270 NBEdge* potHighway, *potRamp, *prev;
274 std::cout <<
"buildOffRamp cur=" << cur->
getID() <<
" hw=" << potHighway->
getID() <<
" ramp=" << potRamp->
getID() <<
" prev=" << prev->
getID() <<
"\n";
283 std::set<NBEdge*> incremented;
284 if (toAdd > 0 && std::find(incremented.begin(), incremented.end(), prev) == incremented.end()) {
285 double currLength = 0;
287 if (find(incremented.begin(), incremented.end(), curr) == incremented.end()) {
292 incremented.insert(curr);
310 }
else if (curr == potHighway || curr == potRamp) {
320 if (curr !=
nullptr && !dontSplit && currLength - POSITION_EPS < rampLength && curr->getNumLanes() == firstLaneNumber && std::find(incremented.begin(), incremented.end(), curr) == incremented.end()) {
322 bool wasFirst = first == curr;
326 throw ProcessError(
"Ups - could not build off-ramp for edge '" + curr->
getID() +
"' (node could not be build)!");
328 std::string name = curr->
getID();
331 WRITE_ERROR(
"Ups - could not build off-ramp for edge '" + curr->
getID() +
"'!");
334 curr = ec.
retrieve(name +
"-AddedOffRampEdge");
335 incremented.insert(curr);
342 if (curr == prev && dontSplit) {
343 WRITE_WARNING(
"Could not build off-ramp for edge '" + curr->
getID() +
"' due to option '--ramps.no-split'");
367 const double offset = (0.5 * addedLanes *
379 if (fabs((*potHighway)->getSpeed() - (*potRamp)->getSpeed()) < .1) {
382 if ((*potHighway)->getSpeed() < (*potRamp)->getSpeed()) {
383 std::swap(*potHighway, *potRamp);
391 if ((*potHighway)->getNumLanes() == (*potRamp)->getNumLanes()) {
394 if ((*potHighway)->getNumLanes() < (*potRamp)->getNumLanes()) {
395 std::swap(*potHighway, *potRamp);
405 assert(edges.size() == 2);
406 *potHighway = edges[0];
420 std::swap(*potHighway, *potRamp);
429 *potHighway = edges[0];
431 assert(edges.size() == 2);
443 const std::vector<NBEdge*>& edges2 = n->
getEdges();
446 std::cout <<
" edges=" <<
toString(edges) <<
" edges2=" <<
toString(edges2) <<
"\n";
449 std::vector<NBEdge*>::const_iterator i = std::find(edges2.begin(), edges2.end(), *other);
451 if ((*i) == *potRamp) {
452 std::swap(*potHighway, *potRamp);
465 NBEdge* potHighway,
NBEdge* potRamp,
NBEdge* other,
double minHighwaySpeed,
double maxRampSpeed,
466 const std::set<std::string>& noramps) {
485 if (maxSpeed < minHighwaySpeed) {
519 if (maxRampSpeed > 0 && maxRampSpeed < potRamp->getSpeed()) {
522 if (noramps.find(other->
getID()) != noramps.end()) {
536 for (
int i = 0; i < (int)edge->
getNumLanes(); ++i) {
565 if (firstIndex % 2 == 1) {
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
static bool mayNeedOnRamp(NBNode *cur, double minHighwaySpeed, double maxRampSpeed, const std::set< std::string > &noramps)
Determines whether the given node may be an on-ramp begin.
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
static const std::string ADDED_ON_RAMP_EDGE
suffix for newly generated on-ramp edges
#define WRITE_WARNING(msg)
void addEdges2Keep(const OptionsCont &oc, std::set< std::string > &into)
add edges that must be kept
Storage for edges, including some functionality operating on multiple edges.
Instance responsible for building networks.
EdgeBuildingStep getStep() const
The building step of this edge.
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
void addEdges2Keep(const OptionsCont &oc, std::set< std::string > &into)
add edges that must be kept
bool addLane2LaneConnections(int fromLane, NBEdge *dest, int toLane, int no, Lane2LaneInfoType type, bool invalidatePrevious=false, bool mayDefinitelyPass=false)
Builds no connections starting at the given lanes.
static void getOnRampEdges(NBNode *n, NBEdge **potHighway, NBEdge **potRamp, NBEdge **other)
static bool mayNeedOffRamp(NBNode *cur, double minHighwaySpeed, double maxRampSpeed, const std::set< std::string > &noramps)
Determines whether the given node may be an off-ramp end.
static void moveRampRight(NBEdge *ramp, int addedLanes)
Moves the ramp to the right, as new lanes were added.
static bool hasWrongMode(NBEdge *edge)
whether the edge has a mode that does not indicate a ramp edge
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
bool isTurningDirectionAt(const NBEdge *const edge) const
Returns whether the given edge is the opposite direction to this edge.
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node)
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static void buildOnRamp(NBNode *cur, NBNodeCont &nc, NBEdgeCont &ec, NBDistrictCont &dc, double rampLength, bool dontSplit, bool addLanes)
Builds an on-ramp starting at the given node.
SumoXMLNodeType getType() const
Returns the type of this node.
const double SUMO_const_laneWidth
double length() const
Returns the length.
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
bool hasDefaultGeometryEndpointAtNode(const NBNode *node) const
Returns whether the geometry is terminated by the node positions This default may be violated by init...
A container for districts.
bool splitAt(NBDistrictCont &dc, NBEdge *edge, NBNode *node)
Splits the edge at the position nearest to the given node.
static double relAngle(double angle1, double angle2)
computes the relative angle between the two angles
Container for nodes during the netbuilding process.
NBEdgeCont & getEdgeCont()
The representation of a single edge during network building.
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
void invalidateConnections(bool reallowSetting=false)
invalidate current connections of edge
NBNode * getToNode() const
Returns the destination node of the edge.
const PositionVector & getGeometry() const
Returns the geometry of the edge.
NBPTStopCont & getPTStopCont()
Returns a reference to the pt stop container.
static bool determinedBySpeed(NBEdge **potHighway, NBEdge **potRamp)
static void buildOffRamp(NBNode *cur, NBNodeCont &nc, NBEdgeCont &ec, NBDistrictCont &dc, double rampLength, bool dontSplit)
Builds an off-ramp ending at the given node.
NBPTLineCont & getPTLineCont()
Returns a reference to the pt line container.
double getLaneWidth() const
Returns the default width of lanes of this edge.
NBParkingCont & getParkingCont()
void addEdges2Keep(const OptionsCont &oc, std::set< std::string > &into)
add edges that must be kept
static bool determinedByLaneNumber(NBEdge **potHighway, NBEdge **potRamp)
vehicle is a passenger car (a "normal" car)
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
int getNumLanes() const
Returns the number of lanes.
A point in 2D or 3D with translation and scaling methods.
A storage for options typed value containers)
static void patchRampGeometry(NBEdge *potRamp, NBEdge *first, NBEdge *potHighway, bool onRamp)
shift ramp geometry to merge smoothly with the motorway
const EdgeVector & getEdges() const
Returns all edges which participate in this node (Edges that start or end at this node)
static void getOffRampEdges(NBNode *n, NBEdge **potHighway, NBEdge **potRamp, NBEdge **other)
The connection was computed and validated.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
const PositionVector & getLaneShape(int i) const
Returns the shape of the nth lane.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
void setAcceleration(int lane, bool accelRamp)
marks one lane as acceleration lane
double getSpeed() const
Returns the speed allowed on this edge.
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
NBDistrictCont & getDistrictCont()
Returns a reference the districts container.
static bool isTrafficLight(SumoXMLNodeType type)
return whether the given type is a traffic light
static const double UNSPECIFIED_WIDTH
unspecified lane width
bool isMacroscopicConnector() const
Returns whether this edge was marked as a macroscopic connector.
static void nextCW(const EdgeVector &edges, EdgeVector::const_iterator &from)
static void computeRamps(NBNetBuilder &nb, OptionsCont &oc)
Computes highway on-/off-ramps (if wished)
void incLaneNo(int by)
increment lane
Represents a single node (junction) during network building.
NBNodeCont & getNodeCont()
Returns a reference to the node container.
const std::string & getID() const
Returns the id.
double getAngleAtNode(const NBNode *const node) const
Returns the angle of the edge's geometry at the given node.
NBNode * getFromNode() const
Returns the origin node of the edge.
const std::set< EdgeSet > getRoundabouts() const
Returns the determined roundabouts.
void setGeometry(const PositionVector &g, bool inner=false)
(Re)sets the edge's geometry
void move2side(double amount, double maxExtension=100)
move position vector to side using certain ammount
static bool fulfillsRampConstraints(NBEdge *potHighway, NBEdge *potRamp, NBEdge *other, double minHighwaySpeed, double maxRampSpeed, const std::set< std::string > &noramps)
Checks whether an on-/off-ramp can be bult here.
Lanes to lanes - relationships are loaded; no recheck is necessary/wished.
LaneSpreadFunction getLaneSpreadFunction() const
Returns how this edge's lanes' lateral offset is computed.
bool hasDefaultGeometryEndpoints() const
Returns whether the geometry is terminated by the node positions This default may be violated by init...
const std::string & getID() const