Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
NIImporter_SUMO.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-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/****************************************************************************/
21// Importer for networks stored in SUMO format
22/****************************************************************************/
23#include <config.h>
24#include <string>
34#include <utils/xml/XMLSubSys.h>
38#include <netbuild/NBEdge.h>
39#include <netbuild/NBEdgeCont.h>
40#include <netbuild/NBNode.h>
41#include <netbuild/NBNodeCont.h>
44#include "NILoader.h"
45#include "NIXMLTypesHandler.h"
46#include "NIImporter_SUMO.h"
47
48
49// ===========================================================================
50// method definitions
51// ===========================================================================
52// ---------------------------------------------------------------------------
53// static methods (interface in this case)
54// ---------------------------------------------------------------------------
55void
57 NIImporter_SUMO importer(nb);
58 importer._loadNetwork(oc);
59}
60
61
62// ---------------------------------------------------------------------------
63// loader methods
64// ---------------------------------------------------------------------------
66 : SUMOSAXHandler("sumo-network"),
67 myNetBuilder(nb),
68 myNodeCont(nb.getNodeCont()),
69 myTLLCont(nb.getTLLogicCont()),
70 myTypesHandler(nb.getTypeCont()),
71 myCurrentEdge(nullptr),
72 myCurrentLane(nullptr),
73 myCurrentTL(nullptr),
74 myLocation(nullptr),
75 myNetworkVersion(0, 0),
76 myHaveSeenInternalEdge(false),
77 myAmLefthand(false),
78 myChangeLefthand(false),
79 myCornerDetail(0),
80 myLinkDetail(-1),
81 myRectLaneCut(false),
82 myWalkingAreas(false),
83 myLimitTurnSpeed(-1),
84 myCheckLaneFoesAll(false),
85 myCheckLaneFoesRoundabout(true),
86 myTlsIgnoreInternalJunctionJam(false),
87 myDefaultSpreadType(toString(LaneSpreadFunction::RIGHT)),
88 myGeomAvoidOverlap(false),
89 myJunctionsHigherSpeed(false),
90 myInternalJunctionsVehicleWidth(OptionsCont::getOptions().getFloat("internal-junctions.vehicle-width")),
91 myJunctionsMinimalShape(OptionsCont::getOptions().getBool("junctions.minimal-shape")),
92 myJunctionsEndpointShape(OptionsCont::getOptions().getBool("junctions.endpoint-shape")) {
93}
94
95
97 for (std::map<std::string, EdgeAttrs*>::const_iterator i = myEdges.begin(); i != myEdges.end(); ++i) {
98 EdgeAttrs* ed = (*i).second;
99 for (std::vector<LaneAttrs*>::const_iterator j = ed->lanes.begin(); j != ed->lanes.end(); ++j) {
100 delete *j;
101 }
102 delete ed;
103 }
104 delete myLocation;
105 if (myCurrentEdge != nullptr) {
106 for (LaneAttrs* const lane : myCurrentEdge->lanes) {
107 delete lane;
108 }
109 delete myCurrentEdge;
110 }
111}
112
113
114void
116 // check whether the option is set (properly)
117 if (!oc.isUsableFileList("sumo-net-file")) {
118 return;
119 }
120 const std::vector<std::string> discardableParams = oc.getStringVector("discard-params");
121 myDiscardableParams.insert(discardableParams.begin(), discardableParams.end());
122 // parse file(s)
123 const std::vector<std::string> files = oc.getStringVector("sumo-net-file");
124 for (std::vector<std::string>::const_iterator file = files.begin(); file != files.end(); ++file) {
125 if (!FileHelpers::isReadable(*file)) {
126 WRITE_ERRORF(TL("Could not open sumo-net-file '%'."), *file);
127 return;
128 }
129 setFileName(*file);
130 const long before = PROGRESS_BEGIN_TIME_MESSAGE("Parsing sumo-net from '" + *file + "'");
131 XMLSubSys::runParser(*this, *file, true);
132 PROGRESS_TIME_MESSAGE(before);
133 }
134 // build edges
135 const double maxSegmentLength = oc.getFloat("geometry.max-segment-length");
136 for (std::map<std::string, EdgeAttrs*>::const_iterator i = myEdges.begin(); i != myEdges.end(); ++i) {
137 EdgeAttrs* ed = (*i).second;
138 // skip internal edges
140 continue;
141 }
142 // get and check the nodes
143 NBNode* from = myNodeCont.retrieve(ed->fromNode);
144 NBNode* to = myNodeCont.retrieve(ed->toNode);
145 if (from == nullptr) {
146 WRITE_ERRORF(TL("Edge's '%' from-node '%' is not known."), ed->id, ed->fromNode);
147 continue;
148 }
149 if (to == nullptr) {
150 WRITE_ERRORF(TL("Edge's '%' to-node '%' is not known."), ed->id, ed->toNode);
151 continue;
152 }
153 if (from == to) {
154 WRITE_ERRORF(TL("Edge's '%' from-node and to-node '%' are identical."), ed->id, ed->toNode);
155 continue;
156 }
157 if (ed->shape.size() == 0 && maxSegmentLength > 0) {
158 ed->shape.push_back(from->getPosition());
159 ed->shape.push_back(to->getPosition());
160 // shape is already cartesian but we must use a copy because the original will be modified
161 NBNetBuilder::addGeometrySegments(ed->shape, PositionVector(ed->shape), maxSegmentLength);
162 }
163 // build and insert the edge
164 NBEdge* e = new NBEdge(ed->id, from, to,
166 (int) ed->lanes.size(),
168 ed->shape, ed->lsf, ed->streetName, "", true); // always use tryIgnoreNodePositions to keep original shape
169 e->setLoadedLength(ed->length);
171 e->setDistance(ed->distance);
172 if (!myNetBuilder.getEdgeCont().insert(e)) {
173 WRITE_ERRORF(TL("Could not insert edge '%'."), ed->id);
174 delete e;
175 continue;
176 }
178 if (ed->builtEdge != nullptr) {
180 ed->builtEdge->setBidi(ed->bidi != "");
182 }
183 }
184 // assign further lane attributes (edges are built)
185 EdgeVector toRemove;
186 const bool dismissVclasses = oc.getBool("dismiss-vclasses");
187 for (std::map<std::string, EdgeAttrs*>::const_iterator i = myEdges.begin(); i != myEdges.end(); ++i) {
188 EdgeAttrs* ed = (*i).second;
189 NBEdge* nbe = ed->builtEdge;
190 if (nbe == nullptr) { // inner edge or removed by explicit list, vclass, ...
191 continue;
192 }
193 const SumoXMLNodeType toType = nbe->getToNode()->getType();
194 for (int fromLaneIndex = 0; fromLaneIndex < (int) ed->lanes.size(); ++fromLaneIndex) {
195 LaneAttrs* lane = ed->lanes[fromLaneIndex];
196 // connections
197 const std::vector<Connection>& connections = lane->connections;
198 for (const Connection& c : connections) {
199 if (myEdges.count(c.toEdgeID) == 0) {
200 WRITE_ERRORF(TL("Unknown edge '%' given in connection."), c.toEdgeID);
201 continue;
202 }
203 NBEdge* toEdge = myEdges[c.toEdgeID]->builtEdge;
204 if (toEdge == nullptr) { // removed by explicit list, vclass, ...
205 continue;
206 }
207 if (toEdge->getFromNode() != nbe->getToNode()) { // inconsistency may occur when merging networks
208 WRITE_WARNINGF("Removing invalid connection from edge '%' to edge '%'", nbe->getID(), toEdge->getID());
209 continue;
210 }
211 // patch attribute uncontrolled for legacy networks where it is not set explicitly
212 bool uncontrolled = c.uncontrolled;
213
215 && c.tlLinkIndex == NBConnection::InvalidTlIndex) {
216 uncontrolled = true;
217 }
219 fromLaneIndex, toEdge, c.toLaneIdx, NBEdge::Lane2LaneInfoType::VALIDATED,
220 true, c.mayDefinitelyPass, c.keepClear ? KEEPCLEAR_TRUE : KEEPCLEAR_FALSE,
221 c.contPos, c.visibility, c.speed, c.friction, c.customLength, c.customShape, uncontrolled, c.permissions, c.indirectLeft, c.edgeType, c.changeLeft, c.changeRight);
222 if (c.getParametersMap().size() > 0) {
223 nbe->getConnectionRef(fromLaneIndex, toEdge, c.toLaneIdx).updateParameters(c.getParametersMap());
224 }
225 // maybe we have a tls-controlled connection
226 if (c.tlID != "" && myRailSignals.count(c.tlID) == 0) {
227 const std::map<std::string, NBTrafficLightDefinition*>& programs = myTLLCont.getPrograms(c.tlID);
228 if (programs.size() > 0) {
229 std::map<std::string, NBTrafficLightDefinition*>::const_iterator it;
230 for (it = programs.begin(); it != programs.end(); it++) {
231 NBLoadedSUMOTLDef* tlDef = dynamic_cast<NBLoadedSUMOTLDef*>(it->second);
232 if (tlDef) {
233 tlDef->addConnection(nbe, toEdge, fromLaneIndex, c.toLaneIdx, c.tlLinkIndex, c.tlLinkIndex2, false);
234 } else {
235 throw ProcessError("Corrupt traffic light definition '" + c.tlID + "' (program '" + it->first + "')");
236 }
237 }
238 } else {
239 WRITE_ERRORF(TL("The traffic light '%' is not known."), c.tlID);
240 }
241 }
242 }
243 // allow/disallow XXX preferred
244 if (!dismissVclasses) {
245 nbe->setPermissions(parseVehicleClasses(lane->allow, lane->disallow, myNetworkVersion), fromLaneIndex);
246 }
247 nbe->setPermittedChanging(fromLaneIndex, parseVehicleClasses(lane->changeLeft, ""), parseVehicleClasses(lane->changeRight, ""));
248 // width, offset
249 nbe->setLaneWidth(fromLaneIndex, lane->width);
250 nbe->setEndOffset(fromLaneIndex, lane->endOffset);
251 nbe->setSpeed(fromLaneIndex, lane->maxSpeed);
252 nbe->setFriction(fromLaneIndex, lane->friction);
253 nbe->setAcceleration(fromLaneIndex, lane->accelRamp);
254 nbe->getLaneStruct(fromLaneIndex).oppositeID = lane->oppositeID;
255 nbe->getLaneStruct(fromLaneIndex).type = lane->type;
256 nbe->getLaneStruct(fromLaneIndex).updateParameters(lane->getParametersMap());
257 if (lane->customShape) {
258 nbe->setLaneShape(fromLaneIndex, lane->shape);
259 }
260 // stop offset for lane
261 bool stopOffsetSet = false;
262 if (lane->laneStopOffset.isDefined() || nbe->getEdgeStopOffset().isDefined()) {
263 // apply lane-specific stopOffset (might be none as well)
264 stopOffsetSet = nbe->setEdgeStopOffset(fromLaneIndex, lane->laneStopOffset);
265 }
266 if (!stopOffsetSet) {
267 // apply default stop offset to lane
268 nbe->setEdgeStopOffset(fromLaneIndex, nbe->getEdgeStopOffset());
269 }
270 }
272 if (!nbe->hasLaneSpecificWidth() && nbe->getLanes()[0].width != NBEdge::UNSPECIFIED_WIDTH) {
273 nbe->setLaneWidth(-1, nbe->getLaneWidth(0));
274 }
276 nbe->setEndOffset(-1, nbe->getEndOffset(0));
277 }
279 nbe->setEdgeStopOffset(-1, nbe->getEdgeStopOffset());
280 }
281 // check again after permissions are set
284 toRemove.push_back(nbe);
285 }
286 }
287 for (EdgeVector::iterator i = toRemove.begin(); i != toRemove.end(); ++i) {
289 }
290 // insert loaded prohibitions
291 for (std::vector<Prohibition>::const_iterator it = myProhibitions.begin(); it != myProhibitions.end(); it++) {
292 NBEdge* prohibitedFrom = myEdges[it->prohibitedFrom]->builtEdge;
293 NBEdge* prohibitedTo = myEdges[it->prohibitedTo]->builtEdge;
294 NBEdge* prohibitorFrom = myEdges[it->prohibitorFrom]->builtEdge;
295 NBEdge* prohibitorTo = myEdges[it->prohibitorTo]->builtEdge;
296 if (prohibitedFrom == nullptr) {
297 WRITE_WARNINGF(TL("Edge '%' in prohibition was not built."), it->prohibitedFrom);
298 } else if (prohibitedTo == nullptr) {
299 WRITE_WARNINGF(TL("Edge '%' in prohibition was not built."), it->prohibitedTo);
300 } else if (prohibitorFrom == nullptr) {
301 WRITE_WARNINGF(TL("Edge '%' in prohibition was not built."), it->prohibitorFrom);
302 } else if (prohibitorTo == nullptr) {
303 WRITE_WARNINGF(TL("Edge '%' in prohibition was not built."), it->prohibitorTo);
304 } else {
305 NBNode* n = prohibitedFrom->getToNode();
307 NBConnection(prohibitorFrom, prohibitorTo),
308 NBConnection(prohibitedFrom, prohibitedTo));
309 }
310 }
311 if (oc.isWriteable("no-internal-links") && oc.isDefault("no-internal-links") && !myHaveSeenInternalEdge) {
312 oc.set("no-internal-links", "true");
313 }
314 if (oc.isWriteable("lefthand") && oc.isDefault("lefthand") && myAmLefthand) {
315 oc.set("lefthand", toString(myAmLefthand));
316 }
317 if (oc.isWriteable("junctions.corner-detail") && oc.isDefault("junctions.corner-detail") && oc.getInt("junctions.corner-detail") != myCornerDetail) {
318 oc.set("junctions.corner-detail", toString(myCornerDetail));
319 }
320 if (oc.isWriteable("junctions.internal-link-detail") && oc.isDefault("junctions.internal-link-detail") && oc.getInt("junctions.internal-link-detail") != myLinkDetail && myLinkDetail > 0) {
321 oc.set("junctions.internal-link-detail", toString(myLinkDetail));
322 }
323 if (oc.isWriteable("rectangular-lane-cut") && oc.isDefault("rectangular-lane-cut") && oc.getBool("rectangular-lane-cut") != myRectLaneCut) {
324 oc.set("rectangular-lane-cut", toString(myRectLaneCut));
325 }
326 if (oc.isWriteable("walkingareas") && oc.isDefault("walkingareas") && oc.getBool("walkingareas") != myWalkingAreas) {
327 oc.set("walkingareas", toString(myWalkingAreas));
328 }
329 if (oc.isWriteable("junctions.limit-turn-speed") && oc.isDefault("junctions.limit-turn-speed") && oc.getFloat("junctions.limit-turn-speed") != myLimitTurnSpeed) {
330 oc.set("junctions.limit-turn-speed", toString(myLimitTurnSpeed));
331 }
332 if (oc.isWriteable("check-lane-foes.all") && oc.isDefault("check-lane-foes.all") && oc.getBool("check-lane-foes.all") != myCheckLaneFoesAll) {
333 oc.set("check-lane-foes.all", toString(myCheckLaneFoesAll));
334 }
335 if (oc.isWriteable("check-lane-foes.roundabout") && oc.isDefault("check-lane-foes.roundabout") && oc.getBool("check-lane-foes.roundabout") != myCheckLaneFoesRoundabout) {
336 oc.set("check-lane-foes.roundabout", toString(myCheckLaneFoesRoundabout));
337 }
338 if (oc.isWriteable("tls.ignore-internal-junction-jam") && oc.isDefault("tls.ignore-internal-junction-jam") && oc.getBool("tls.ignore-internal-junction-jam") != myTlsIgnoreInternalJunctionJam) {
339 oc.set("tls.ignore-internal-junction-jam", toString(myTlsIgnoreInternalJunctionJam));
340 }
341 if (oc.isWriteable("default.spreadtype") && oc.isDefault("default.spreadtype") && oc.getString("default.spreadtype") != myDefaultSpreadType) {
342 oc.set("default.spreadtype", myDefaultSpreadType);
343 }
344 if (oc.isWriteable("geometry.avoid-overlap") && oc.isDefault("geometry.avoid-overlap") && oc.getBool("geometry.avoid-overlap") != myGeomAvoidOverlap) {
345 oc.set("geometry.avoid-overlap", toString(myGeomAvoidOverlap));
346 }
347 if (oc.isWriteable("junctions.higher-speed") && oc.isDefault("junctions.higher-speed") && oc.getBool("junctions.higher-speed") != myJunctionsHigherSpeed) {
348 oc.set("junctions.higher-speed", toString(myJunctionsHigherSpeed));
349 }
350 if (oc.isWriteable("internal-junctions.vehicle-width") && oc.isDefault("internal-junctions.vehicle-width") && oc.getFloat("internal-junctions.vehicle-width") != myInternalJunctionsVehicleWidth) {
351 oc.set("internal-junctions.vehicle-width", toString(myInternalJunctionsVehicleWidth));
352 }
353 if (oc.isWriteable("junctions.minimal-shape") && oc.isDefault("junctions.minimal-shape") && oc.getBool("junctions.minimal-shape") != myJunctionsMinimalShape) {
354 oc.set("junctions.minimal-shape", toString(myJunctionsMinimalShape));
355 }
356 if (oc.isWriteable("junctions.endpoint-shape") && oc.isDefault("junctions.endpoint-shape") && oc.getBool("junctions.endpoint-shape") != myJunctionsEndpointShape) {
357 oc.set("junctions.endpoint-shape", toString(myJunctionsEndpointShape));
358 }
359 if (!deprecatedVehicleClassesSeen.empty()) {
360 WRITE_WARNINGF(TL("Deprecated vehicle class(es) '%' in input network."), toString(deprecatedVehicleClassesSeen));
362 }
363 if (!oc.getBool("no-internal-links")) {
364 // add loaded crossings
365 for (const auto& crossIt : myPedestrianCrossings) {
366 NBNode* const node = myNodeCont.retrieve(crossIt.first);
367 for (const Crossing& crossing : crossIt.second) {
368 EdgeVector edges;
369 for (const std::string& edgeID : crossing.crossingEdges) {
370 NBEdge* edge = myNetBuilder.getEdgeCont().retrieve(edgeID);
371 // edge might have been removed due to options
372 if (edge != nullptr) {
373 edges.push_back(edge);
374 }
375 }
376 if (!edges.empty()) {
377 node->addCrossing(edges, crossing.width, crossing.priority,
378 crossing.customTLIndex, crossing.customTLIndex2, crossing.customShape, true, &crossing);
379 }
380 }
381 }
383 // add walking area custom shapes
384 for (const auto& item : myWACustomShapes) {
385 std::string nodeID = SUMOXMLDefinitions::getJunctionIDFromInternalEdge(item.first);
386 NBNode* node = myNodeCont.retrieve(nodeID);
387 std::vector<std::string> edgeIDs;
388 if (item.second.fromEdges.size() + item.second.toEdges.size() == 0) {
389 // must be a split crossing
390 assert(item.second.fromCrossed.size() > 0);
391 assert(item.second.toCrossed.size() > 0);
392 edgeIDs = item.second.fromCrossed;
393 edgeIDs.insert(edgeIDs.end(), item.second.toCrossed.begin(), item.second.toCrossed.end());
394 } else if (item.second.fromEdges.size() > 0) {
395 edgeIDs = item.second.fromEdges;
396 } else {
397 edgeIDs = item.second.toEdges;
398 }
399 EdgeVector edges;
400 for (const std::string& edgeID : edgeIDs) {
401 NBEdge* edge = myNetBuilder.getEdgeCont().retrieve(edgeID);
402 // edge might have been removed due to options
403 if (edge != nullptr) {
404 edges.push_back(edge);
405 }
406 }
407 if (edges.size() > 0) {
408 node->addWalkingAreaShape(edges, item.second.shape, item.second.width);
409 }
410 }
411 }
412 // add roundabouts
413 for (const std::vector<std::string>& ra : myRoundabouts) {
414 EdgeSet roundabout;
415 for (const std::string& edgeID : ra) {
416 NBEdge* edge = myNetBuilder.getEdgeCont().retrieve(edgeID);
417 if (edge == nullptr) {
418 if (!myNetBuilder.getEdgeCont().wasIgnored(edgeID)) {
419 WRITE_ERRORF(TL("Unknown edge '%' in roundabout"), (edgeID));
420 }
421 } else {
422 roundabout.insert(edge);
423 }
424 }
426 }
427}
428
429
430void
432 const SUMOSAXAttributes& attrs) {
433 /* our goal is to reproduce the input net faithfully
434 * there are different types of objects in the netfile:
435 * 1) those which must be loaded into NBNetBuilder-Containers for processing
436 * 2) those which can be ignored because they are recomputed based on group 1
437 * 3) those which are of no concern to NBNetBuilder but should be exposed to
438 * netedit. We will probably have to patch NBNetBuilder to contain them
439 * and hand them over to netedit
440 * alternative idea: those shouldn't really be contained within the
441 * network but rather in separate files. teach netedit how to open those
442 * (POI?)
443 * 4) those which are of concern neither to NBNetBuilder nor netedit and
444 * must be copied over - need to patch NBNetBuilder for this.
445 * copy unknown by default
446 */
447 switch (element) {
448 case SUMO_TAG_NET: {
449 bool ok;
450 myNetworkVersion = StringUtils::toVersion(attrs.get<std::string>(SUMO_ATTR_VERSION, nullptr, ok, false));
451 myAmLefthand = attrs.getOpt<bool>(SUMO_ATTR_LEFTHAND, nullptr, ok, false);
452 myCornerDetail = attrs.getOpt<int>(SUMO_ATTR_CORNERDETAIL, nullptr, ok, 0);
453 myLinkDetail = attrs.getOpt<int>(SUMO_ATTR_LINKDETAIL, nullptr, ok, -1);
454 myRectLaneCut = attrs.getOpt<bool>(SUMO_ATTR_RECTANGULAR_LANE_CUT, nullptr, ok, false);
455 myWalkingAreas = attrs.getOpt<bool>(SUMO_ATTR_WALKINGAREAS, nullptr, ok, false);
456 myLimitTurnSpeed = attrs.getOpt<double>(SUMO_ATTR_LIMIT_TURN_SPEED, nullptr, ok, -1);
457 myCheckLaneFoesAll = attrs.getOpt<bool>(SUMO_ATTR_CHECKLANEFOES_ALL, nullptr, ok, false);
460 myDefaultSpreadType = attrs.getOpt<std::string>(SUMO_ATTR_SPREADTYPE, nullptr, ok, myDefaultSpreadType);
466 // derived
468 myChangeLefthand = !oc.isDefault("lefthand") && (oc.getBool("lefthand") != myAmLefthand);
469
470 break;
471 }
472 case SUMO_TAG_EDGE:
473 addEdge(attrs);
474 break;
475 case SUMO_TAG_LANE:
476 addLane(attrs);
477 break;
478 case SUMO_TAG_STOPOFFSET: {
479 bool ok = true;
480 addStopOffsets(attrs, ok);
481 }
482 break;
483 case SUMO_TAG_NEIGH:
485 break;
487 addJunction(attrs);
488 break;
489 case SUMO_TAG_REQUEST:
490 addRequest(attrs);
491 break;
493 addConnection(attrs);
494 break;
495 case SUMO_TAG_TLLOGIC:
497 if (myCurrentTL) {
499 }
500 break;
501 case SUMO_TAG_PHASE:
502 addPhase(attrs, myCurrentTL);
503 break;
505 delete myLocation;
506 myLocation = loadLocation(attrs);
507 break;
509 addProhibition(attrs);
510 break;
512 addRoundabout(attrs);
513 break;
514 case SUMO_TAG_PARAM:
515 if (myLastParameterised.size() != 0) {
516 bool ok = true;
517 const std::string key = attrs.get<std::string>(SUMO_ATTR_KEY, nullptr, ok);
518 if (myDiscardableParams.count(key) == 0) {
519 // circumventing empty string test
520 const std::string val = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : "";
521 myLastParameterised.back()->setParameter(key, val);
522 }
523 }
524 break;
525 default:
526 myTypesHandler.myStartElement(element, attrs);
527 break;
528 }
529}
530
531
532void
534 switch (element) {
535 case SUMO_TAG_EDGE:
536 if (myCurrentEdge != nullptr) {
537 if (myEdges.find(myCurrentEdge->id) != myEdges.end()) {
538 WRITE_WARNINGF(TL("Edge '%' occurred at least twice in the input."), myCurrentEdge->id);
539 for (LaneAttrs* const lane : myCurrentEdge->lanes) {
540 delete lane;
541 }
542 delete myCurrentEdge;
543 } else {
545 }
546 myCurrentEdge = nullptr;
547 myLastParameterised.pop_back();
548 }
549 break;
550 case SUMO_TAG_LANE:
551 if (myCurrentEdge != nullptr && myCurrentLane != nullptr) {
554 myLastParameterised.pop_back();
555 }
556 myCurrentLane = nullptr;
557 break;
558 case SUMO_TAG_TLLOGIC:
559 if (myCurrentTL == nullptr) {
560 WRITE_ERROR(TL("Unmatched closing tag for tl-logic."));
561 } else {
563 WRITE_WARNINGF(TL("Could not add program '%' for traffic light '%'"), myCurrentTL->getProgramID(), myCurrentTL->getID());
564 delete myCurrentTL;
565 }
566 myCurrentTL = nullptr;
567 myLastParameterised.pop_back();
568 }
569 break;
571 if (myCurrentJunction.node != nullptr) {
572 myLastParameterised.pop_back();
573 }
574 break;
576 // !!! this just avoids a crash but is not a real check that it was a connection
577 if (!myLastParameterised.empty()) {
578 myLastParameterised.pop_back();
579 }
580 break;
581 default:
582 break;
583 }
584}
585
586
587void
589 // get the id, report an error if not given or empty...
590 bool ok = true;
591 const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
592 if (!ok) {
593 return;
594 }
595 myCurrentEdge = new EdgeAttrs();
597 myCurrentEdge->builtEdge = nullptr;
598 myCurrentEdge->id = id;
599 // get the function
602 // add the crossing but don't do anything else
603 Crossing c(id);
604 c.crossingEdges = attrs.get<std::vector<std::string> >(SUMO_ATTR_CROSSING_EDGES, nullptr, ok);
606 return;
609 return; // skip internal edges
610 }
611 // get the origin and the destination node
612 myCurrentEdge->fromNode = attrs.getOpt<std::string>(SUMO_ATTR_FROM, id.c_str(), ok, "");
613 myCurrentEdge->toNode = attrs.getOpt<std::string>(SUMO_ATTR_TO, id.c_str(), ok, "");
614 myCurrentEdge->priority = attrs.getOpt<int>(SUMO_ATTR_PRIORITY, id.c_str(), ok, -1);
615 myCurrentEdge->type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, "");
616 myCurrentEdge->routingType = attrs.getOpt<std::string>(SUMO_ATTR_ROUTINGTYPE, id.c_str(), ok, "");
621 myCurrentEdge->streetName = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok, "");
622 myCurrentEdge->distance = attrs.getOpt<double>(SUMO_ATTR_DISTANCE, id.c_str(), ok, 0);
623 myCurrentEdge->bidi = attrs.getOpt<std::string>(SUMO_ATTR_BIDI, id.c_str(), ok, "");
624 if (myCurrentEdge->streetName != "" && OptionsCont::getOptions().isDefault("output.street-names")) {
625 OptionsCont::getOptions().set("output.street-names", "true");
626 }
627
628 std::string lsfS = attrs.getOpt<std::string>(SUMO_ATTR_SPREADTYPE, id.c_str(), ok, myDefaultSpreadType);
629 if (SUMOXMLDefinitions::LaneSpreadFunctions.hasString(lsfS)) {
631 } else {
632 WRITE_ERRORF(TL("Unknown spreadType '%' for edge '%'."), lsfS, id);
633 }
634}
635
636
637void
639 bool ok = true;
640 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
641 if (!ok) {
642 return;
643 }
644 if (myCurrentEdge == nullptr) {
645 WRITE_ERRORF(TL("Found lane '%' not within edge element."), id);
646 return;
647 }
648 const std::string expectedID = myCurrentEdge->id + "_" + toString(myCurrentEdge->lanes.size());
649 if (id != expectedID) {
650 WRITE_WARNINGF(TL("Renaming lane '%' to '%'."), id, expectedID);
651 }
652 myCurrentLane = new LaneAttrs();
654 myCurrentLane->customShape = attrs.getOpt<bool>(SUMO_ATTR_CUSTOMSHAPE, nullptr, ok, false);
655 myCurrentLane->shape = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), ok);
656 myCurrentLane->width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, id.c_str(), ok, (double) NBEdge::UNSPECIFIED_WIDTH);
657 myCurrentLane->type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, "");
659 // save the width and the lane id of the crossing but don't do anything else
661 assert(crossings.size() > 0);
662 crossings.back().width = attrs.get<double>(SUMO_ATTR_WIDTH, id.c_str(), ok);
663 myLastParameterised.pop_back();
664 myLastParameterised.push_back(&crossings.back());
666 crossings.back().customShape = myCurrentLane->shape;
667 NBNetBuilder::transformCoordinates(crossings.back().customShape, true, myLocation);
668 }
670 // save custom shape if needed but don't do anything else
673 wacs.shape = myCurrentLane->shape;
674 wacs.width = myCurrentLane->width;
677 }
678 return;
680 return; // skip internal edges
681 }
682 if (attrs.hasAttribute("maxspeed")) {
683 // !!! deprecated
684 myCurrentLane->maxSpeed = attrs.getFloat("maxspeed");
685 } else {
686 myCurrentLane->maxSpeed = attrs.get<double>(SUMO_ATTR_SPEED, id.c_str(), ok);
687 }
688 myCurrentLane->friction = attrs.getOpt<double>(SUMO_ATTR_FRICTION, id.c_str(), ok, NBEdge::UNSPECIFIED_FRICTION, false); //sets 1 on empty
689 try {
690 myCurrentLane->allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, id.c_str(), ok, "", false);
691 } catch (EmptyData&) {
692 // !!! deprecated
693 myCurrentLane->allow = "";
694 }
695 myCurrentLane->disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, id.c_str(), ok, "");
696 myCurrentLane->endOffset = attrs.getOpt<double>(SUMO_ATTR_ENDOFFSET, id.c_str(), ok, (double) NBEdge::UNSPECIFIED_OFFSET);
697 myCurrentLane->accelRamp = attrs.getOpt<bool>(SUMO_ATTR_ACCELERATION, id.c_str(), ok, false);
698 myCurrentLane->changeLeft = attrs.getOpt<std::string>(SUMO_ATTR_CHANGE_LEFT, id.c_str(), ok, "");
699 myCurrentLane->changeRight = attrs.getOpt<std::string>(SUMO_ATTR_CHANGE_RIGHT, id.c_str(), ok, "");
700 if (myChangeLefthand) {
702 }
703
704 // lane coordinates are derived (via lane spread) do not include them in convex boundary
706}
707
708
709void
711 const StopOffset offset(attrs, ok);
712 if (!ok) {
713 return;
714 }
715 // Admissibility of value will be checked in _loadNetwork(), when lengths are known
716 if (myCurrentLane == nullptr) {
718 WRITE_WARNINGF(TL("Duplicate definition of stopOffset for edge %.\nIgnoring duplicate specification."), myCurrentEdge->id);
719 } else {
721 }
722 } else {
724 WRITE_WARNINGF(TL("Duplicate definition of lane's stopOffset on edge %.\nIgnoring duplicate specifications."), myCurrentEdge->id);
725 } else {
727 }
728 }
729}
730
731
732void
734 // get the id, report an error if not given or empty...
735 myCurrentJunction.node = nullptr;
737 bool ok = true;
738 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
739 if (!ok) {
740 return;
741 }
742 if (id[0] == ':') { // internal node
743 return;
744 }
746 if (ok) {
748 // dead end is a computed status. Reset this to unknown so it will
749 // be corrected if additional connections are loaded
751 } else if (type == SumoXMLNodeType::INTERNAL) {
752 WRITE_WARNINGF("Invalid node type '%' for junction '%' in input network", toString(SumoXMLNodeType::INTERNAL), id);
754 }
755 }
756 Position pos = readPosition(attrs, id, ok);
758 NBNode* node = new NBNode(id, pos, type);
759 if (!myNodeCont.insert(node)) {
760 WRITE_WARNINGF(TL("Junction '%' occurred at least twice in the input."), id);
761 delete node;
763 return;
764 } else {
765 myLastParameterised.push_back(node);
766 }
767 myCurrentJunction.node = node;
768 // set optional radius
769 if (attrs.hasAttribute(SUMO_ATTR_RADIUS)) {
770 node->setRadius(attrs.get<double>(SUMO_ATTR_RADIUS, id.c_str(), ok));
771 }
772 // handle custom shape
773 if (attrs.getOpt<bool>(SUMO_ATTR_CUSTOMSHAPE, id.c_str(), ok, false)) {
774 PositionVector shape = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), ok);
776 node->setCustomShape(shape);
777 }
779 // both types of nodes come without a tlLogic
780 myRailSignals.insert(id);
781 }
782 node->setRightOfWay(attrs.getOpt<RightOfWay>(SUMO_ATTR_RIGHT_OF_WAY, id.c_str(), ok, node->getRightOfWay()));
783 node->setFringeType(attrs.getOpt<FringeType>(SUMO_ATTR_FRINGE, id.c_str(), ok, node->getFringeType()));
784 node->setRoundaboutType(attrs.getOpt<RoundaboutType>(SUMO_ATTR_ROUNDABOUT, id.c_str(), ok, node->getRoundaboutType()));
785 if (attrs.hasAttribute(SUMO_ATTR_NAME)) {
786 node->setName(attrs.get<std::string>(SUMO_ATTR_NAME, id.c_str(), ok));
787 }
788}
789
790
791void
793 if (myCurrentJunction.node != nullptr) {
794 bool ok = true;
795 myCurrentJunction.response.push_back(attrs.get<std::string>(SUMO_ATTR_RESPONSE, nullptr, ok));
796 }
797}
798
799
800void
802 bool ok = true;
803 std::string fromID = attrs.get<std::string>(SUMO_ATTR_FROM, nullptr, ok);
804 if (myEdges.count(fromID) == 0) {
805 WRITE_ERRORF(TL("Unknown edge '%' given in connection."), fromID);
806 return;
807 }
808 EdgeAttrs* from = myEdges[fromID];
809 if (from->func == SumoXMLEdgeFunc::INTERNAL) {
810 // internal junction connection
811 return;
812 }
813
814 Connection conn;
815 conn.toEdgeID = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
816 int fromLaneIdx = attrs.get<int>(SUMO_ATTR_FROM_LANE, nullptr, ok);
817 conn.toLaneIdx = attrs.get<int>(SUMO_ATTR_TO_LANE, nullptr, ok);
818 conn.tlID = attrs.getOpt<std::string>(SUMO_ATTR_TLID, nullptr, ok, "");
819 conn.mayDefinitelyPass = attrs.getOpt<bool>(SUMO_ATTR_PASS, nullptr, ok, false);
820 conn.keepClear = attrs.getOpt<bool>(SUMO_ATTR_KEEP_CLEAR, nullptr, ok, true);
821 conn.indirectLeft = attrs.getOpt<bool>(SUMO_ATTR_INDIRECT, nullptr, ok, false);
822 conn.edgeType = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, nullptr, ok, "");
823 double contPos = NBEdge::UNSPECIFIED_CONTPOS;
824 if (OptionsCont::getOptions().isSet("default.connection.cont-pos")) {
825 contPos = OptionsCont::getOptions().getFloat("default.connection.cont-pos");
826 }
827 conn.contPos = attrs.getOpt<double>(SUMO_ATTR_CONTPOS, nullptr, ok, contPos);
829 std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, nullptr, ok, "", false);
830 std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, nullptr, ok, "", false);
831 if (allow == "" && disallow == "") {
833 } else {
834 conn.permissions = parseVehicleClasses(allow, disallow, myNetworkVersion);
835 }
837 conn.changeLeft = parseVehicleClasses(attrs.get<std::string>(SUMO_ATTR_CHANGE_LEFT, nullptr, ok), "");
838 } else {
840 }
842 conn.changeRight = parseVehicleClasses(attrs.get<std::string>(SUMO_ATTR_CHANGE_RIGHT, nullptr, ok), "");
843 } else {
845 }
846 if (myChangeLefthand) {
847 std::swap(conn.changeLeft, conn.changeRight);
848 }
849 conn.speed = attrs.getOpt<double>(SUMO_ATTR_SPEED, nullptr, ok, NBEdge::UNSPECIFIED_SPEED);
850 conn.friction = attrs.getOpt<double>(SUMO_ATTR_FRICTION, nullptr, ok, NBEdge::UNSPECIFIED_FRICTION);
851 conn.customLength = attrs.getOpt<double>(SUMO_ATTR_LENGTH, nullptr, ok, NBEdge::UNSPECIFIED_LOADED_LENGTH);
855 if (conn.tlID != "") {
856 conn.tlLinkIndex = attrs.get<int>(SUMO_ATTR_TLLINKINDEX, nullptr, ok);
857 conn.tlLinkIndex2 = attrs.getOpt<int>(SUMO_ATTR_TLLINKINDEX2, nullptr, ok, -1);
858 } else {
860 }
861 if ((int)from->lanes.size() <= fromLaneIdx) {
862 WRITE_ERRORF(TL("Invalid lane index '%' for connection from '%'."), toString(fromLaneIdx), fromID);
863 return;
864 }
865 from->lanes[fromLaneIdx]->connections.push_back(conn);
866 myLastParameterised.push_back(&from->lanes[fromLaneIdx]->connections.back());
867
868 // determine crossing priority and tlIndex
869 if (myPedestrianCrossings.size() > 0) {
871 // connection from walkingArea to crossing
872 std::vector<Crossing>& crossings = myPedestrianCrossings[SUMOXMLDefinitions::getJunctionIDFromInternalEdge(fromID)];
873 for (std::vector<Crossing>::iterator it = crossings.begin(); it != crossings.end(); ++it) {
874 if (conn.toEdgeID == (*it).edgeID) {
875 if (conn.tlID != "") {
876 (*it).priority = true;
877 (*it).customTLIndex = conn.tlLinkIndex;
878 } else {
879 LinkState state = SUMOXMLDefinitions::LinkStates.get(attrs.get<std::string>(SUMO_ATTR_STATE, nullptr, ok));
880 (*it).priority = state == LINKSTATE_MAJOR;
881 }
882 }
883 }
884 } else if (from->func == SumoXMLEdgeFunc::CROSSING && myEdges[conn.toEdgeID]->func == SumoXMLEdgeFunc::WALKINGAREA) {
885 // connection from crossing to walkingArea (set optional linkIndex2)
887 if (fromID == c.edgeID) {
888 c.customTLIndex2 = attrs.getOpt<int>(SUMO_ATTR_TLLINKINDEX, nullptr, ok, -1);
889 }
890 }
891 }
892 }
893 // determine walking area reference edges
894 if (myWACustomShapes.size() > 0) {
895 EdgeAttrs* to = myEdges[conn.toEdgeID];
896 if (from->func == SumoXMLEdgeFunc::WALKINGAREA) {
897 std::map<std::string, WalkingAreaParsedCustomShape>::iterator it = myWACustomShapes.find(fromID);
898 if (it != myWACustomShapes.end()) {
899 if (to->func == SumoXMLEdgeFunc::NORMAL) {
900 // add target sidewalk as reference
901 it->second.toEdges.push_back(conn.toEdgeID);
902 } else if (to->func == SumoXMLEdgeFunc::CROSSING) {
903 // add target crossing edges as reference
905 if (conn.toEdgeID == crossing.edgeID) {
906 it->second.toCrossed.insert(it->second.toCrossed.end(), crossing.crossingEdges.begin(), crossing.crossingEdges.end());
907 }
908 }
909 }
910 }
911 } else if (to->func == SumoXMLEdgeFunc::WALKINGAREA) {
912 std::map<std::string, WalkingAreaParsedCustomShape>::iterator it = myWACustomShapes.find(conn.toEdgeID);
913 if (it != myWACustomShapes.end()) {
914 if (from->func == SumoXMLEdgeFunc::NORMAL) {
915 // add origin sidewalk as reference
916 it->second.fromEdges.push_back(fromID);
917 } else if (from->func == SumoXMLEdgeFunc::CROSSING) {
918 // add origin crossing edges as reference
920 if (fromID == crossing.edgeID) {
921 it->second.fromCrossed.insert(it->second.fromCrossed.end(), crossing.crossingEdges.begin(), crossing.crossingEdges.end());
922 }
923 }
924 }
925 }
926 }
927 }
928}
929
930
931void
933 bool ok = true;
934 std::string prohibitor = attrs.getOpt<std::string>(SUMO_ATTR_PROHIBITOR, nullptr, ok, "");
935 std::string prohibited = attrs.getOpt<std::string>(SUMO_ATTR_PROHIBITED, nullptr, ok, "");
936 if (!ok) {
937 return;
938 }
939 Prohibition p;
942 if (!ok) {
943 return;
944 }
945 myProhibitions.push_back(p);
946}
947
948
951 if (currentTL) {
952 WRITE_ERRORF(TL("Definition of tl-logic '%' was not finished."), currentTL->getID());
953 return nullptr;
954 }
955 bool ok = true;
956 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
957 SUMOTime offset = attrs.getOptOffsetReporting(SUMO_ATTR_OFFSET, id.c_str(), ok, 0);
958 std::string programID = attrs.getOpt<std::string>(SUMO_ATTR_PROGRAMID, id.c_str(), ok, "<unknown>");
959 std::string typeS = attrs.get<std::string>(SUMO_ATTR_TYPE, nullptr, ok);
960 TrafficLightType type;
961 if (SUMOXMLDefinitions::TrafficLightTypes.hasString(typeS)) {
963 } else {
964 WRITE_ERRORF(TL("Unknown traffic light type '%' for tlLogic '%'."), typeS, id);
965 return nullptr;
966 }
967 if (ok) {
968 return new NBLoadedSUMOTLDef(id, programID, offset, type);
969 } else {
970 return nullptr;
971 }
972}
973
974
975void
977 if (!currentTL) {
978 WRITE_ERROR(TL("found phase without tl-logic"));
979 return;
980 }
981 const std::string& id = currentTL->getID();
982 bool ok = true;
983 std::string state = attrs.get<std::string>(SUMO_ATTR_STATE, id.c_str(), ok);
984 SUMOTime duration = TIME2STEPS(attrs.get<double>(SUMO_ATTR_DURATION, id.c_str(), ok));
985 if (duration < 0) {
986 WRITE_ERRORF(TL("Phase duration for tl-logic '%/%' must be positive."), id, currentTL->getProgramID());
987 return;
988 }
989 // if the traffic light is an actuated traffic light, try to get the minimum and maximum durations and ends
990 std::vector<int> nextPhases = attrs.getOpt<std::vector<int> >(SUMO_ATTR_NEXT, id.c_str(), ok);
991 const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, nullptr, ok);
992 // Specific from actuated
997 // specific von NEMA
1001 if (ok) {
1002 currentTL->addPhase(duration, state, minDuration, maxDuration, earliestEnd, latestEnd, vehExt, yellow, red, nextPhases, name);
1003 }
1004}
1005
1006
1009 // @todo refactor parsing of location since its duplicated in NLHandler and PCNetProjectionLoader
1010 bool ok = true;
1011 GeoConvHelper* result = nullptr;
1012 const Position offset = attrs.get<Position>(SUMO_ATTR_NET_OFFSET, nullptr, ok);
1013 const Boundary convBoundary = attrs.get<Boundary>(SUMO_ATTR_CONV_BOUNDARY, nullptr, ok);
1014 const Boundary origBoundary = attrs.get<Boundary>(SUMO_ATTR_ORIG_BOUNDARY, nullptr, ok);
1015 const std::string proj = attrs.get<std::string>(SUMO_ATTR_ORIG_PROJ, nullptr, ok);
1016 if (ok) {
1017 result = new GeoConvHelper(proj, offset, origBoundary, convBoundary);
1018 result->resolveAbstractProjection();
1019 if (setLoaded) {
1020 GeoConvHelper::setLoaded(*result);
1021 }
1022 }
1023 return result;
1024}
1025
1026
1028NIImporter_SUMO::readPosition(const SUMOSAXAttributes& attrs, const std::string& id, bool& ok) {
1029 const double x = attrs.get<double>(SUMO_ATTR_X, id.c_str(), ok);
1030 const double y = attrs.get<double>(SUMO_ATTR_Y, id.c_str(), ok);
1031 const double z = attrs.getOpt<double>(SUMO_ATTR_Z, id.c_str(), ok, 0.);
1032 return Position(x, y, z);
1033}
1034
1035
1036void
1037NIImporter_SUMO::parseProhibitionConnection(const std::string& attr, std::string& from, std::string& to, bool& ok) {
1038 // split from/to
1039 const std::string::size_type div = attr.find("->");
1040 if (div == std::string::npos) {
1041 WRITE_ERRORF(TL("Missing connection divider in prohibition attribute '%'"), attr);
1042 ok = false;
1043 }
1044 from = attr.substr(0, div);
1045 to = attr.substr(div + 2);
1046 // check whether the edges are known
1047 if (myEdges.count(from) == 0) {
1048 WRITE_ERRORF(TL("Unknown edge prohibition '%'"), from);
1049 ok = false;
1050 }
1051 if (myEdges.count(to) == 0) {
1052 WRITE_ERRORF(TL("Unknown edge prohibition '%'"), to);
1053 ok = false;
1054 }
1055}
1056
1057
1058void
1060 bool ok = true;
1061 const std::vector<std::string>& edgeIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_EDGES, nullptr, ok);
1062 if (ok) {
1063 myRoundabouts.push_back(edgeIDs);
1064 }
1065}
1066
1067
1068/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define WRITE_ERRORF(...)
Definition MsgHandler.h:296
#define WRITE_ERROR(msg)
Definition MsgHandler.h:295
#define PROGRESS_BEGIN_TIME_MESSAGE(msg)
Definition MsgHandler.h:292
#define TL(string)
Definition MsgHandler.h:304
#define PROGRESS_TIME_MESSAGE(before)
Definition MsgHandler.h:293
std::set< NBEdge * > EdgeSet
container for unique edges
Definition NBCont.h:50
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
Definition NBCont.h:42
@ KEEPCLEAR_FALSE
Definition NBCont.h:59
@ KEEPCLEAR_TRUE
Definition NBCont.h:60
#define TIME2STEPS(x)
Definition SUMOTime.h:60
std::set< std::string > deprecatedVehicleClassesSeen
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...
@ RIGHT
At the rightmost side of the lane.
@ SUMO_TAG_PHASE
a single phase description
@ SUMO_TAG_NET
root element of a network file
@ SUMO_TAG_STOPOFFSET
Information on vClass specific stop offsets at lane end.
@ SUMO_TAG_REQUEST
description of a logic request within the junction
@ SUMO_TAG_PROHIBITION
prohibition of circulation between two edges
@ SUMO_TAG_LOCATION
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_ROUNDABOUT
roundabout defined in junction
@ SUMO_TAG_TLLOGIC
a traffic light logic
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_PARAM
parameter associated to a certain key
@ SUMO_TAG_NEIGH
begin/end of the description of a neighboring lane
@ SUMO_TAG_EDGE
begin/end of the description of an edge
LaneSpreadFunction
Numbers representing special SUMO-XML-attribute values Information how the edge's lateral offset shal...
RoundaboutType
classifying roundabout type for nodes
FringeType
classifying boundary nodes
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_MAJOR
This is an uncontrolled, major link, may pass.
SumoXMLNodeType
Numbers representing special SUMO-XML-attribute values for representing node- (junction-) types used ...
RightOfWay
algorithms for computing right of way
@ SUMO_ATTR_JUNCTIONS_MINIMAL_SHAPE
@ SUMO_ATTR_DISALLOW
@ SUMO_ATTR_CONV_BOUNDARY
@ SUMO_ATTR_ALLOW
@ SUMO_ATTR_LANE
@ SUMO_ATTR_NET_OFFSET
@ SUMO_ATTR_ORIG_BOUNDARY
@ SUMO_ATTR_LATEST_END
The maximum time within the cycle for switching (for coordinated actuation)
@ SUMO_ATTR_TLLINKINDEX2
link: the index of the opposite direction link of a pedestrian crossing
@ SUMO_ATTR_RED
red duration of a phase
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_LINKDETAIL
@ SUMO_ATTR_VALUE
@ SUMO_ATTR_CORNERDETAIL
@ SUMO_ATTR_RADIUS
The turning radius at an intersection in m.
@ SUMO_ATTR_INDIRECT
Whether this connection is an indirect (left) turn.
@ SUMO_ATTR_RECTANGULAR_LANE_CUT
@ SUMO_ATTR_Y
@ SUMO_ATTR_FROM_LANE
@ SUMO_ATTR_Z
@ SUMO_ATTR_RESPONSE
@ SUMO_ATTR_LIMIT_TURN_SPEED
@ SUMO_ATTR_CHECKLANEFOES_ROUNDABOUT
@ SUMO_ATTR_OFFSET
@ SUMO_ATTR_X
@ SUMO_ATTR_AVOID_OVERLAP
@ SUMO_ATTR_YELLOW
yellow duration of a phase
@ SUMO_ATTR_CUSTOMSHAPE
whether a given shape is user-defined
@ SUMO_ATTR_VEHICLEEXTENSION
vehicle extension time of a phase
@ SUMO_ATTR_EDGES
the edges of a route
@ SUMO_ATTR_FRINGE
Fringe type of node.
@ SUMO_ATTR_BIDI
@ SUMO_ATTR_PROHIBITED
@ SUMO_ATTR_PRIORITY
@ SUMO_ATTR_SHAPE
edge: the shape in xml-definition
@ SUMO_ATTR_LEFTHAND
@ SUMO_ATTR_NEXT
succesor phase index
@ SUMO_ATTR_CHANGE_LEFT
@ SUMO_ATTR_NAME
@ SUMO_ATTR_ORIG_PROJ
@ SUMO_ATTR_JUNCTIONS_ENDPOINT_SHAPE
@ SUMO_ATTR_CHECKLANEFOES_ALL
@ SUMO_ATTR_SPREADTYPE
The information about how to spread the lanes from the given position.
@ SUMO_ATTR_PASS
@ SUMO_ATTR_ENDOFFSET
@ SUMO_ATTR_HIGHER_SPEED
@ SUMO_ATTR_TO
@ SUMO_ATTR_FROM
@ SUMO_ATTR_ROUNDABOUT
Roundabout type of node.
@ SUMO_ATTR_ACCELERATION
@ SUMO_ATTR_CHANGE_RIGHT
@ SUMO_ATTR_TLID
link,node: the traffic light id responsible for this link
@ SUMO_ATTR_DISTANCE
@ SUMO_ATTR_TO_LANE
@ SUMO_ATTR_UNCONTROLLED
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_LENGTH
@ SUMO_ATTR_VERSION
@ SUMO_ATTR_ID
@ SUMO_ATTR_MAXDURATION
maximum duration of a phase
@ SUMO_ATTR_RIGHT_OF_WAY
How to compute right of way.
@ SUMO_ATTR_PROGRAMID
@ SUMO_ATTR_FUNCTION
@ SUMO_ATTR_VISIBILITY_DISTANCE
foe visibility distance of a link
@ SUMO_ATTR_PROHIBITOR
@ SUMO_ATTR_DURATION
@ SUMO_ATTR_CONTPOS
@ SUMO_ATTR_WIDTH
@ SUMO_ATTR_CROSSING_EDGES
the edges crossed by a pedestrian crossing
@ SUMO_ATTR_TLS_IGNORE_INTERNAL_JUNCTION_JAM
@ SUMO_ATTR_TLLINKINDEX
link: the index of the link within the traffic light
@ SUMO_ATTR_MINDURATION
@ SUMO_ATTR_KEY
@ SUMO_ATTR_KEEP_CLEAR
Whether vehicles must keep the junction clear.
@ SUMO_ATTR_INTERNAL_JUNCTIONS_VEHICLE_WIDTH
@ SUMO_ATTR_STATE
The state of a link.
@ SUMO_ATTR_FRICTION
@ SUMO_ATTR_WALKINGAREAS
@ SUMO_ATTR_ROUTINGTYPE
@ SUMO_ATTR_EARLIEST_END
The minimum time within the cycle for switching (for coordinated actuation)
T MAX2(T a, T b)
Definition StdDefs.h:86
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
A class that stores a 2D geometrical boundary.
Definition Boundary.h:39
static bool isReadable(std::string path)
Checks whether the given file is readable.
void setFileName(const std::string &name)
Sets the current file name.
static methods for processing the coordinates conversion for the current net
void resolveAbstractProjection()
init projString such as 'UTM' in loaded projection
static void setLoaded(const GeoConvHelper &loaded)
sets the coordinate transformation loaded from a location element
static const int InvalidTlIndex
void addRoundabout(const EdgeSet &roundabout)
add user specified roundabout
void erase(NBDistrictCont &dc, NBEdge *edge)
Removes the given edge from the container (deleting it)
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
bool ignoreFilterMatch(NBEdge *edge)
Returns true if this edge matches one of the removal criteria.
void ignore(std::string id)
mark the given edge id as ignored
Definition NBEdgeCont.h:488
bool wasIgnored(std::string id) const
Returns whether the edge with the id was ignored during parsing.
Definition NBEdgeCont.h:483
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
The representation of a single edge during network building.
Definition NBEdge.h:92
void setPermittedChanging(int lane, SVCPermissions changeLeft, SVCPermissions changeRight)
set allowed classes for changing to the left and right from the given lane
Definition NBEdge.cpp:4531
void setPermissions(SVCPermissions permissions, int lane=-1)
set allowed/disallowed classes for the given lane or for all lanes if -1 is given
Definition NBEdge.cpp:4503
void setSpeed(int lane, double speed)
set lane specific speed (negative lane implies set for all lanes)
Definition NBEdge.cpp:4455
double getLaneWidth() const
Returns the default width of lanes of this edge.
Definition NBEdge.h:648
NBNode * getToNode() const
Returns the destination node of the edge.
Definition NBEdge.h:552
Connection & getConnectionRef(int fromLane, const NBEdge *to, int toLane)
Returns reference to the specified connection This method goes through "myConnections" and returns th...
Definition NBEdge.cpp:1336
static const double UNSPECIFIED_FRICTION
unspecified lane friction
Definition NBEdge.h:355
Lane & getLaneStruct(int lane)
Definition NBEdge.h:1451
static const bool UNSPECIFIED_CONNECTION_UNCONTROLLED
TLS-controlled despite its node controlled not specified.
Definition NBEdge.h:376
bool addLane2LaneConnection(int fromLane, NBEdge *dest, int toLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, KeepClear keepClear=KEEPCLEAR_UNSPECIFIED, double contPos=UNSPECIFIED_CONTPOS, double visibility=UNSPECIFIED_VISIBILITY_DISTANCE, double speed=UNSPECIFIED_SPEED, double friction=UNSPECIFIED_FRICTION, double length=myDefaultConnectionLength, const PositionVector &customShape=PositionVector::EMPTY, const bool uncontrolled=UNSPECIFIED_CONNECTION_UNCONTROLLED, SVCPermissions permissions=SVC_UNSPECIFIED, const bool indirectLeft=false, const std::string &edgeType="", SVCPermissions changeLeft=SVC_UNSPECIFIED, SVCPermissions changeRight=SVC_UNSPECIFIED, bool postProcess=false)
Adds a connection between the specified this edge's lane and an approached one.
Definition NBEdge.cpp:1156
void setDistance(double distance)
set kilometrage at start of edge (negative value implies couting down along the edge)
Definition NBEdge.h:1425
bool setEdgeStopOffset(int lane, const StopOffset &offset, bool overwrite=false)
set lane and vehicle class specific stopOffset (negative lane implies set for all lanes)
Definition NBEdge.cpp:4425
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
Definition NBEdge.h:736
bool hasLaneSpecificStopOffsets() const
whether lanes differ in stopOffsets
Definition NBEdge.cpp:2528
const std::string & getID() const
Definition NBEdge.h:1551
static const double UNSPECIFIED_LOADED_LENGTH
no length override given
Definition NBEdge.h:364
void setLaneWidth(int lane, double width)
set lane specific width (negative lane implies set for all lanes)
Definition NBEdge.cpp:4326
void setAcceleration(int lane, bool accelRamp)
marks one lane as acceleration lane
Definition NBEdge.cpp:4487
const StopOffset & getEdgeStopOffset() const
Returns the stopOffset to the end of the edge.
Definition NBEdge.cpp:4393
void setBidi(bool isBidi)
mark this edge as a bidi edge
Definition NBEdge.h:1430
void setFriction(int lane, double friction)
set lane specific friction (negative lane implies set for all lanes)
Definition NBEdge.cpp:4471
static const double UNSPECIFIED_CONTPOS
unspecified internal junction position
Definition NBEdge.h:358
static const double UNSPECIFIED_VISIBILITY_DISTANCE
unspecified foe visibility for connections
Definition NBEdge.h:361
bool hasLaneSpecificWidth() const
whether lanes differ in width
Definition NBEdge.cpp:2495
static const double UNSPECIFIED_SPEED
unspecified lane speed
Definition NBEdge.h:352
@ VALIDATED
The connection was computed and validated.
bool hasLaneSpecificEndOffset() const
whether lanes differ in offset
Definition NBEdge.cpp:2517
void setLaneShape(int lane, const PositionVector &shape)
sets a custom lane shape
Definition NBEdge.cpp:4495
NBNode * getFromNode() const
Returns the origin node of the edge.
Definition NBEdge.h:545
static const double UNSPECIFIED_WIDTH
unspecified lane width
Definition NBEdge.h:346
void declareConnectionsAsLoaded(EdgeBuildingStep step=EdgeBuildingStep::LANES2LANES_USER)
declares connections as fully loaded. This is needed to avoid recomputing connections if an edge has ...
Definition NBEdge.h:1465
void setRoutingType(const std::string &routingType)
set the routingType for this edge
Definition NBEdge.h:1441
double getEndOffset() const
Returns the offset to the destination node.
Definition NBEdge.h:695
void setEndOffset(int lane, double offset)
set lane specific end-offset (negative lane implies set for all lanes)
Definition NBEdge.cpp:4409
static const double UNSPECIFIED_OFFSET
unspecified lane offset
Definition NBEdge.h:349
void setLoadedLength(double val)
set loaded length
Definition NBEdge.cpp:4555
A loaded (complete) traffic light logic.
void addPhase(const SUMOTime duration, const std::string &state, const SUMOTime minDur, const SUMOTime maxDur, const SUMOTime earliestEnd, const SUMOTime latestEnd, const SUMOTime vehExt, const SUMOTime yellow, const SUMOTime red, const std::vector< int > &next, const std::string &name)
Adds a phase to the logic the new phase is inserted at the end of the list of already added phases.
void addConnection(NBEdge *from, NBEdge *to, int fromLane, int toLane, int linkIndex, int linkIndex2, bool reconstruct=true)
Adds a connection and immediately informs the edges.
Instance responsible for building networks.
static bool transformCoordinates(PositionVector &from, bool includeInBoundary=true, GeoConvHelper *from_srs=nullptr)
static int addGeometrySegments(PositionVector &from, const PositionVector &cartesian, const double maxLength)
insertion geometry points to ensure maximum segment length between points
void setHaveNetworkCrossings(bool value)
enable crossing in networks
NBEdgeCont & getEdgeCont()
NBDistrictCont & getDistrictCont()
Returns a reference the districts container.
static bool transformCoordinate(Position &from, bool includeInBoundary=true, GeoConvHelper *from_srs=nullptr)
transforms loaded coordinates handles projections, offsets (using GeoConvHelper) and import of height...
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
Represents a single node (junction) during network building.
Definition NBNode.h:66
void addWalkingAreaShape(EdgeVector edges, const PositionVector &shape, double width)
add custom shape for walkingArea
Definition NBNode.cpp:4017
RightOfWay getRightOfWay() const
Returns hint on how to compute right of way.
Definition NBNode.h:300
NBNode::Crossing * addCrossing(EdgeVector edges, double width, bool priority, int tlIndex=-1, int tlIndex2=-1, const PositionVector &customShape=PositionVector::EMPTY, bool fromSumoNet=false, const Parameterised *params=nullptr)
add a pedestrian crossing to this node
Definition NBNode.cpp:4083
FringeType getFringeType() const
Returns fringe type.
Definition NBNode.h:305
SumoXMLNodeType getType() const
Returns the type of this node.
Definition NBNode.h:285
bool isTrafficLight() const
Definition NBNode.h:839
void setRoundaboutType(RoundaboutType roundaboutType)
set roundabout type
Definition NBNode.h:591
void setRightOfWay(RightOfWay rightOfWay)
set method for computing right-of-way
Definition NBNode.h:581
void setCustomShape(const PositionVector &shape)
set the junction shape
Definition NBNode.cpp:2790
void addSortedLinkFoes(const NBConnection &mayDrive, const NBConnection &mustStop)
add shorted link FOES
Definition NBNode.cpp:2025
void setRadius(double radius)
set the turning radius
Definition NBNode.h:571
void setName(const std::string &name)
set intersection name
Definition NBNode.h:596
const Position & getPosition() const
Definition NBNode.h:260
RoundaboutType getRoundaboutType() const
Returns roundabout type.
Definition NBNode.h:310
void setFringeType(FringeType fringeType)
set fringe type
Definition NBNode.h:586
const std::string & getProgramID() const
Returns the ProgramID.
static const SUMOTime UNSPECIFIED_DURATION
const std::map< std::string, NBTrafficLightDefinition * > & getPrograms(const std::string &id) const
Returns all programs for the given tl-id.
bool insert(NBTrafficLightDefinition *logic, bool forceInsert=false)
Adds a logic definition to the dictionary.
A connection description.
PositionVector customShape
custom shape connection
std::string tlID
The id of the traffic light that controls this connection.
double speed
custom speed for connection
std::string edgeType
optional edge type
std::string toEdgeID
The id of the target edge.
double customLength
custom length for connection
double contPos
custom position for internal junction on this connection
int toLaneIdx
The index of the target lane.
double friction
custom friction for connection
int tlLinkIndex
The index of this connection within the controlling traffic light.
bool indirectLeft
Whether this connection is an indirect left turn.
double visibility
custom foe visibility for connection
bool mayDefinitelyPass
Information about being definitely free to drive (on-ramps)
SVCPermissions changeLeft
custom lane changing permissions for connection
SVCPermissions changeRight
custom lane changing permissions for connection
bool uncontrolled
if set to true, This connection will not be TLS-controlled despite its node being controlled.
SVCPermissions permissions
custom permissions for connection
Describes the values found in an edge's definition and this edge's lanes.
std::string bidi
the bidi edge
LaneSpreadFunction lsf
The lane spread function.
std::vector< LaneAttrs * > lanes
The friction on this edge.
StopOffset edgeStopOffset
This edge's vehicle specific stop offsets (used for lanes, that do not have a specified stopOffset)
PositionVector shape
This edges's shape.
int priority
This edge's priority.
std::string toNode
The node this edge ends at.
std::string routingType
This edge's routing type.
std::string type
This edge's type.
double maxSpeed
The maximum velocity allowed on this edge (!!!)
NBEdge * builtEdge
The built edge.
SumoXMLEdgeFunc func
This edge's function.
std::string streetName
This edge's street name.
std::string fromNode
The node this edge starts at.
double length
The length of the edge if set explicitly.
std::string id
This edge's id.
double distance
The position at the start of this edge (kilometrage/mileage)
Describes the values found in a lane's definition.
double maxSpeed
The maximum velocity allowed on this lane.
double friction
The friction on this lane.
std::string changeRight
This lane's vehicle classes allowed to change right.
double endOffset
This lane's offset from the intersection.
bool accelRamp
Whether this lane is an acceleration lane.
std::string oppositeID
This lane's opposite lane.
std::string type
the type of this lane
std::vector< Connection > connections
This lane's connections.
bool customShape
Whether this lane has a custom shape.
StopOffset laneStopOffset
This lane's vehicle specific stop offsets.
PositionVector shape
This lane's shape (may be custom)
std::string changeLeft
This lane's vehicle classes allowed to change left.
double width
The width of this lane.
std::string disallow
This lane's disallowed vehicle classes.
std::string allow
This lane's allowed vehicle classes.
Importer for networks stored in SUMO format.
GeoConvHelper * myLocation
The coordinate transformation which was used to build the loaded network.
static NBLoadedSUMOTLDef * initTrafficLightLogic(const SUMOSAXAttributes &attrs, NBLoadedSUMOTLDef *currentTL)
begins the reading of a traffic lights logic
void parseProhibitionConnection(const std::string &attr, std::string &from, std::string &to, bool &ok)
parses connection string of a prohibition (very old school)
~NIImporter_SUMO()
Destructor.
NIXMLTypesHandler myTypesHandler
The handler for parsing edge types and restrictions.
int myCornerDetail
the level of corner detail in the loaded network
bool myCheckLaneFoesAll
whether foe-relationships where checked at lane-level
double myLimitTurnSpeed
whether turning speed was limited in the network
std::set< std::string > myRailSignals
list of node id with rail signals (no NBTrafficLightDefinition exists)
bool myGeomAvoidOverlap
overlap option for loaded network
std::map< std::string, std::vector< Crossing > > myPedestrianCrossings
The pedestrian crossings found in the network.
JunctionAttrs myCurrentJunction
The currently parsed junction definition to help in reconstructing crossings.
static GeoConvHelper * loadLocation(const SUMOSAXAttributes &attrs, bool setLoaded=true)
Parses network location description and registers it with GeoConveHelper::setLoaded.
void addJunction(const SUMOSAXAttributes &attrs)
Parses a junction and saves it in the node control.
bool myAmLefthand
whether the loaded network was built for lefthand traffic
bool myRectLaneCut
whether all lanes of an edge should have the same stop line
std::vector< Parameterised * > myLastParameterised
element to receive parameters
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
double myInternalJunctionsVehicleWidth
custom settings for internal junction computation
std::string myDefaultSpreadType
default spreadType defined in the network
bool myJunctionsHigherSpeed
higherSpeed option for loaded network
NBLoadedSUMOTLDef * myCurrentTL
The currently parsed traffic light.
static void loadNetwork(OptionsCont &oc, NBNetBuilder &nb)
Loads content of the optionally given SUMO file.
std::vector< std::vector< std::string > > myRoundabouts
loaded roundabout edges
bool myChangeLefthand
whether the written network should have a different "handedness" (LHT/RHT) than the loaded network
void addConnection(const SUMOSAXAttributes &attrs)
Parses a connection and saves it into the lane's definition stored in "myCurrentLane".
void addEdge(const SUMOSAXAttributes &attrs)
Parses an edge and stores the values in "myCurrentEdge".
LaneAttrs * myCurrentLane
The currently parsed lanes's definition (to add the shape to)
void addLane(const SUMOSAXAttributes &attrs)
Parses a lane and stores the values in "myCurrentLane".
NBNodeCont & myNodeCont
The node container to fill.
EdgeAttrs * myCurrentEdge
The currently parsed edge's definition (to add loaded lanes to)
NBNetBuilder & myNetBuilder
The network builder to fill.
void addRoundabout(const SUMOSAXAttributes &attrs)
Parses a roundabout and stores it in myEdgeCont.
std::vector< Prohibition > myProhibitions
Loaded prohibitions.
MMVersion myNetworkVersion
the loaded network version
void _loadNetwork(OptionsCont &oc)
load the network
void myEndElement(int element)
Called when a closing tag occurs.
bool myTlsIgnoreInternalJunctionJam
whether some right-of-way checks at traffic light junctions should be disabled
bool myJunctionsMinimalShape
custom settings for junction shape computation
void addStopOffsets(const SUMOSAXAttributes &attrs, bool &ok)
parses stop offsets for the current lane or edge
static Position readPosition(const SUMOSAXAttributes &attrs, const std::string &id, bool &ok)
read position from the given attributes, attribute errors to id
static void addPhase(const SUMOSAXAttributes &attrs, NBLoadedSUMOTLDef *currentTL)
adds a phase to the traffic lights logic currently build
int myLinkDetail
the level of geometry detail for internal lanes in the loaded network
std::map< std::string, WalkingAreaParsedCustomShape > myWACustomShapes
Map from walkingArea edge IDs to custom shapes.
bool myWalkingAreas
whether walkingareas must be built
NBTrafficLightLogicCont & myTLLCont
The node container to fill.
NIImporter_SUMO(NBNetBuilder &nb)
Constructor.
void addProhibition(const SUMOSAXAttributes &attrs)
Parses a prohibition and saves it.
void addRequest(const SUMOSAXAttributes &attrs)
Parses a request and saves selected attributes in myCurrentJunction.
std::set< std::string > myDiscardableParams
list of parameter keys to discard
std::map< std::string, EdgeAttrs * > myEdges
Loaded edge definitions.
bool myHaveSeenInternalEdge
whether the loaded network contains internal lanes
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag; Parses edge type information.
const std::string & getID() const
Returns the id.
Definition Named.h:74
A storage for options typed value containers)
Definition OptionsCont.h:89
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
bool isWriteable(const std::string &name)
Returns the information whether the named option may be set.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
bool set(const std::string &name, const std::string &value, const bool append=false)
Sets the given value for the named option.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
static OptionsCont & getOptions()
Retrieves the options.
bool isUsableFileList(const std::string &name) const
Checks whether the named option is usable as a file list (with at least a single file)
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
void updateParameters(const Parameterised::Map &mapArg)
Adds or updates all given parameters from the map.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
A list of positions.
static const PositionVector EMPTY
empty Vector
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 getOptOffsetReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a tls offset (SUMOTime or "begin")
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.
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.
double getFloat(int id) const
Returns the double-value of the named (by its enum-value) attribute.
SAX-handler base for SUMO-files.
static StringBijection< LaneSpreadFunction > LaneSpreadFunctions
lane spread functions
static StringBijection< TrafficLightType > TrafficLightTypes
traffic light types
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
stop offset
bool isDefined() const
check if stopOffset was defined
T get(const std::string &str) const
get key
static MMVersion toVersion(const std::string &sData)
parse a (network) version string
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false, const bool isRoute=false, const bool isExternal=false, const bool catchExceptions=true)
Runs the given handler on the given file; returns if everything's ok.
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
Definition json.hpp:21884
std::string type
the type of this lane
Definition NBEdge.h:192
std::string oppositeID
An opposite lane ID, if given.
Definition NBEdge.h:179
Describes a pedestrian crossing.
std::vector< std::string > crossingEdges
std::vector< std::string > response
Describes the values found in a prohibition.
Describes custom shape for a walking area during parsing.