42 #define DEBUGCOND true
44 #define MIN_TURN_DIAMETER 2.0
56 if (!oc.
isSet(
"opendrive-output")) {
61 const bool origNames = oc.
getBool(
"output.original-names");
62 const bool lefthand = oc.
getBool(
"lefthand");
63 const double straightThresh =
DEG2RAD(oc.
getFloat(
"opendrive-output.straight-threshold"));
66 int edgeID = nc.
size() * 10;
71 device <<
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
73 time_t now = time(
nullptr);
74 std::string dstr(ctime(&now));
82 device.
writeAttr(
"date", dstr.substr(0, dstr.length() - 1));
108 for (std::map<std::string, NBEdge*>::const_iterator i = ec.
begin(); i != ec.
end(); ++i) {
109 const NBEdge* e = (*i).second;
114 fromNodeID, toNodeID,
115 origNames, straightThresh,
122 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
124 int connectionID = 0;
125 const int nID =
getID(n->
getID(), nodeMap, nodeID);
127 junctionOSS <<
" <junction name=\"" << n->
getID() <<
"\" id=\"" << nID <<
"\">\n";
129 std::vector<NBEdge*> incoming = (*i).second->getIncomingEdges();
131 std::reverse(incoming.begin(), incoming.end());
133 for (
NBEdge* inEdge : incoming) {
134 std::string centerMark =
"none";
135 const int inEdgeID =
getID(inEdge->getID(), edgeMap, edgeID);
137 const NBEdge* outEdge =
nullptr;
138 bool isOuterEdge =
true;
139 int lastFromLane = -1;
140 std::vector<NBEdge::Connection> parallel;
141 std::vector<NBEdge::Connection> connections = inEdge->
getConnections();
143 std::reverse(connections.begin(), connections.end());
146 assert(c.toEdge != 0);
147 if (outEdge != c.toEdge || c.fromLane == lastFromLane) {
148 if (outEdge !=
nullptr) {
153 getID(parallel.back().getInternalLaneID(), edgeMap, edgeID),
157 parallel, isOuterEdge, straightThresh, centerMark);
163 lastFromLane = c.fromLane;
164 parallel.push_back(c);
169 if (!parallel.empty()) {
170 if (!lefthand && (n->
geometryLike() || inEdge->isTurningDirectionAt(outEdge))) {
171 centerMark =
"solid";
174 getID(parallel.back().getInternalLaneID(), edgeMap, edgeID),
178 parallel, isOuterEdge, straightThresh, centerMark);
183 junctionOSS <<
" </junction>\n";
190 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
194 int numConnections = 0;
195 for (std::vector<NBEdge*>::const_iterator j = incoming.begin(); j != incoming.end(); ++j) {
196 numConnections += (int)((*j)->getConnections().size());
198 if (numConnections == 0) {
201 for (std::vector<NBEdge*>::const_iterator j = incoming.begin(); j != incoming.end(); ++j) {
202 const NBEdge* inEdge = *j;
203 const std::vector<NBEdge::Connection>& elv = inEdge->
getConnections();
204 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
207 if (outEdge ==
nullptr) {
221 int edgeID,
int fromNodeID,
int toNodeID,
222 const bool origNames,
223 const double straightThresh,
232 planViewOSS.
openTag(
"planView");
234 const std::vector<NBEdge::Lane>& lanes = e->
getLanes();
236 #ifdef DEBUG_SMOOTH_GEOM
238 std::cout <<
"write planview for edge " << e->
getID() <<
"\n";
264 device.
writeAttr(
"elementType",
"junction");
265 device.
writeAttr(
"elementId", fromNodeID);
270 device.
writeAttr(
"elementType",
"junction");
279 device <<
" <lateralProfile/>\n";
280 device <<
" <lanes>\n";
281 device <<
" <laneSection s=\"0\">\n";
284 device <<
" <right>\n";
287 device <<
" <link/>\n";
295 device <<
" <width sOffset=\"0\" a=\"" << e->
getLaneWidth(j) <<
"\" b=\"0\" c=\"0\" d=\"0\"/>\n";
296 std::string markType =
"broken";
307 device <<
" <roadMark sOffset=\"0\" type=\"" << markType <<
"\" weight=\"standard\" color=\"standard\" width=\"0.13\"/>\n";
308 device <<
" <speed sOffset=\"0\" max=\"" << lanes[j].speed <<
"\"/>\n";
309 device <<
" </lane>\n";
311 device <<
" </right>\n";
312 device <<
" </laneSection>\n";
313 device <<
" </lanes>\n";
315 device <<
" <signals/>\n";
317 device <<
" <userData code=\"sumoId\" value=\"" << e->
getID() <<
"\"/>\n";
327 if (outEdge !=
nullptr
331 || parallel.front().fromLane != 0
332 || parallel.front().toLane != 0)) {
334 parallel.front().vmax = (inEdge->
getLanes()[0].speed + outEdge->
getLanes()[0].speed) / (
double) 2.0;
341 int edgeID,
int inEdgeID,
int outEdgeID,
343 const std::vector<NBEdge::Connection>& parallel,
344 const bool isOuterEdge,
345 const double straightThresh,
346 const std::string& centerMark) {
347 assert(parallel.size() != 0);
355 double laneOffset = 0;
357 fallBackShape.push_back(begShape.back());
358 fallBackShape.push_back(endShape.front());
362 if (init.size() == 0) {
367 }
else if (length <= NUMERICAL_EPS) {
373 if (init.size() != 0) {
383 junctionDevice <<
" <connection id=\"" << connectionID <<
"\" incomingRoad=\"" << inEdgeID <<
"\" connectingRoad=\"" << edgeID <<
"\" contactPoint=\"start\">\n";
399 device.
writeAttr(
"elementId", outEdgeID);
400 device.
writeAttr(
"contactPoint",
"start");
408 #ifdef DEBUG_SMOOTH_GEOM
410 std::cout <<
"write planview for internal edge " << cLeft.
id <<
" init=" << init <<
" fallback=" << fallBackShape
411 <<
" begShape=" << begShape <<
" endShape=" << endShape
415 if (init.size() == 0) {
423 device <<
" <lateralProfile/>\n";
424 device <<
" <lanes>\n";
425 if (laneOffset != 0) {
426 device <<
" <laneOffset s=\"0\" a=\"" << laneOffset <<
"\" b=\"0\" c=\"0\" d=\"0\"/>\n";
428 device <<
" <laneSection s=\"0\">\n";
430 device <<
" <right>\n";
431 for (
int j = (
int)parallel.size(); --j >= 0;) {
436 device <<
" <link>\n";
437 device <<
" <predecessor id=\"" << fromIndex <<
"\"/>\n";
438 device <<
" <successor id=\"" << toIndex <<
"\"/>\n";
439 device <<
" </link>\n";
440 device <<
" <width sOffset=\"0\" a=\"" << outEdge->
getLaneWidth(c.
toLane) <<
"\" b=\"0\" c=\"0\" d=\"0\"/>\n";
441 std::string markType =
"broken";
447 }
else if (isOuterEdge && j > 0
462 device <<
" <roadMark sOffset=\"0\" type=\"" << markType <<
"\" weight=\"standard\" color=\"standard\" width=\"0.13\"/>\n";
463 device <<
" <speed sOffset=\"0\" max=\"" << c.
vmax <<
"\"/>\n";
464 device <<
" </lane>\n";
466 junctionDevice <<
" <laneLink from=\"" << fromIndex <<
"\" to=\"" << toIndex <<
"\"/>\n";
469 device <<
" </right>\n";
470 device <<
" </laneSection>\n";
471 device <<
" </lanes>\n";
472 device <<
" <objects/>\n";
473 device <<
" <signals/>\n";
475 junctionDevice <<
" </connection>\n";
483 for (
int j = 0; j < (int)shape.size() - 1; ++j) {
496 elevationDevice <<
" <elevation s=\"" << offset <<
"\" a=\"" << p.
z() <<
"\" b=\"" << (p2.
z() - p.
z()) /
MAX2(POSITION_EPS, length) <<
"\" c=\"0\" d=\"0\"/>\n";
505 device <<
" <center>\n";
506 device <<
" <lane id=\"0\" type=\"none\" level=\"true\">\n";
507 device <<
" <link/>\n";
508 device <<
" <roadMark sOffset=\"0\" type=\"" << mark <<
"\" weight=\"standard\" color=\"standard\" width=\"" << markWidth <<
"\"/>\n";
509 device <<
" </lane>\n";
510 device <<
" </center>\n";
517 return map.
get(origID);
519 map.
insert(origID, lastID++);
526 switch (permissions) {
546 if (permissions ==
SVCAll) {
563 if (laneIndex == -1) {
565 laneIndex = lefthand ? 0 : (int)edge->
getNumLanes() - 1;
574 const int leftmost = lefthand ? 0 : (int)edge->
getNumLanes() - 1;
578 for (
int i = leftmost; i < laneIndex; i++) {
582 for (
int i = leftmost; i > laneIndex; i--) {
606 assert(init.size() == 3 || init.size() == 4);
609 length =
MAX2(POSITION_EPS, length);
617 init.
add(-p.
x(), -p.
y(), -p.
z());
621 double aU, bU, cU, dU;
622 double aV, bV, cV, dV;
623 double aZ, bZ, cZ, dZ;
626 if (init.size() == 3) {
629 bU = 2 * init[1].x() - 2 * init[0].x();
630 cU = init[0].x() - 2 * init[1].x() + init[2].x();
634 bV = 2 * init[1].y() - 2 * init[0].y();
635 cV = init[0].y() - 2 * init[1].y() + init[2].y();
640 bZ = (2 * initZ[1].z() - 2 * initZ[0].z()) / length;
641 cZ = (initZ[0].z() - 2 * initZ[1].z() + initZ[2].z()) / (length * length);
647 bU = 3 * init[1].x() - 3 * init[0].x();
648 cU = 3 * init[0].x() - 6 * init[1].x() + 3 * init[2].x();
649 dU = -init[0].x() + 3 * init[1].x() - 3 * init[2].x() + init[3].x();
652 bV = 3 * init[1].y() - 3 * init[0].y();
653 cV = 3 * init[0].y() - 6 * init[1].y() + 3 * init[2].y();
654 dV = -init[0].y() + 3 * init[1].y() - 3 * init[2].y() + init[3].y();
658 bZ = (3 * initZ[1].z() - 3 * initZ[0].z()) / length;
659 cZ = (3 * initZ[0].z() - 6 * initZ[1].z() + 3 * initZ[2].z()) / (length * length);
660 dZ = (-initZ[0].z() + 3 * initZ[1].z() - 3 * initZ[2].z() + initZ[3].z()) / (length * length * length);
683 elevationDevice.
openTag(
"elevation");
691 return offset + length;
697 #ifdef DEBUG_SMOOTH_GEOM
699 std::cout <<
"writeGeomSmooth\n n=" << shape.size() <<
" shape=" <<
toString(shape) <<
"\n";
703 const double longThresh = speed;
704 const double curveCutout = longThresh / 2;
706 assert(longThresh >= 2 * curveCutout);
707 assert(shape.size() > 2);
711 double maxAngleDiff = 0;
713 for (
int j = 1; j < (int)shape.size() - 1; ++j) {
721 maxAngleDiff =
MAX2(maxAngleDiff, dAngle);
722 #ifdef DEBUG_SMOOTH_GEOM
724 std::cout <<
" j=" << j <<
" dAngle=" <<
RAD2DEG(dAngle) <<
" length1=" << length1 <<
" length2=" << length2 <<
"\n";
727 if (dAngle > straightThresh
728 && (length1 > longThresh || j == 1)
729 && (length2 > longThresh || j == (
int)shape.size() - 2)) {
736 const int numPoints = (int)shape2.size();
737 #ifdef DEBUG_SMOOTH_GEOM
739 std::cout <<
" n=" << numPoints <<
" shape2=" <<
toString(shape2) <<
"\n";
743 if (maxAngleDiff < straightThresh) {
745 #ifdef DEBUG_SMOOTH_GEOM
747 std::cout <<
" special case: all lines. maxAngleDiff=" << maxAngleDiff <<
"\n";
755 for (
int j = 0; j < numPoints - 1; ++j) {
761 const double lineLength = line.
length2D();
762 if (lineLength >= longThresh) {
764 #ifdef DEBUG_SMOOTH_GEOM
766 std::cout <<
" writeLine=" <<
toString(line) <<
"\n";
773 if (j == 0 || j == numPoints - 2) {
776 begShape.
add(p0 - begShape.back());
777 }
else if (j == 1 || p0.
distanceTo2D(shape2[j - 1]) > longThresh) {
779 begShape.push_back(shape2[j - 1]);
780 begShape.push_back(p0);
783 begShape.push_back(shape2[j - 1]);
784 begShape.push_back(p1);
785 begShape.
add(p0 - begShape.back());
788 if (j == 0 || j == numPoints - 2) {
791 endShape.
add(p1 - endShape.front());
792 }
else if (j == numPoints - 3 || p1.
distanceTo2D(shape2[j + 2]) > longThresh) {
794 endShape.push_back(p1);
795 endShape.push_back(shape2[j + 2]);
798 endShape.push_back(p0);
799 endShape.push_back(shape2[j + 2]);
800 endShape.
add(p1 - endShape.front());
802 const double extrapolateLength =
MIN2((
double)25, lineLength / 4);
804 if (init.size() == 0) {
807 #ifdef DEBUG_SMOOTH_GEOM
809 std::cout <<
" writeLine lineLength=" << lineLength <<
" begShape" << j <<
"=" <<
toString(begShape) <<
" endShape" << j <<
"=" <<
toString(endShape) <<
" init" << j <<
"=" <<
toString(init) <<
"\n";
815 offset =
writeGeomPP3(device, elevationDevice, init, curveLength, offset);
816 #ifdef DEBUG_SMOOTH_GEOM
818 std::cout <<
" writeCurve lineLength=" << lineLength <<
" curveLength=" << curveLength <<
" begShape" << j <<
"=" <<
toString(begShape) <<
" endShape" << j <<
"=" <<
toString(endShape) <<
" init" << j <<
"=" <<
toString(init) <<
"\n";
833 double z = shape.size() == 0 ? 0 : shape[0].z();
834 for (
int i = 1; i < (int)shape.size(); ++i) {
835 if (fabs(shape[i].z() - z) > NUMERICAL_EPS) {
840 device <<
" <elevationProfile>\n";
842 device <<
" <elevation s=\"0\" a=\"" << z <<
"\" b=\"0\" c=\"0\" d=\"0\"/>\n";
846 device <<
" </elevationProfile>\n";
856 assert(shape0.size() >= 2);
860 stopLine.push_back(to);
863 for (
int lane = 1; lane < e->
getNumLanes(); ++lane) {
865 if (dist > NUMERICAL_EPS) {
881 WRITE_WARNING(
"Road object polygon '" +
id +
"' not found for edge '" + e->
getID() +
"'");
882 }
else if (p->
getShape().size() != 4) {
890 const double absAngle = sideline.
angleAt2D(0);
891 const double length = sideline.
length2D();
892 const double width = ortholine.
length2D();
895 WRITE_WARNING(
"Cannot map road object polygon '" +
id +
"' with center " +
toString(center) +
" onto edge '" + e->
getID() +
"'");
900 const double relAngle = absAngle - edgeAngle;
927 device <<
" <objects/>\n";
#define WRITE_WARNING(msg)
const SVCPermissions SVCAll
all VClasses are allowed
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
@ SVC_RAIL
vehicle is a not electrified rail
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_RAIL_FAST
vehicle that is allowed to drive on high-speed rail tracks
@ SVC_RAIL_ELECTRIC
rail vehicle that requires electrified tracks
@ SVC_RAIL_URBAN
vehicle is a city rail
@ SVC_TRAM
vehicle is a light rail
@ SVC_PEDESTRIAN
pedestrian
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)....
@ PARTLEFT
The link is a partial left direction.
@ RIGHT
The link is a (hard) right direction.
@ LEFT
The link is a (hard) left direction.
@ PARTRIGHT
The link is a partial right direction.
int gPrecision
the precision for floating point outputs
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A class that stores a 2D geometrical boundary.
double ymin() const
Returns minimum y-coordinate.
double xmin() const
Returns minimum x-coordinate.
double ymax() const
Returns maximum y-coordinate.
double xmax() const
Returns maximum x-coordinate.
static methods for processing the coordinates conversion for the current net
const std::string & getProjString() const
Returns the original projection definition.
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
const Position getOffsetBase() const
Returns the network base.
bool usingGeoProjection() const
Returns whether a transformation from geo to metric coordinates will be performed.
const Boundary & getConvBoundary() const
Returns the converted boundary.
static const double INVALID_OFFSET
a value to signify offsets outside the range of [0, Line.length()]
static double angleDiff(const double angle1, const double angle2)
Returns the difference of the second angle to the first angle in radiants.
Storage for edges, including some functionality operating on multiple edges.
std::map< std::string, NBEdge * >::const_iterator begin() const
Returns the pointer to the begin of the stored edges.
std::map< std::string, NBEdge * >::const_iterator end() const
Returns the pointer to the end of the stored edges.
The representation of a single edge during network building.
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
double getLaneWidth() const
Returns the default width of lanes of this edge.
const std::string & getStreetName() const
Returns the street name of this edge.
const std::string & getID() const
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
NBNode * getToNode() const
Returns the destination node of the edge.
double getSpeed() const
Returns the speed allowed on this edge.
bool isTurningDirectionAt(const NBEdge *const edge) const
Returns whether the given edge is the opposite direction to this edge.
int getNumLanes() const
Returns the number of lanes.
std::string getLaneID(int lane) const
get lane ID
const std::vector< Connection > & getConnections() const
Returns the connections.
const PositionVector & getLaneShape(int i) const
Returns the shape of the nth lane.
NBNode * getFromNode() const
Returns the origin node of the edge.
EdgeVector getIncomingEdges() const
Returns the list of incoming edges unsorted.
Instance responsible for building networks.
ShapeContainer & getShapeCont()
NBEdgeCont & getEdgeCont()
NBNodeCont & getNodeCont()
Returns a reference to the node container.
Container for nodes during the netbuilding process.
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
int size() const
Returns the number of nodes stored in this container.
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
Represents a single node (junction) during network building.
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
int numNormalConnections() const
return the number of lane-to-lane connections at this junction (excluding crossings)
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
bool geometryLike() const
whether this is structurally similar to a geometry node
static PositionVector bezierControlPoints(const PositionVector &begShape, const PositionVector &endShape, bool isTurnaround, double extrapolateBeg, double extrapolateEnd, bool &ok, NBNode *recordError=0, double straightThresh=DEG2RAD(5), int shapeFlag=0)
get bezier control points
static void addPedestrianConnection(const NBEdge *inEdge, const NBEdge *outEdge, std::vector< NBEdge::Connection > ¶llel)
static void checkLaneGeometries(const NBEdge *e)
check if the lane geometries are compatible with OpenDRIVE assumptions (colinear stop line)
static void writeEmptyCenterLane(OutputDevice &device, const std::string &mark, double markWidth)
static void writeElevationProfile(const PositionVector &shape, OutputDevice &device, const OutputDevice_String &elevationDevice)
static PositionVector getRightLaneBorder(const NBEdge *edge, int laneIndex=-1)
static void writeNormalEdge(OutputDevice &device, const NBEdge *e, int edgeID, int fromNodeID, int toNodeID, const bool origNames, const double straightThresh, const ShapeContainer &shc)
write normal edge to device
static std::string getLaneType(SVCPermissions permissions)
static bool writeGeomSmooth(const PositionVector &shape, double speed, OutputDevice &device, OutputDevice &elevationDevice, double straightThresh, double &length)
static void writeRoadObjects(OutputDevice &device, const NBEdge *e, const ShapeContainer &shc)
write road objects referenced as edge parameters
static PositionVector getLeftLaneBorder(const NBEdge *edge, int laneIndex=-1, double widthOffset=0)
get the left border of the given lane (the leftmost one by default)
static int writeInternalEdge(OutputDevice &device, OutputDevice &junctionDevice, const NBEdge *inEdge, int nodeID, int edgeID, int inEdgeID, int outEdgeID, int connectionID, const std::vector< NBEdge::Connection > ¶llel, const bool isOuterEdge, const double straightThresh, const std::string ¢erMark)
write internal edge to device, return next connectionID
static void writeNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Writes the network into a openDRIVE-file.
static int getID(const std::string &origID, StringBijection< int > &map, int &lastID)
static double writeGeomPP3(OutputDevice &device, OutputDevice &elevationDevice, PositionVector init, double length, double offset=0)
write geometry as a single bezier curve (paramPoly3)
static double writeGeomLines(const PositionVector &shape, OutputDevice &device, OutputDevice &elevationDevice, double offset=0)
write geometry as sequence of lines (sumo style)
const std::string & getID() const
Returns the id.
T get(const std::string &id) const
Retrieves an item.
A storage for options typed value containers)
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
An output device that encapsulates an ofstream.
std::string getString() const
Returns the current content as a string.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writePreformattedTag(const std::string &val)
writes a preformatted tag to the device but ensures that any pending tags are closed
void lf()
writes a line feed if applicable
void close()
Closes the device and removes it from the dictionary.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void setPrecision(int precision=gPrecision)
Sets the precison or resets it to default.
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
bool knowsParameter(const std::string &key) const
Returns whether the parameter is known.
A point in 2D or 3D with translation and scaling methods.
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
double x() const
Returns the x-position.
double z() const
Returns the z-position.
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position
double y() const
Returns the y-position.
double length2D() const
Returns the length.
void rotate2D(double angle)
Position getPolygonCenter() const
Returns the arithmetic of all corner points.
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
void add(double xoff, double yoff, double zoff)
static Position sideOffset(const Position &beg, const Position &end, const double amount)
get a side position of position vector using a offset
double distance2D(const Position &p, bool perpendicular=false) const
closest 2D-distance to point p (or -1 if perpendicular is true and the point is beyond this vector)
double nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
void move2side(double amount, double maxExtension=100)
move position vector to side using certain ammount
PositionVector getSubpart2D(double beginOffset, double endOffset) const
get subpart of a position vector in two dimensions (Z is ignored)
double angleAt2D(int pos) const
get angle in certain position of position vector
PositionVector bezier(int numPoints)
return a bezier interpolation
int insertAtClosest(const Position &p, bool interpolateZ)
inserts p between the two closest positions
int removeClosest(const Position &p)
removes the point closest to p and return the removal index
PositionVector getSubpartByIndex(int beginIndex, int count) const
get subpart of a position vector using index and a cout
Position positionAtOffset2D(double pos, double lateralOffset=0) const
Returns the position at the given length.
const PositionVector & getShape() const
Returns whether the shape of the polygon.
Storage for geometrical objects.
const Polygons & getPolygons() const
Returns all polygons.
const std::string & getShapeType() const
Returns the (abstract) type of the Shape.
bool hasString(const std::string &str) const
T get(const std::string &str) const
void insert(const std::string str, const T key, bool checkDuplicates=true)
std::vector< std::string > getVector()
return vector of strings
static std::string escapeXML(const std::string &orig, const bool maskDoubleHyphen=false)
Replaces the standard escapes by their XML entities.
A structure which describes a connection between edges or lanes.
int fromLane
The lane the connections starts at.
int toLane
The lane the connections yields in.
NBEdge * toEdge
The edge the connections yields in.
double vmax
maximum velocity
std::string id
id of Connection