47 #ifdef CHECK_MEMORY_LEAKS
49 #endif // CHECK_MEMORY_LEAKS
62 if (!oc.
isSet(
"opendrive-output")) {
72 device <<
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
73 device <<
"<OpenDRIVE>\n";
75 std::string dstr(ctime(&now));
79 device <<
" <header revMajor=\"1\" revMinor=\"3\" name=\"\" version=\"1.00\" date=\"" << dstr.substr(0, dstr.length() - 1)
80 <<
"\" north=\"" << b.
ymax() <<
"\" south=\"" << b.
ymin() <<
"\" east=\"" << b.
xmax() <<
"\" west=\"" << b.
xmin()
81 <<
"\" maxRoad=\"" << ec.
size() <<
"\" maxJunc=\"" << nc.
size() <<
"\" maxPrg=\"0\"/>\n";
83 for (std::map<std::string, NBEdge*>::const_iterator i = ec.
begin(); i != ec.
end(); ++i) {
84 const NBEdge* e = (*i).second;
86 device <<
" <link>\n";
87 device <<
" <predecessor elementType=\"junction\" elementId=\"" <<
getID(e->
getFromNode()->
getID(), nodeMap, nodeID) <<
"\"/>\n";
88 device <<
" <successor elementType=\"junction\" elementId=\"" <<
getID(e->
getToNode()->
getID(), nodeMap, nodeID) <<
"\"/>\n";
89 device <<
" </link>\n";
90 device <<
" <type s=\"0\" type=\"town\"/>\n";
91 const std::vector<NBEdge::Lane>& lanes = e->
getLanes();
92 unsigned int li = (
unsigned int)lanes.size() - 1;
100 device <<
" <elevationProfile><elevation s=\"0\" a=\"0\" b=\"0\" c=\"0\" d=\"0\"/></elevationProfile>\n";
101 device <<
" <lateralProfile/>\n";
102 device <<
" <lanes>\n";
103 device <<
" <laneSection s=\"0\">\n";
105 device <<
" <right>\n";
107 device <<
" <lane id=\"-" << e->
getNumLanes() - j <<
"\" type=\"driving\" level=\"0\">\n";
108 device <<
" <link>\n";
109 device <<
" <predecessor id=\"-1\"/>\n";
110 device <<
" <successor id=\"-1\"/>\n";
111 device <<
" </link>\n";
112 device <<
" <width sOffset=\"0\" a=\"" << e->
getLaneWidth(j) <<
"\" b=\"0\" c=\"0\" d=\"0\"/>\n";
113 std::string markType =
"broken";
117 device <<
" <roadMark sOffset=\"0\" type=\"" << markType <<
"\" weight=\"standard\" color=\"standard\" width=\"0.13\"/>\n";
118 device <<
" <speed sOffset=\"0\" max=\"" << lanes[j].speed <<
"\"/>\n";
119 device <<
" </lane>\n";
121 device <<
" </right>\n";
122 device <<
" </laneSection>\n";
123 device <<
" </lanes>\n";
124 device <<
" <objects/>\n";
125 device <<
" <signals/>\n";
126 device <<
" </road>\n";
130 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
133 for (std::vector<NBEdge*>::const_iterator j = incoming.begin(); j != incoming.end(); ++j) {
134 const std::vector<NBEdge::Connection>& elv = (*j)->getConnections();
135 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
136 if ((*k).toEdge == 0) {
153 device <<
" <link>\n";
154 device <<
" <predecessor elementType=\"road\" elementId=\"" <<
getID((*j)->getID(), edgeMap, edgeID) <<
"\"/>\n";
155 device <<
" <successor elementType=\"road\" elementId=\"" <<
getID((*k).toEdge->getID(), edgeMap, edgeID) <<
"\"/>\n";
156 device <<
" </link>\n";
157 device <<
" <type s=\"0\" type=\"town\"/>\n";
159 device <<
" <elevationProfile><elevation s=\"0\" a=\"0\" b=\"0\" c=\"0\" d=\"0\"/></elevationProfile>\n";
160 device <<
" <lateralProfile/>\n";
161 device <<
" <lanes>\n";
162 device <<
" <laneSection s=\"0\">\n";
164 device <<
" <right>\n";
165 device <<
" <lane id=\"-1\" type=\"driving\" level=\"0\">\n";
166 device <<
" <link>\n";
167 device <<
" <predecessor id=\"-" << (*j)->getNumLanes() - c.
fromLane <<
"\"/>\n";
169 device <<
" </link>\n";
170 device <<
" <width sOffset=\"0\" a=\"" << width <<
"\" b=\"0\" c=\"0\" d=\"0\"/>\n";
171 device <<
" <roadMark sOffset=\"0\" type=\"none\" weight=\"standard\" color=\"standard\" width=\"0.13\"/>\n";
172 device <<
" </lane>\n";
173 device <<
" </right>\n";
174 device <<
" </laneSection>\n";
175 device <<
" </lanes>\n";
176 device <<
" <objects/>\n";
177 device <<
" <signals/>\n";
178 device <<
" </road>\n";
184 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
186 device <<
" <junction name=\"" << n->
getID() <<
"\" id=\"" <<
getID(n->
getID(), nodeMap, nodeID) <<
"\">\n";
187 unsigned int index = 0;
189 for (std::vector<NBEdge*>::const_iterator j = incoming.begin(); j != incoming.end(); ++j) {
190 const std::vector<NBEdge::Connection>& elv = (*j)->getConnections();
191 for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
192 if ((*k).toEdge == 0) {
195 device <<
" <connection id=\"" << index <<
"\" incomingRoad=\"" <<
getID((*j)->getID(), edgeMap, edgeID)
196 <<
"\" connectingRoad=\"" <<
getID((*k).getInternalLaneID(), edgeMap, edgeID) <<
"\" contactPoint=\"start\"/>\n";
200 device <<
" </junction>\n";
203 device <<
"</OpenDRIVE>\n";
210 device <<
" <planView>\n";
212 for (
unsigned int j = 0; j < shape.size() - 1; ++j) {
216 device <<
" <geometry s=\"" << offset <<
"\" x=\"" << p.
x() <<
"\" y=\"" << p.
y() <<
"\" hdg=\"" << hdg <<
"\" length=\"" << l.
length() <<
"\"><line/></geometry>\n";
219 device <<
" </planView>\n";
225 device <<
" <center>\n";
226 device <<
" <lane id=\"0\" type=\"none\" level= \"0\">\n";
227 device <<
" <link/>\n";
228 device <<
" <roadMark sOffset=\"0\" type=\"" << mark <<
"\" weight=\"standard\" color=\"standard\" width=\"" << markWidth <<
"\"/>\n";
229 device <<
" <width sOffset=\"0\" a=\"0\" b=\"0\" c=\"0\" d=\"0\"/>\n";
230 device <<
" </lane>\n";
231 device <<
" </center>\n";
238 return map.
get(origID);
240 map.
insert(origID, lastID++);
static void writePlanView(const PositionVector &shape, OutputDevice &device)
const PositionVector & getLaneShape(unsigned int i) const
Returns the shape of the nth lane.
const Position & p2() const
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges.
A structure which describes a connection between edges or lanes.
int toLane
The lane the connections yields in.
const SUMOReal SUMO_const_laneWidth
NBEdge * toEdge
The edge the connections yields in.
bool hasString(const std::string &str) const
SUMOReal ymin() const
Returns minimum y-coordinate.
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
The representation of a single edge during network building.
static std::string escapeXML(const std::string &orig)
Replaces the standard escapes by their XML entities.
SUMOReal xmin() const
Returns minimum x-coordinate.
SUMOReal getLaneWidth() const
Returns the default width of lanes of this edge.
SUMOReal x() const
Returns the x-position.
SUMOReal xmax() const
Returns maximum x-coordinate.
A class that stores a 2D geometrical boundary.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
const std::string & getID() const
Returns the id.
void insert(const std::string str, const T key, bool checkDuplicates=true)
unsigned int size() const
Returns the number of known nodes.
Line lineAt(int pos) const
const Position & p1() const
static void writeNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Writes the network into a openDRIVE-file.
std::map< std::string, NBEdge * >::const_iterator end() const
Returns the pointer to the end of the stored edges.
std::string getInternalLaneID() const
int fromLane
The lane the connections starts at.
A point in 2D or 3D with translation and scaling methods.
NBEdgeCont & getEdgeCont()
Returns the edge container.
unsigned int getNumLanes() const
Returns the number of lanes.
static void writeEmptyCenterLane(OutputDevice &device, const std::string &mark, SUMOReal markWidth)
Storage for edges, including some functionality operating on multiple edges.
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
const Boundary & getConvBoundary() const
Returns the converted boundary.
std::map< std::string, NBEdge * >::const_iterator begin() const
Returns the pointer to the begin of the stored edges.
SUMOReal length() const
Returns the length.
NBNode * getToNode() const
Returns the destination node of the edge.
NBNodeCont & getNodeCont()
Returns the node container.
Instance responsible for building networks.
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
SUMOReal y() const
Returns the y-position.
A storage for options typed value containers)
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
Represents a single node (junction) during network building.
T get(const std::string &str) const
void move2side(SUMOReal amount)
Static storage of an output device and its base (abstract) implementation.
SUMOReal ymax() const
Returns maximum y-coordinate.
Container for nodes during the netbuilding process.
static int getID(const std::string &origID, StringBijection< int > &map, int &lastID)
const std::string & getStreetName() const
Returns the street name of this edge.
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
void append(const PositionVector &v, SUMOReal sameThreshold=2.0)
unsigned int size() const
Returns the number of edges.
SUMOReal getLength() const
Returns the computed length of the edge.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
NBNode * getFromNode() const
Returns the origin node of the edge.