Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
RONetHandler.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2002-2026 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
22// The handler for SUMO-Networks
23/****************************************************************************/
24#include <config.h>
25
26#include <string>
37#include "ROEdge.h"
38#include "ROLane.h"
39#include "RONode.h"
40#include "RONet.h"
41#include "RONetHandler.h"
43
44
45// ===========================================================================
46// method definitions
47// ===========================================================================
48RONetHandler::RONetHandler(RONet& net, ROAbstractEdgeBuilder& eb, const bool ignoreInternal, const double minorPenalty, double tlsPenalty, double turnaroundPenalty) :
49 SUMOSAXHandler("sumo-network"),
50 myNet(net),
51 myNetworkVersion(0, 0),
52 myEdgeBuilder(eb), myIgnoreInternal(ignoreInternal),
53 myCurrentName(), myCurrentEdge(nullptr), myCurrentStoppingPlace(nullptr),
54 myMinorPenalty(minorPenalty),
55 myTLSPenalty(tlsPenalty),
56 myTurnaroundPenalty(turnaroundPenalty)
57{}
58
59
61
62
63void
65 const SUMOSAXAttributes& attrs) {
66 switch (element) {
68 setLocation(attrs);
69 break;
70 case SUMO_TAG_NET: {
71 bool ok;
72 myNetworkVersion = StringUtils::toVersion(attrs.get<std::string>(SUMO_ATTR_VERSION, nullptr, ok, false));
73 break;
74 }
75 case SUMO_TAG_EDGE:
76 // in the first step, we do need the name to allocate the edge
77 // in the second, we need it to know to which edge we have to add
78 // the following edges to
79 parseEdge(attrs);
80 break;
81 case SUMO_TAG_LANE:
82 parseLane(attrs);
83 break;
85 parseJunction(attrs);
86 break;
88 parseConnection(attrs);
89 break;
96 parseStoppingPlace(attrs, (SumoXMLTag)element);
97 break;
98 case SUMO_TAG_ACCESS:
99 parseAccess(attrs);
100 break;
101 case SUMO_TAG_TAZ:
102 parseDistrict(attrs);
103 break;
105 parseDistrictEdge(attrs, true);
106 break;
107 case SUMO_TAG_TAZSINK:
108 parseDistrictEdge(attrs, false);
109 break;
110 case SUMO_TAG_TYPE: {
111 bool ok = true;
112 myCurrentTypeID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
113 break;
114 }
116 bool ok = true;
117 const SUMOVehicleClass svc = getVehicleClassID(attrs.get<std::string>(SUMO_ATTR_VCLASS, myCurrentTypeID.c_str(), ok));
118 const double speed = attrs.get<double>(SUMO_ATTR_SPEED, myCurrentTypeID.c_str(), ok);
119 if (ok) {
121 }
122 break;
123 }
124 case SUMO_TAG_PREFERENCE: {
125 bool ok = true;
126 const std::string routingType = attrs.get<std::string>(SUMO_ATTR_ROUTINGTYPE, nullptr, ok);
127 const double prio = attrs.get<double>(SUMO_ATTR_PRIORITY, routingType.c_str(), ok);
128 if (prio <= 0) {
129 throw InvalidArgument("In preference for routingType '" + routingType + "', priority must be positve");
130 }
131 if (attrs.hasAttribute(SUMO_ATTR_VCLASSES)) {
132 StringTokenizer st(attrs.get<std::string>(SUMO_ATTR_VCLASSES, routingType.c_str(), ok));
133 for (std::string className : st.getVector()) {
134 myNet.addPreference(routingType, getVehicleClassID(className), prio);
135 }
136 } else if (!attrs.hasAttribute(SUMO_ATTR_VTYPES)) {
137 // general preferenze applying to all types and vClasses
138 myNet.addPreference(routingType, "", prio);
139 }
140 if (attrs.hasAttribute(SUMO_ATTR_VTYPES)) {
141 StringTokenizer st(attrs.get<std::string>(SUMO_ATTR_VTYPES, routingType.c_str(), ok));
142 for (std::string typeName : st.getVector()) {
143 myNet.addPreference(routingType, typeName, prio);
144 }
145 }
146 break;
147 }
148 case SUMO_TAG_REROUTER: {
149 bool ok = true;
150 myRerouterID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
151 break;
152 }
154 if (myRerouterID != "") {
155 bool ok = true;
159 throw ProcessError(TLF("Invalid rerouter interval from % to %", time2string(myIntervalBegin), time2string(myIntervalEnd)));
160 }
161 }
162 break;
164 const std::string& closed_id = attrs.getStringSecure(SUMO_ATTR_ID, "");
165 ROEdge* closedEdge = myNet.getEdge(closed_id);
166 if (closedEdge == nullptr) {
167 throw ProcessError(TLF("rerouter '%': Edge '%' to close is not known.", myRerouterID, closed_id));
168 }
169 bool ok;
170 const std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, myRerouterID.c_str(), ok, "", false);
171 const std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, myRerouterID.c_str(), ok, "");
172 RouterProhibition prohibition;
173 prohibition.permissions = parseVehicleClasses(allow, disallow);
174 prohibition.begin = STEPS2TIME(myIntervalBegin);
175 prohibition.end = STEPS2TIME(attrs.getOptSUMOTimeReporting(SUMO_ATTR_UNTIL, nullptr, ok, myIntervalEnd));
176 myNet.addProhibition(closedEdge, prohibition);
177 break;
178 }
180 const std::string& closed_id = attrs.getStringSecure(SUMO_ATTR_ID, "");
181 ROLane* closedLane = myNet.getLane(closed_id);
182 if (closedLane == nullptr) {
183 throw ProcessError(TLF("rerouter '%': Lane '%' to close is not known.", myRerouterID, closed_id));
184 }
185 bool ok;
186 const std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, myRerouterID.c_str(), ok, "", false);
187 const std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, myRerouterID.c_str(), ok, "");
188 RouterProhibition prohibition;
189 prohibition.permissions = parseVehicleClasses(allow, disallow);
190 prohibition.begin = STEPS2TIME(myIntervalBegin);
191 prohibition.end = STEPS2TIME(attrs.getOptSUMOTimeReporting(SUMO_ATTR_UNTIL, nullptr, ok, myIntervalEnd));
192 myNet.addLaneProhibition(closedLane, prohibition);
193 break;
194 }
195 case SUMO_TAG_PARAM:
196 addParam(attrs);
197 break;
198 default:
199 break;
200 }
201}
202
203
204void
206 switch (element) {
208 myRerouterID = "";
209 break;
210 case SUMO_TAG_NET:
211 // build junction graph
212 for (std::set<std::string>::const_iterator it = myUnseenNodeIDs.begin(); it != myUnseenNodeIDs.end(); ++it) {
213 WRITE_ERRORF(TL("Unknown node '%'."), *it);
214 }
215 break;
216 default:
217 break;
218 }
219}
220
221
222void
224 bool ok = true;
225 const std::string key = attrs.get<std::string>(SUMO_ATTR_KEY, nullptr, ok);
226 // circumventing empty string test
227 const std::string val = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : "";
228 // add parameter in current created element, or in myLoadedParameterised
229 if (myCurrentEdge != nullptr) {
230 myCurrentEdge->setParameter(key, val);
231 }
232}
233
234
235void
237 // get the id, report an error if not given or empty...
238 bool ok = true;
239 myCurrentName = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
240 if (!ok) {
241 throw ProcessError();
242 }
244 if (!ok) {
245 return;
246 }
247 // get the edge
248 std::string from;
249 std::string to;
250 int priority;
251 myCurrentEdge = nullptr;
253 assert(myCurrentName[0] == ':');
255 from = junctionID;
256 to = junctionID;
257 priority = -1;
258 } else {
259 from = attrs.get<std::string>(SUMO_ATTR_FROM, myCurrentName.c_str(), ok);
260 to = attrs.get<std::string>(SUMO_ATTR_TO, myCurrentName.c_str(), ok);
261 priority = attrs.get<int>(SUMO_ATTR_PRIORITY, myCurrentName.c_str(), ok);
262 if (!ok) {
263 return;
264 }
265 }
266 RONode* fromNode = myNet.getNode(from);
267 if (fromNode == nullptr) {
268 myUnseenNodeIDs.insert(from);
269 fromNode = new RONode(from);
270 myNet.addNode(fromNode);
271 }
272 RONode* toNode = myNet.getNode(to);
273 if (toNode == nullptr) {
274 myUnseenNodeIDs.insert(to);
275 toNode = new RONode(to);
276 myNet.addNode(toNode);
277 }
278 const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, myCurrentName.c_str(), ok, "");
279 const std::string routingType = attrs.getOpt<std::string>(SUMO_ATTR_ROUTINGTYPE, myCurrentName.c_str(), ok, "");
280 // build the edge
281 myCurrentEdge = myEdgeBuilder.buildEdge(myCurrentName, fromNode, toNode, priority, type, routingType);
283
285 fromNode->addOutgoing(myCurrentEdge);
286 toNode->addIncoming(myCurrentEdge);
287 const std::string bidi = attrs.getOpt<std::string>(SUMO_ATTR_BIDI, myCurrentName.c_str(), ok, "");
288 if (bidi != "") {
290 }
291 } else {
292 myCurrentEdge = nullptr;
293 }
294}
295
296
297void
299 if (myCurrentEdge == nullptr) {
300 // was an internal edge to skip or an error occurred
301 return;
302 }
303 bool ok = true;
304 // get the id, report an error if not given or empty...
305 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
306 if (!ok) {
307 return;
308 }
309 // get the speed
310 double maxSpeed = attrs.get<double>(SUMO_ATTR_SPEED, id.c_str(), ok);
311 double length = attrs.get<double>(SUMO_ATTR_LENGTH, id.c_str(), ok);
312 std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, id.c_str(), ok, "");
313 std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, id.c_str(), ok, "");
314 const PositionVector shape = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), ok);
315 if (!ok) {
316 return;
317 }
318 if (shape.size() < 2) {
319 WRITE_ERRORF(TL("Ignoring lane '%' with broken shape."), id);
320 return;
321 }
322 // get the length
323 // get the vehicle classes
324 SVCPermissions permissions = parseVehicleClasses(allow, disallow, myNetworkVersion);
325 if (permissions != SVCAll) {
327 }
328 // add when both values are valid
329 if (maxSpeed > 0 && length > 0 && id.length() > 0) {
330 myCurrentEdge->addLane(new ROLane(id, myCurrentEdge, length, maxSpeed, permissions, shape));
331 } else {
332 WRITE_WARNING("Ignoring lane '" + id + "' with speed " + toString(maxSpeed) + " and length " + toString(length));
333 }
334}
335
336
337void
339 bool ok = true;
340 // get the id, report an error if not given or empty...
341 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
342 const SumoXMLNodeType type = attrs.get<SumoXMLNodeType>(SUMO_ATTR_TYPE, id.c_str(), ok);
343 if (type == SumoXMLNodeType::INTERNAL) {
344 return;
345 }
346 myUnseenNodeIDs.erase(id);
347 // get the position of the node
348 const double x = attrs.get<double>(SUMO_ATTR_X, id.c_str(), ok);
349 const double y = attrs.get<double>(SUMO_ATTR_Y, id.c_str(), ok);
350 const double z = attrs.getOpt<double>(SUMO_ATTR_Z, id.c_str(), ok, 0.);
351 if (!ok) {
352 return;
353 }
354 RONode* n = myNet.getNode(id);
355 if (n == nullptr) {
356 WRITE_WARNINGF(TL("Skipping isolated junction '%'."), id);
357 } else {
358 n->setPosition(Position(x, y, z));
359 }
360}
361
362
363void
365 bool ok = true;
366 std::string fromID = attrs.get<std::string>(SUMO_ATTR_FROM, nullptr, ok);
367 std::string toID = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
368 const int fromLane = attrs.get<int>(SUMO_ATTR_FROM_LANE, nullptr, ok);
369 const int toLane = attrs.get<int>(SUMO_ATTR_TO_LANE, nullptr, ok);
370 std::string dir = attrs.get<std::string>(SUMO_ATTR_DIR, nullptr, ok);
371 std::string viaID = attrs.getOpt<std::string>(SUMO_ATTR_VIA, nullptr, ok, "");
372 std::string tlID = attrs.getOpt<std::string>(SUMO_ATTR_TLID, nullptr, ok, "");
373 ROEdge* from = myNet.getEdge(fromID);
374 ROEdge* to = myNet.getEdge(toID);
375 if (from == nullptr) {
376 throw ProcessError(TLF("unknown from-edge '%' in connection", fromID));
377 }
378 if (to == nullptr) {
379 throw ProcessError(TLF("unknown to-edge '%' in connection", toID));
380 }
381 if ((int)from->getLanes().size() <= fromLane) {
382 throw ProcessError("invalid fromLane '" + toString(fromLane) + "' in connection from '" + fromID + "'.");
383 }
384 if ((int)to->getLanes().size() <= toLane) {
385 throw ProcessError("invalid toLane '" + toString(toLane) + "' in connection to '" + toID + "'.");
386 }
387 if (myIgnoreInternal || viaID == "") {
388 std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, nullptr, ok, "");
389 std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, nullptr, ok, "");
390 ROEdge* dummyVia = nullptr;
391 SVCPermissions permissions;
392 if (allow == "" && disallow == "") {
393 permissions = SVC_UNSPECIFIED;
394 } else {
396 // dummyVia is only needed to hold permissions
397 permissions = parseVehicleClasses(allow, disallow);
398 dummyVia = new ROEdge("dummyVia_" + from->getLanes()[fromLane]->getID() + "->" + to->getLanes()[toLane]->getID(),
399 from->getToJunction(), from->getToJunction(), permissions);
400 myNet.addEdge(dummyVia);
401 }
402 from->getLanes()[fromLane]->addOutgoingLane(to->getLanes()[toLane], dummyVia);
403 from->addSuccessor(to, nullptr, dir);
404 } else {
406 if (via == nullptr) {
407 throw ProcessError(TLF("unknown via-edge '%' in connection", viaID));
408 }
409 from->getLanes()[fromLane]->addOutgoingLane(to->getLanes()[toLane], via);
410 from->addSuccessor(to, via, dir);
411 via->addSuccessor(to, nullptr, dir);
412 LinkState state = SUMOXMLDefinitions::LinkStates.get(attrs.get<std::string>(SUMO_ATTR_STATE, nullptr, ok));
413 if (state == LINKSTATE_MINOR || state == LINKSTATE_EQUAL || state == LINKSTATE_STOP || state == LINKSTATE_ALLWAY_STOP) {
415 }
418 }
419 if (tlID != "") {
421 }
422 }
423 if (to->isCrossing()) {
425 }
426}
427
428
429void
431 bool ok = true;
433 // get the id, throw if not given or empty...
434 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, toString(element).c_str(), ok);
435 // get the lane
436 myCurrentStoppingPlace->lane = attrs.get<std::string>(SUMO_ATTR_LANE, toString(element).c_str(), ok);
437 if (!ok) {
438 throw ProcessError();
439 }
441 if (edge == nullptr) {
442 throw InvalidArgument("Unknown lane '" + myCurrentStoppingPlace->lane + "' for " + toString(element) + " '" + id + "'.");
443 }
444 // get the positions
445 myCurrentStoppingPlace->startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), ok, 0.);
446 myCurrentStoppingPlace->endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), ok, edge->getLength());
447 const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), ok, false);
449 throw InvalidArgument("Invalid position for " + toString(element) + " '" + id + "'.");
450 }
451 // this is a hack: the busstop attribute is meant to hold the id within the simulation context but this is not used within the router context
452 myCurrentStoppingPlace->busstop = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok, "");
453 // this is a hack: the actType is not used when using this to encode a stopping place
456}
457
458
459void
461 bool ok = true;
462 const std::string lane = attrs.get<std::string>(SUMO_ATTR_LANE, "access", ok);
463 const ROEdge* edge = myNet.getEdgeForLaneID(lane);
464 if (edge == nullptr) {
465 throw InvalidArgument("Unknown lane '" + lane + "' for access.");
466 }
467 if ((edge->getPermissions() & SVC_PEDESTRIAN) == 0) {
468 WRITE_WARNINGF(TL("Ignoring invalid access from non-pedestrian edge '%'."), edge->getID());
469 return;
470 }
471 const bool random = attrs.getOpt<std::string>(SUMO_ATTR_POSITION, "access", ok) == "random";
472 double pos = random ? edge->getLength() / 2. : attrs.getOpt<double>(SUMO_ATTR_POSITION, "access", ok, 0.);
473 double length = attrs.getOpt<double>(SUMO_ATTR_LENGTH, "access", ok, -1);
474 const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, "access", ok, false);
475 if (!ok || (SUMORouteHandler::checkStopPos(pos, pos, edge->getLength(), 0., friendlyPos) != SUMORouteHandler::StopPos::STOPPOS_VALID)) {
476 throw InvalidArgument("Invalid position " + toString(pos) + " for access on lane '" + lane + "'.");
477 }
478 if (!ok) {
479 throw ProcessError();
480 }
481 if (length < 0) {
482 const Position accPos = myNet.getLane(lane)->geometryPositionAtOffset(pos);
483 const double stopCenter = (myCurrentStoppingPlace->startPos + myCurrentStoppingPlace->endPos) / 2;
485 length = accPos.distanceTo(stopPos);
486 }
487 myCurrentStoppingPlace->accessPos.push_back(std::make_tuple(lane, pos, length));
488}
489
490
491void
493 myCurrentEdge = nullptr;
494 bool ok = true;
495 myCurrentName = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
496 if (!ok) {
497 return;
498 }
499 ROEdge* const sink = myEdgeBuilder.buildEdge(myCurrentName + "-sink", nullptr, nullptr, 0, "", "");
500 ROEdge* const source = myEdgeBuilder.buildEdge(myCurrentName + "-source", nullptr, nullptr, 0, "", "");
501 myNet.addDistrict(myCurrentName, source, sink);
502 if (attrs.hasAttribute(SUMO_ATTR_EDGES)) {
503 const std::vector<std::string>& desc = attrs.get<std::vector<std::string> >(SUMO_ATTR_EDGES, myCurrentName.c_str(), ok);
504 for (const std::string& eID : desc) {
507 }
508 }
509}
510
511
512void
514 bool ok = true;
515 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, myCurrentName.c_str(), ok);
516 myNet.addDistrictEdge(myCurrentName, id, isSource);
517}
518
519void
521 bool ok = true;
522 PositionVector s = attrs.get<PositionVector>(SUMO_ATTR_NET_OFFSET, nullptr, ok);
523 Boundary convBoundary = attrs.get<Boundary>(SUMO_ATTR_CONV_BOUNDARY, nullptr, ok);
524 Boundary origBoundary = attrs.get<Boundary>(SUMO_ATTR_ORIG_BOUNDARY, nullptr, ok);
525 std::string proj = attrs.get<std::string>(SUMO_ATTR_ORIG_PROJ, nullptr, ok);
526 if (ok) {
527 Position networkOffset = s[0];
528 GeoConvHelper::init(proj, networkOffset, origBoundary, convBoundary);
529 }
530}
531
532
533/****************************************************************************/
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define WRITE_ERRORF(...)
Definition MsgHandler.h:296
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define SUMOTime_MAX
Definition SUMOTime.h:34
SUMOVehicleClass getVehicleClassID(const std::string &name)
Returns the class id of the abstract class given by its name.
const SVCPermissions SVCAll
all VClasses are allowed
const SVCPermissions SVC_UNSPECIFIED
permissions not specified
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_PEDESTRIAN
pedestrian
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
@ SUMO_TAG_CLOSING_REROUTE
reroute of type closing
@ SUMO_TAG_NET
root element of a network file
@ SUMO_TAG_REROUTER
A rerouter.
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_CHARGING_STATION
A Charging Station.
@ SUMO_TAG_ACCESS
An access point for a train stop.
@ SUMO_TAG_CONTAINER_STOP
A container stop.
@ SUMO_TAG_TAZSINK
a sink within a district (connection road)
@ SUMO_TAG_BUS_STOP
A bus stop.
@ SUMO_TAG_LOCATION
@ SUMO_TAG_RESTRICTION
begin/end of the description of an edge restriction
@ SUMO_TAG_PREFERENCE
begin/end of the description of an edge preferences
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_PARKING_AREA
A parking area.
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_TRAIN_STOP
A train stop (alias for bus stop)
@ SUMO_TAG_OVERHEAD_WIRE_SEGMENT
An overhead wire segment.
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_PARAM
parameter associated to a certain key
@ SUMO_TAG_TYPE
type (edge)
@ SUMO_TAG_TAZSOURCE
a source within a district (connection road)
@ SUMO_TAG_CLOSING_LANE_REROUTE
lane of a reroute of type closing
@ SUMO_TAG_EDGE
begin/end of the description of an edge
@ TURN
The link is a 180 degree turn.
@ TURN_LEFTHAND
The link is a 180 degree turn (left-hand network)
SumoXMLEdgeFunc
Numbers representing special SUMO-XML-attribute values for representing edge functions used in netbui...
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_ALLWAY_STOP
This is an uncontrolled, all-way stop link.
@ LINKSTATE_STOP
This is an uncontrolled, minor link, has to stop.
@ LINKSTATE_EQUAL
This is an uncontrolled, right-before-left link.
@ LINKSTATE_MINOR
This is an uncontrolled, minor link, has to brake.
SumoXMLNodeType
Numbers representing special SUMO-XML-attribute values for representing node- (junction-) types used ...
@ SUMO_ATTR_STARTPOS
@ SUMO_ATTR_DISALLOW
@ SUMO_ATTR_CONV_BOUNDARY
@ SUMO_ATTR_ALLOW
@ SUMO_ATTR_LANE
@ SUMO_ATTR_NET_OFFSET
@ SUMO_ATTR_ORIG_BOUNDARY
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_VALUE
@ SUMO_ATTR_VIA
@ SUMO_ATTR_Y
@ SUMO_ATTR_FROM_LANE
@ SUMO_ATTR_Z
@ SUMO_ATTR_ENDPOS
@ SUMO_ATTR_X
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_EDGES
the edges of a route
@ SUMO_ATTR_BIDI
@ SUMO_ATTR_PRIORITY
@ SUMO_ATTR_VTYPES
@ SUMO_ATTR_SHAPE
edge: the shape in xml-definition
@ SUMO_ATTR_VCLASSES
@ SUMO_ATTR_NAME
@ SUMO_ATTR_ORIG_PROJ
@ SUMO_ATTR_TO
@ SUMO_ATTR_FROM
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_TLID
link,node: the traffic light id responsible for this link
@ SUMO_ATTR_VCLASS
@ SUMO_ATTR_FRIENDLY_POS
@ SUMO_ATTR_TO_LANE
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_LENGTH
@ SUMO_ATTR_VERSION
@ SUMO_ATTR_ID
@ SUMO_ATTR_UNTIL
@ SUMO_ATTR_FUNCTION
@ SUMO_ATTR_DIR
The abstract direction of a link.
@ SUMO_ATTR_KEY
@ SUMO_ATTR_POSITION
@ SUMO_ATTR_STATE
The state of a link.
@ SUMO_ATTR_ROUTINGTYPE
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
A class that stores a 2D geometrical boundary.
Definition Boundary.h:39
static bool init(OptionsCont &oc)
Initialises the processing and the final instance using the given options.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimensions
Definition Position.h:263
A list of positions.
Interface for building instances of router-edges.
virtual ROEdge * buildEdge(const std::string &name, RONode *from, RONode *to, const int priority, const std::string &type, const std::string &routingType)=0
Builds an edge with the given name.
A basic edge for routing applications.
Definition ROEdge.h:73
void setFunction(SumoXMLEdgeFunc func)
Sets the function of the edge.
Definition ROEdge.h:118
virtual void addLane(ROLane *lane)
Adds a lane to the edge while loading.
Definition ROEdge.cpp:120
const std::vector< ROLane * > & getLanes() const
Returns this edge's lanes.
Definition ROEdge.h:558
double getLength() const
Returns the length of the edge.
Definition ROEdge.h:225
bool isCrossing() const
return whether this edge is a pedestrian crossing
Definition ROEdge.h:165
virtual void addSuccessor(ROEdge *s, ROEdge *via=nullptr, std::string dir="")
Adds information about a connected edge.
Definition ROEdge.cpp:135
void setTimePenalty(double value)
Definition ROEdge.h:146
A single lane the router may use.
Definition ROLane.h:48
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
Definition ROLane.h:131
RONetHandler(RONet &net, ROAbstractEdgeBuilder &eb, const bool ignoreInternal, const double minorPenalty, double tlsPenalty, double turnaroundPenalty)
Constructor.
void parseAccess(const SUMOSAXAttributes &attrs)
const double myMinorPenalty
time penalty for passing a minor link
std::string myRerouterID
virtual void myEndElement(int element)
Called when a closing tag occurs.
MMVersion myNetworkVersion
the loaded network version
virtual ~RONetHandler()
Destructor.
void parseEdge(const SUMOSAXAttributes &attrs)
Parses and builds an edge.
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
std::string myCurrentName
The name of the edge/node that is currently processed.
const double myTLSPenalty
void addParam(const SUMOSAXAttributes &attrs)
assign arbitrary vehicle parameters
ROEdge * myCurrentEdge
The currently built edge.
std::string myCurrentTypeID
The id of the currently processed edge type.
void parseStoppingPlace(const SUMOSAXAttributes &attrs, const SumoXMLTag element)
const bool myIgnoreInternal
whether to ignore junction internal edges
void parseConnection(const SUMOSAXAttributes &attrs)
std::map< ROEdge *, std::string > myBidiEdges
temporary storage for bidi attributes (to be resolved after loading all edges)
ROAbstractEdgeBuilder & myEdgeBuilder
The object used to build of edges of the desired type.
virtual void parseLane(const SUMOSAXAttributes &attrs)
Parses and builds a lane.
SUMOTime myIntervalBegin
SUMOVehicleParameter::Stop * myCurrentStoppingPlace
The currently built stopping place.
RONet & myNet
The net to store the information into.
const double myTurnaroundPenalty
void parseDistrict(const SUMOSAXAttributes &attrs)
void parseJunction(const SUMOSAXAttributes &attrs)
Parses a junction's position.
void parseDistrictEdge(const SUMOSAXAttributes &attrs, bool isSource)
std::set< std::string > myUnseenNodeIDs
temporary data for checking node initialisation after network parsing is finished
void setLocation(const SUMOSAXAttributes &attrs)
Parses network location description.
SUMOTime myIntervalEnd
The router's network representation.
Definition RONet.h:63
void setPermissionsFound()
Definition RONet.cpp:942
RONode * getNode(const std::string &id) const
Retrieves an node from the network.
Definition RONet.h:215
void addStoppingPlace(const std::string &id, const SumoXMLTag category, SUMOVehicleParameter::Stop *stop)
Definition RONet.cpp:326
bool addDistrictEdge(const std::string tazID, const std::string edgeID, const bool isSource)
Definition RONet.cpp:246
void addSpeedRestriction(const std::string &id, const SUMOVehicleClass svc, const double speed)
Adds a restriction for an edge type.
Definition RONet.cpp:148
void addProhibition(const ROEdge *edge, const RouterProhibition &prohibition)
Definition RONet.cpp:982
ROEdge * getEdge(const std::string &name) const
Retrieves an edge from the network.
Definition RONet.h:179
void addLaneProhibition(const ROLane *lane, const RouterProhibition &prohibition)
Definition RONet.cpp:992
virtual bool addEdge(ROEdge *edge)
Definition RONet.cpp:209
ROLane * getLane(const std::string &laneID) const
Retrieves a lane rom the network given its id.
Definition RONet.cpp:884
void addNode(RONode *node)
Definition RONet.cpp:317
ROEdge * getEdgeForLaneID(const std::string &laneID) const
Retrieves an edge from the network when the lane id is given.
Definition RONet.cpp:878
void addPreference(const std::string &routingType, SUMOVehicleClass svc, double prio)
add edge type specific routing preference
Definition RONet.cpp:184
bool addDistrict(const std::string id, ROEdge *source, ROEdge *sink)
Definition RONet.cpp:223
Base class for nodes used by the router.
Definition RONode.h:46
void addOutgoing(ROEdge *edge)
Definition RONode.h:84
void addIncoming(ROEdge *edge)
Definition RONode.h:80
void setPosition(const Position &p)
Sets the position of the node.
Definition RONode.cpp:41
static StopPos checkStopPos(double &startPos, double &endPos, const double laneLength, const double minLength, const bool friendlyPos)
check start and end position of a stop
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.
SUMOTime getOptSUMOTimeReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
virtual std::string getStringSecure(int id, const std::string &def) const =0
Returns the string-value of the named (by its enum-value) attribute.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
SAX-handler base for SUMO-files.
Definition of vehicle stop (position and duration)
std::string lane
The lane to stop at.
double startPos
The stopping position start.
std::string actType
act Type (only used by Persons) (used by netedit)
double endPos
The stopping position end.
std::vector< std::tuple< std::string, double, double > > accessPos
lanes and positions connected to this stop (only used by duarouter where Stop is used to store stoppi...
std::string busstop
(Optional) bus stop if one is assigned to the stop
static std::string getEdgeIDFromLane(const std::string laneID)
return edge id when given the lane ID
static StringBijection< LinkState > LinkStates
link states
static std::string getJunctionIDFromInternalEdge(const std::string internalEdge)
return the junction id when given an edge of type internal, crossing or WalkingArea
T get(const std::string &str) const
get key
std::vector< std::string > getVector()
return vector of strings
static MMVersion toVersion(const std::string &sData)
parse a (network) version string
Prohibitions and their estimated end time.
SVCPermissions permissions