60 #ifdef CHECK_MEMORY_LEAKS 62 #endif // CHECK_MEMORY_LEAKS 70 #define PARAMPOLY3_RES 2. 170 std::map<std::string, OpenDriveEdge*> edges;
173 std::vector<std::string> files = oc.
getStringVector(
"opendrive-files");
174 for (std::vector<std::string>::const_iterator file = files.begin(); file != files.end(); ++file) {
176 WRITE_ERROR(
"Could not open opendrive file '" + *file +
"'.");
179 handler.setFileName(*file);
185 std::map<std::string, OpenDriveEdge*> innerEdges, outerEdges;
186 for (std::map<std::string, OpenDriveEdge*>::iterator i = edges.begin(); i != edges.end(); ++i) {
187 if ((*i).second->isInner) {
188 innerEdges[(*i).first] = (*i).second;
190 outerEdges[(*i).first] = (*i).second;
205 std::map<std::string, Boundary> posMap;
206 std::map<std::string, std::string> edge2junction;
208 for (std::map<std::string, OpenDriveEdge*>::iterator i = innerEdges.begin(); i != innerEdges.end(); ++i) {
212 if (posMap.find(e->
junction) == posMap.end()) {
218 for (std::map<std::string, Boundary>::iterator i = posMap.begin(); i != posMap.end(); ++i) {
221 throw ProcessError(
"Could not add node '" + (*i).first +
"'.");
225 for (std::map<std::string, OpenDriveEdge*>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
227 for (std::vector<OpenDriveLink>::iterator j = e->
links.begin(); j != e->
links.end(); ++j) {
235 throw ProcessError(
"Could not build node '" + nid +
"'.");
242 if (edge2junction.find(l.
elementID) != edge2junction.end()) {
254 for (std::map<std::string, OpenDriveEdge*>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
256 for (std::vector<OpenDriveLink>::iterator j = e->
links.begin(); j != e->
links.end(); ++j) {
263 std::string id1 = e->
id;
268 std::string nid = id1 +
"." + id2;
273 throw ProcessError(
"Could not build node '" + nid +
"'.");
291 for (std::map<std::string, OpenDriveEdge*>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
293 if (e->
to != 0 && e->
from != 0) {
296 for (std::map<std::string, OpenDriveEdge*>::iterator j = innerEdges.begin(); j != innerEdges.end(); ++j) {
298 for (std::vector<OpenDriveLink>::iterator k = ie->
links.begin(); k != ie->
links.end(); ++k) {
304 std::string nid = edge2junction[ie->
id];
316 for (std::map<std::string, OpenDriveEdge*>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
319 const std::string nid = e->
id +
".begin";
323 const std::string nid = e->
id +
".end";
334 for (std::map<std::string, OpenDriveEdge*>::iterator i = outerEdges.begin(); i != outerEdges.end(); ++i) {
336 bool lanesBuilt =
false;
362 WRITE_WARNING(
"Edge '" + e->
id +
"' has to be split as it connects same junctions.")
380 std::string
id = e->
id;
381 if (sFrom != e->
from || sTo != e->
to) {
389 if ((*j).rightLaneNumber > 0) {
390 currRight =
new NBEdge(
"-" +
id, sFrom, sTo, (*j).rightType, defaultSpeed, (*j).rightLaneNumber, priorityR,
394 for (std::vector<OpenDriveLane>::const_iterator k = lanes.begin(); k != lanes.end(); ++k) {
395 std::map<int, int>::const_iterator lp = (*j).laneMap.find((*k).id);
396 if (lp != (*j).laneMap.end()) {
397 int sumoLaneIndex = lp->second;
414 if (prevRight != 0) {
416 for (std::map<int, int>::const_iterator k = connections.begin(); k != connections.end(); ++k) {
420 prevRight = currRight;
426 if ((*j).leftLaneNumber > 0) {
427 currLeft =
new NBEdge(
id, sTo, sFrom, (*j).leftType, defaultSpeed, (*j).leftLaneNumber, priorityL,
431 for (std::vector<OpenDriveLane>::const_iterator k = lanes.begin(); k != lanes.end(); ++k) {
432 std::map<int, int>::const_iterator lp = (*j).laneMap.find((*k).id);
433 if (lp != (*j).laneMap.end()) {
434 int sumoLaneIndex = lp->second;
452 std::map<int, int> connections = (*j).getInnerConnections(
OPENDRIVE_TAG_LEFT, *(j - 1));
453 for (std::map<int, int>::const_iterator k = connections.begin(); k != connections.end(); ++k) {
475 for (std::map<std::string, OpenDriveEdge*>::iterator i = edges.begin(); i != edges.end(); ++i) {
479 std::vector<Connection> connections2;
480 for (std::map<std::string, OpenDriveEdge*>::iterator j = edges.begin(); j != edges.end(); ++j) {
481 const std::set<Connection>& conns = (*j).second->connections;
483 for (std::set<Connection>::const_iterator i = conns.begin(); i != conns.end(); ++i) {
484 if (innerEdges.find((*i).fromEdge) != innerEdges.end()) {
488 if (innerEdges.find((*i).toEdge) != innerEdges.end()) {
491 connections2.push_back(*i);
496 for (std::vector<Connection>::const_iterator i = connections2.begin(); i != connections2.end(); ++i) {
497 std::string fromEdge = (*i).fromEdge;
498 if (edges.find(fromEdge) == edges.end()) {
499 WRITE_WARNING(
"While setting connections: from-edge '" + fromEdge +
"' is not known.");
503 int fromLane = (*i).fromLane;
504 bool fromLast = ((*i).fromCP ==
OPENDRIVE_CP_END) ^ ((*i).fromLane > 0 && !(*i).all);
507 std::string toEdge = (*i).toEdge;
508 if (edges.find(toEdge) == edges.end()) {
509 WRITE_WARNING(
"While setting connections: to-edge '" + toEdge +
"' is not known.");
514 int toLane = (*i).toLane;
519 fromLane = toLast ? odTo->
laneSections.back().laneMap.begin()->first : odTo->
laneSections[0].laneMap.begin()->first;
535 WRITE_WARNING(
"Could not find fromEdge representation of '" + fromEdge +
"' in connection '" + (*i).origID +
"'.");
538 WRITE_WARNING(
"Could not find fromEdge representation of '" + toEdge +
"' in connection '" + (*i).origID +
"'.");
540 if (from == 0 || to == 0) {
546 if ((*i).origID !=
"") {
549 for (std::vector<NBEdge::Connection>::iterator k = cons.begin(); k != cons.end(); ++k) {
550 if ((*k).fromLane == fromLane && (*k).toEdge == to && (*k).toLane == toLane) {
551 (*k).origID = (*i).origID +
"_" +
toString((*i).origLane);
562 std::map<std::string, std::string> tlsControlled;
563 for (std::map<std::string, OpenDriveEdge*>::iterator i = edges.begin(); i != edges.end(); ++i) {
565 for (std::vector<OpenDriveSignal>::const_iterator j = e->
signals.begin(); j != e->
signals.end(); ++j) {
566 if ((*j).type !=
"1000001") {
569 std::vector<OpenDriveLaneSection>::iterator k = e->
laneSections.begin();
572 if ((*j).s > (*k).s && (*j).s <= (*(k + 1)).s) {
582 std::string
id = (*k).sumoID;
586 std::string fromID, toID;
587 for (std::vector<OpenDriveLink>::const_iterator l = e->
links.begin(); l != e->
links.end(); ++l) {
592 fromID = (*l).elementID;
600 toID = (*l).elementID;
605 id = fromID +
"->" + toID;
607 WRITE_WARNING(
"Found a traffic light signal on an unknown edge (original edge id='" + e->
id +
"').");
612 if ((*j).orientation > 0) {
615 tlsControlled[id] = (*j).name;
619 for (std::map<std::string, std::string>::iterator i = tlsControlled.begin(); i != tlsControlled.end(); ++i) {
620 std::string
id = (*i).first;
621 if (
id.find(
"->") != std::string::npos) {
622 id =
id.substr(0,
id.find(
"->"));
626 WRITE_WARNING(
"Could not find edge '" +
id +
"' while building its traffic light.");
648 for (std::map<std::string, OpenDriveEdge*>::iterator i = edges.begin(); i != edges.end(); ++i) {
662 const std::set<Connection>& conts = dest->
connections;
663 for (std::set<Connection>::const_iterator i = conts.begin(); i != conts.end(); ++i) {
664 if (innerEdges.find((*i).toEdge) != innerEdges.end()) {
665 std::vector<Connection> t;
667 for (std::vector<Connection>::const_iterator j = t.begin(); j != t.end(); ++j) {
677 if ((*i).fromLane == c.
toLane) {
694 for (std::vector<OpenDriveLink>::iterator i = e.
links.begin(); i != e.
links.end(); ++i) {
702 std::string edgeID = e.
id;
705 const std::map<int, int>& laneMap = laneSection.
laneMap;
708 for (std::vector<OpenDriveLane>::const_iterator j = lanes.begin(); j != lanes.end(); ++j) {
725 if (edges.find(c.
fromEdge) == edges.end()) {
726 WRITE_ERROR(
"While setting connections: incoming road '" + c.
fromEdge +
"' is not known.");
735 for (std::vector<OpenDriveLane>::const_iterator j = lanes.begin(); j != lanes.end(); ++j) {
752 if (edges.find(c.
fromEdge) == edges.end()) {
753 WRITE_ERROR(
"While setting connections: incoming road '" + c.
fromEdge +
"' is not known.");
777 if (!nc.
insert(
id, pos)) {
791 throw ProcessError(
"Could not find node '" + nodeID +
"'.");
794 if (e.
to != 0 && e.
to != n) {
810 for (std::map<std::string, OpenDriveEdge*>::iterator i = edges.begin(); i != edges.end(); ++i) {
813 for (std::vector<OpenDriveGeometry>::iterator j = e.
geometries.begin(); j != e.
geometries.end(); ++j) {
841 if (!e.
geom.back().almostSame(geom.front())) {
842 const int index = (int)(j - e.
geometries.begin());
848 for (PositionVector::iterator k = geom.begin(); k != geom.end(); ++k) {
853 if (oc.
exists(
"geometry.min-dist") && !oc.
isDefault(
"geometry.min-dist")) {
857 WRITE_ERROR(
"Unable to project coordinates for edge '" + e.
id +
"'.");
862 for (std::vector<OpenDriveElevation>::iterator j = e.
elevations.begin(); j != e.
elevations.end(); ++j) {
865 while (k < (
int)e.
geom.size() && pos < sNext) {
867 const SUMOReal z = el.
a + el.
b * ds + el.
c * ds * ds + el.
d * ds * ds * ds;
871 if (k < (
int)e.
geom.size()) {
874 pos += e.
geom[k - 1].distanceTo2D(e.
geom[k]);
881 for (std::vector<OpenDriveLaneOffset>::iterator j = e.
offsets.begin(); j != e.
offsets.end(); ++j) {
897 for (std::vector<OpenDriveLaneOffset>::iterator j = e.
offsets.begin(); j != e.
offsets.end(); ++j) {
900 while (k < (
int)e.
geom.size() && pos < sNext) {
902 const SUMOReal offset = el.
a + el.
b * ds + el.
c * ds * ds + el.
d * ds * ds * ds;
910 geom2.push_back(tmp[k]);
912 geom2.push_back(e.
geom[k]);
915 geom2.push_back(e.
geom[k]);
918 if (k < (
int)e.
geom.size()) {
921 pos += e.
geom[k - 1].distanceTo2D(e.
geom[k]);
925 assert(e.
geom.size() == geom2.size());
935 for (std::map<std::string, OpenDriveEdge*>::iterator i = edges.begin(); i != edges.end(); ++i) {
937 std::vector<OpenDriveLaneSection>& laneSections = e.
laneSections;
939 std::vector<OpenDriveLaneSection> newSections;
940 for (std::vector<OpenDriveLaneSection>::iterator j = laneSections.begin(); j != laneSections.end(); ++j) {
941 std::vector<OpenDriveLaneSection> splitSections;
942 bool splitBySpeed = (*j).buildSpeedChanges(tc, splitSections);
944 newSections.push_back(*j);
946 std::copy(splitSections.begin(), splitSections.end(), back_inserter(newSections));
955 for (std::vector<OpenDriveLaneSection>::const_iterator j = laneSections.begin(); j != laneSections.end() && sorted; ++j) {
956 if ((*j).s <= lastS) {
962 WRITE_WARNING(
"The sections of edge '" + e.
id +
"' are not sorted properly.");
968 for (std::vector<OpenDriveLaneSection>::iterator j = laneSections.begin(); j != laneSections.end();) {
969 bool simlarToLast = fabs((*j).s - lastS) <
POSITION_EPS;
972 WRITE_WARNING(
"Almost duplicate s-value '" +
toString(lastS) +
"' for lane sections occured at edge '" + e.
id +
"'; second entry was removed.");
973 j = laneSections.erase(j);
1001 std::vector<Point2D<double> > into;
1003 for (std::vector<
Point2D<double> >::iterator i = into.begin(); i != into.end(); ++i) {
1004 ret.push_back(
Position((*i).getX(), (*i).getY()));
1006 }
catch (
const std::runtime_error&
error) {
1007 WRITE_WARNING(
"Could not compute spiral geometry for edge '" + e.
id +
"' (" + error.what() +
").");
1035 if (geo_posE - g.
s > g.
length) {
1038 if (geo_posE - g.
s > g.
length) {
1041 calcPointOnCurve(&endX, &endY, centerX, centerY, radius, geo_posE - geo_posS);
1043 dist += (geo_posE - geo_posS);
1045 ret.push_back(
Position(startX, startY));
1049 geo_posS = geo_posE;
1051 if (geo_posE - (g.
s + g.
length) < 0.001 && geo_posE - (g.
s + g.
length) > -0.001) {
1070 ret.push_back(
Position(g.
x + xnew, g.
y + ynew));
1084 for (
SUMOReal p = 0; p <= pMax + pStep; p += pStep) {
1089 ret.push_back(
Position(g.
x + xnew, g.
y + ynew));
1097 double normx = 1.0f;
1098 double normy = 0.0f;
1099 double x2 = normx * cos(hdg) - normy * sin(hdg);
1100 double y2 = normx * sin(hdg) + normy * cos(hdg);
1101 normx = x2 * length;
1102 normy = y2 * length;
1103 return Position(start.
x() + normx, start.
y() + normy);
1113 if (ad_radius > 0) {
1120 normX = normX * cos(ad_hdg) + normY * sin(ad_hdg);
1121 normY = tmpX * sin(ad_hdg) + normY * cos(ad_hdg);
1124 normX = turn * normY;
1125 normY = -turn * tmpX;
1127 normX = fabs(ad_radius) * normX;
1128 normY = fabs(ad_radius) * normY;
1138 double rotAngle = ad_length / fabs(ad_r);
1139 double vx = *ad_x - ad_centerX;
1140 double vy = *ad_y - ad_centerY;
1150 vx = vx * cos(rotAngle) + turn * vy * sin(rotAngle);
1151 vy = -1 * turn * tmpx * sin(rotAngle) + vy * cos(rotAngle);
1152 *ad_x = vx + ad_centerX;
1153 *ad_y = vy + ad_centerY;
1170 bool singleType =
true;
1171 std::vector<std::string> types;
1173 for (std::vector<OpenDriveLane>::const_reverse_iterator i = dirLanesR.rbegin(); i != dirLanesR.rend(); ++i) {
1175 laneMap[(*i).id] = sumoLane++;
1176 types.push_back((*i).type);
1177 if (types.front() != types.back()) {
1188 for (std::vector<OpenDriveLane>::const_iterator i = dirLanesL.begin(); i != dirLanesL.end(); ++i) {
1190 laneMap[(*i).id] = sumoLane++;
1191 types.push_back((*i).type);
1192 if (types.front() != types.back()) {
1204 std::map<int, int> ret;
1205 const std::vector<OpenDriveLane>& dirLanes =
lanesByDir.find(dir)->second;
1206 for (std::vector<OpenDriveLane>::const_reverse_iterator i = dirLanes.rbegin(); i != dirLanes.rend(); ++i) {
1207 std::map<int, int>::const_iterator toP =
laneMap.find((*i).id);
1212 int to = (*toP).second;
1215 from = (*i).predecessor;
1218 std::map<int, int>::const_iterator fromP = prev.
laneMap.find(from);
1219 if (fromP != prev.
laneMap.end()) {
1220 from = (*fromP).second;
1226 if (ret.find(from) != ret.end()) {
1230 std::swap(from, to);
1249 if (i != l.
speeds.end()) {
1250 l.
speed = (*i).second;
1257 if (i != l.
speeds.end()) {
1258 l.
speed = (*i).second;
1267 std::set<SUMOReal> speedChangePositions;
1270 for (std::vector<std::pair<SUMOReal, SUMOReal> >::const_iterator l = (*k).speeds.begin(); l != (*k).speeds.end(); ++l) {
1271 speedChangePositions.insert((*l).first);
1272 if ((*l).first == 0) {
1273 (*k).speed = (*l).second;
1278 for (std::vector<std::pair<SUMOReal, SUMOReal> >::const_iterator l = (*k).speeds.begin(); l != (*k).speeds.end(); ++l) {
1279 speedChangePositions.insert((*l).first);
1280 if ((*l).first == 0) {
1281 (*k).speed = (*l).second;
1286 if (speedChangePositions.size() == 0) {
1289 if (*speedChangePositions.begin() > 0) {
1290 speedChangePositions.insert(0);
1293 for (std::set<SUMOReal>::iterator i = speedChangePositions.begin(); i != speedChangePositions.end(); ++i) {
1294 if (i == speedChangePositions.begin()) {
1295 newSections.push_back(*
this);
1301 for (
int i = 0; i != (int)newSections.size(); ++i) {
1304 for (std::map<
OpenDriveXMLTag, std::vector<OpenDriveLane> >::iterator k = lanesByDir.begin(); k != lanesByDir.end(); ++k) {
1305 std::vector<OpenDriveLane>& lanes = (*k).second;
1306 for (
int j = 0; j != (int)lanes.size(); ++j) {
1312 l.
speed = newSections[i - 1].lanesByDir[(*k).first][j].speed;
1330 for (std::vector<OpenDriveSignal>::const_iterator i = signals.begin(); i != signals.end(); ++i) {
1332 if ((*i).type ==
"301" || (*i).type ==
"306") {
1335 if ((*i).type ==
"205") {
1372 if (majorVersion != 1 || minorVersion != 2) {
1436 std::vector<SUMOReal> vals;
1441 std::vector<SUMOReal> vals;
1448 std::vector<SUMOReal> vals;
1454 std::vector<SUMOReal> vals;
1463 std::vector<SUMOReal> vals;
1543 WRITE_ERROR(
"In laneLink-element: incoming road '" + c.fromEdge +
"' is not known.");
1555 l.width =
MAX2(l.width, width);
1612 const std::string& elementID,
1613 const std::string& contactPoint) {
1616 if (elementType ==
"road") {
1618 }
else if (elementType ==
"junction") {
1622 if (contactPoint ==
"start") {
1624 }
else if (contactPoint ==
"end") {
std::map< std::string, OpenDriveEdge * > & myEdges
ContactPoint contactPoint
static void calculateCurveCenter(SUMOReal *ad_x, SUMOReal *ad_y, SUMOReal ad_radius, SUMOReal ad_hdg)
std::vector< int > myElementStack
std::vector< std::string > getStringVector(const std::string &name) const
Returns the list of string-vector-value of the named option (only for Option_String) ...
std::string rightType
the composite type built from all used lane types
static const SUMOReal UNSPECIFIED_WIDTH
unspecified lane width
static PositionVector geomFromLine(const OpenDriveEdge &e, const OpenDriveGeometry &g)
static StringBijection< int >::Entry openDriveAttrs[]
The names of openDrive-XML attributes (for passing to GenericSAXHandler)
NBTypeCont & getTypeCont()
Returns a reference to the type container.
PositionVector getSubpart2D(SUMOReal beginOffset, SUMOReal endOffset) const
get subpart of a position vector in two dimensions (Z is ignored)
void addLink(LinkType lt, const std::string &elementType, const std::string &elementID, const std::string &contactPoint)
Representation of an OpenDrive link.
static bool isReadable(std::string path)
Checks whether the given file is readable.
std::string junction
The id of the junction the edge belongs to.
std::vector< OpenDriveElevation > elevations
GeometryType
OpenDrive geometry type enumeration.
int rightLaneNumber
The number of lanes on the right and on the left side, respectively.
bool isTLControlled() const
Returns whether this node is controlled by any tls.
static void buildConnectionsToOuter(const Connection &c, const std::map< std::string, OpenDriveEdge * > &innerEdges, std::vector< Connection > &into)
Representation of a lane section.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
The representation of a single edge during network building.
Representation of an openDrive "link".
The base class for traffic light logic definitions.
ContactPoint myCurrentContactPoint
SUMOReal s
The starting offset of this lane section.
static PositionVector geomFromArc(const OpenDriveEdge &e, const OpenDriveGeometry &g)
std::map< OpenDriveXMLTag, std::vector< OpenDriveLane > > lanesByDir
The lanes, sorted by their direction.
static bool transformCoordinates(PositionVector &from, bool includeInBoundary=true, GeoConvHelper *from_srs=0)
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
std::set< Connection > connections
Representation of a signal.
Lane & getLaneStruct(int lane)
static const SUMOReal UNSPECIFIED_OFFSET
unspecified lane offset
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false)
Runs the given handler on the given file; returns if everything's ok.
SUMOReal x() const
Returns the x-position.
friend bool operator<(const Connection &c1, const Connection &c2)
Position positionAtOffset2D(SUMOReal pos, SUMOReal lateralOffset=0) const
Returns the position at the given length.
#define UNUSED_PARAMETER(x)
OpenDriveEdge myCurrentEdge
A class that stores a 2D geometrical boundary.
SUMOReal getWidth(const std::string &type) const
Returns the lane width for the given type [m].
static NBNode * getOrBuildNode(const std::string &id, const Position &pos, NBNodeCont &nc)
Builds a node or returns the already built.
void error(const XERCES_CPP_NAMESPACE::SAXParseException &exception)
Handler for XML-errors.
#define WRITE_WARNING(msg)
The connection was computed and validated.
static OptionsCont & getOptions()
Retrieves the options.
static std::string revertID(const std::string &id)
std::string myCurrentConnectingRoad
PositionVector reverse() const
reverse position vector
Representation of a lane.
SUMOReal speed
The speed allowed on this lane.
OpenDriveXMLTag myCurrentLaneDirection
static void calcPointOnCurve(SUMOReal *ad_x, SUMOReal *ad_y, SUMOReal ad_centerX, SUMOReal ad_centerY, SUMOReal ad_r, SUMOReal ad_length)
An (internal) definition of a single lane of an edge.
const std::string & getID() const
Returns the id.
SUMOReal length2D() const
Returns the length.
SVCPermissions permissions
List of vehicle types that are allowed on this lane.
std::vector< OpenDriveLink > links
A handler which converts occuring elements and attributes into enums.
OpenDriveLaneSection buildLaneSection(SUMOReal startPos)
OpenDriveElevation OpenDriveLaneOffset
LaneOffset has the same fields as Elevation.
SUMOReal getSpeed(const std::string &type) const
Returns the maximal velocity for the given type [m/s].
const std::string & getFileName() const
returns the current file name
const std::set< NBTrafficLightDefinition * > & getControllingTLS() const
Returns the traffic lights that were assigned to this node (The set of tls that control this node) ...
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
std::string type
The lane's type.
int getPriority(OpenDriveXMLTag dir) const
Returns the edge's priority, regarding the direction.
Encapsulated SAX-Attributes.
static StringBijection< TrafficLightType > TrafficLightTypes
traffic light types
static Position calculateStraightEndPoint(double hdg, double length, const Position &start)
A point in 2D or 3D with translation and scaling methods.
NBEdgeCont & getEdgeCont()
void computeSpiral(std::vector< Point2D< double > > &spiral, double ds=0, int NPts=0)
std::string id
The id of the edge.
void add(SUMOReal xoff, SUMOReal yoff, SUMOReal zoff)
int indexOfClosest(const Position &p) const
index of the closest position to p
static void loadNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Loads content of the optionally given SUMO file.
NIImporter_OpenDrive(const NBTypeCont &tc, std::map< std::string, OpenDriveEdge * > &edges)
Constructor.
bool isUsableFileList(const std::string &name) const
Checks whether the named option is usable as a file list (with at least a single file) ...
bool buildSpeedChanges(const NBTypeCont &tc, std::vector< OpenDriveLaneSection > &newSections)
const NBTypeCont & myTypeContainer
std::vector< OpenDriveLaneOffset > offsets
bool myConnectionWasEmpty
bool addLane2LaneConnection(int fromLane, NBEdge *dest, int toLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, bool keepClear=true, SUMOReal contPos=UNSPECIFIED_CONTPOS, SUMOReal visibility=UNSPECIFIED_VISIBILITY_DISTANCE)
Adds a connection between the specified this edge's lane and an approached one.
SUMOReal width
The lane's width;.
Position positionAtOffset(SUMOReal pos, SUMOReal lateralOffset=0) const
Returns the position at the given length.
std::string myCurrentJunctionID
std::vector< OpenDriveLaneSection > laneSections
std::map< int, int > laneMap
A mapping from OpenDrive to SUMO-index (the first is signed, the second unsigned) ...
#define PROGRESS_BEGIN_MESSAGE(msg)
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
int insertAtClosest(const Position &p)
inserts p between the two closest positions and returns the insertion index
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
OpenDriveXMLTag
Numbers representing openDrive-XML - element names.
static bool myImportWidths
bool knows(const std::string &type) const
Returns whether the named type is in the container.
The connection was given by the user.
static PositionVector geomFromSpiral(const OpenDriveEdge &e, const OpenDriveGeometry &g)
static PositionVector geomFromPoly(const OpenDriveEdge &e, const OpenDriveGeometry &g)
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list...
static StringBijection< int >::Entry openDriveTags[]
The names of openDrive-XML elements (for passing to GenericSAXHandler)
static bool myImportAllTypes
std::string origID
An original ID, if given.
void buildLaneMapping(const NBTypeCont &tc)
Build the mapping from OpenDrive to SUMO lanes.
std::vector< OpenDriveSignal > signals
LinkType
OpenDrive link type enumeration.
void addParameter(const std::string &key, const std::string &value)
Adds a parameter.
static void computeShapes(std::map< std::string, OpenDriveEdge * > &edges)
Computes a polygon representation of each edge's geometry.
NBNode * getToNode() const
Returns the destination node of the edge.
void addTrafficLight(NBTrafficLightDefinition *tlDef)
Adds a traffic light to the list of traffic lights that control this node.
void removeDoublePoints(SUMOReal minDist=POSITION_EPS, bool assertLength=false)
Removes positions if too near.
~NIImporter_OpenDrive()
Destructor.
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
std::map< int, int > getInnerConnections(OpenDriveXMLTag dir, const OpenDriveLaneSection &prev)
Returns the links from the previous to this lane section.
NBNodeCont & getNodeCont()
Returns a reference to the node container.
SUMOReal speed
The lane's speed (set in post-processing)
Instance responsible for building networks.
Representation of an OpenDrive geometry part.
bool getShallBeDiscarded(const std::string &type) const
Returns the information whether edges of this type shall be discarded.
SUMOReal y() const
Returns the y-position.
A storage for options typed value containers)
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
NBTrafficLightLogicCont & getTLLogicCont()
Returns a reference to the traffic light logics container.
static void setEdgeLinks2(OpenDriveEdge &e, const std::map< std::string, OpenDriveEdge * > &edges)
std::vector< OpenDriveGeometry > geometries
Represents a single node (junction) during network building.
T get(const std::string &str) const
A class for sorting lane sections by their s-value.
SUMOReal distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
void move2side(SUMOReal amount)
move position vector to side using certain ammount
bool insert(NBTrafficLightDefinition *logic, bool forceInsert=false)
Adds a logic definition to the dictionary.
static PositionVector geomFromParamPoly(const OpenDriveEdge &e, const OpenDriveGeometry &g)
static void setNodeSecure(NBNodeCont &nc, OpenDriveEdge &e, const std::string &nodeID, NIImporter_OpenDrive::LinkType lt)
void push_back_noDoublePos(const Position &p)
insert in back a non double position
A connection between two roads.
std::vector< SUMOReal > params
void addGeometryShape(GeometryType type, const std::vector< SUMOReal > &vals)
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue, bool report=true) const
Tries to read given attribute assuming it is an int.
bool wasIgnored(std::string id) const
Returns whether the edge with the id was ignored during parsing.
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
SVCPermissions getPermissions(const std::string &type) const
Returns allowed vehicle classes for the given type.
Container for nodes during the netbuilding process.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
SUMOReal length
The length of the edge.
#define PROGRESS_DONE_MESSAGE()
A traffic light logics which must be computed (only nodes/edges are given)
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
const std::vector< Connection > & getConnections() const
Returns the connections.
Importer for networks stored in openDrive format.
std::string myCurrentIncomingRoad
OpenDriveLaneSection(SUMOReal sArg)
Constructor.
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
std::vector< std::pair< SUMOReal, SUMOReal > > speeds
List of positions/speeds of speed changes.
bool exists(const std::string &name) const
Returns the information whether the named option is known.
SUMOReal width
This lane's width.
A storage for available types of edges.
std::string streetName
The road name of the edge.
void myEndElement(int element)
Called when a closing tag occurs.
static void revisitLaneSections(const NBTypeCont &tc, std::map< std::string, OpenDriveEdge * > &edges)
Rechecks lane sections of the given edges.
Coefficients of an elevation profile (3rd degree polynomial)