55 if (!oc.
isSet(
"dlr-navteq-output")) {
58 std::map<NBEdge*, std::string> internalNodes;
68 device <<
"# Format matches Extraction version: V6.5 \n";
69 std::stringstream tmp;
71 tmp.seekg(std::ios_base::beg);
74 std::getline(tmp, line);
75 device <<
"# " << line <<
"\n";
90 const double geoScale = pow(10.0f, haveGeo ? 5 : 2);
93 WRITE_WARNING(
"DlrNavteq node data will be written in (floating point) cartesian coordinates");
96 device <<
"# NODE_ID\tIS_BETWEEN_NODE\tamount_of_geocoordinates\tx1\ty1\t[x2 y2 ... xn yn]\n";
106 for (std::map<std::string, NBEdge*>::const_iterator i = ec.
begin(); i != ec.
end(); ++i) {
107 if ((*i).second->getGeometry().size() > 2) {
111 device <<
"# [xmin_region] " << min.x() <<
"\n";
112 device <<
"# [xmax_region] " << max.x() <<
"\n";
113 device <<
"# [ymin_region] " << min.y() <<
"\n";
114 device <<
"# [ymax_region] " << max.y() <<
"\n";
115 device <<
"# [elements_multinode] " << multinodes <<
"\n";
116 device <<
"# [elements_normalnode] " << nc.
size() <<
"\n";
117 device <<
"# [xmin] " << min.x() <<
"\n";
118 device <<
"# [xmax] " << max.x() <<
"\n";
119 device <<
"# [ymin] " << min.y() <<
"\n";
120 device <<
"# [ymax] " << max.y() <<
"\n";
122 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
127 device << n->
getID() <<
"\t0\t1\t" << pos.
x() <<
"\t" << pos.
y() <<
"\n";
130 std::vector<std::string> avoid;
131 std::set<std::string> reservedNodeIDs;
132 const bool numericalIDs = oc.
getBool(
"numerical-ids");
133 if (oc.
isSet(
"reserved-ids")) {
139 std::vector<std::string> avoid2 = ec.
getAllNames();
140 avoid.insert(avoid.end(), avoid2.begin(), avoid2.end());
141 avoid.insert(avoid.end(), reservedNodeIDs.begin(), reservedNodeIDs.end());
144 for (std::map<std::string, NBEdge*>::const_iterator i = ec.
begin(); i != ec.
end(); ++i) {
147 if (geom.size() > 2) {
157 WRITE_WARNING(
"Could not reconstruct shape for edge:'" + e->
getID() +
"' (" + exception.what() +
").");
164 WRITE_WARNING(
"Could not reconstruct shape for edge:'" + e->
getID() +
"' (" + exception.what() +
").");
168 std::string internalNodeID = e->
getID();
170 || (nc.
retrieve(internalNodeID) !=
nullptr)
171 || reservedNodeIDs.count(internalNodeID) > 0
175 internalNodeID = idSupplier.
getNext();
177 internalNodeID +=
"_geometry";
180 internalNodes[e] = internalNodeID;
181 device << internalNodeID <<
"\t1\t" << geom.size() - 2;
182 for (
int ii = 1; ii < (int)geom.size() - 1; ++ii) {
186 device <<
"\t" << pos.
x() <<
"\t" << pos.
y();
197 std::map<const std::string, std::string> nameIDs;
201 device <<
"# LINK_ID\tNODE_ID_FROM\tNODE_ID_TO\tBETWEEN_NODE_ID\tLENGTH\tVEHICLE_TYPE\tFORM_OF_WAY\tBRUNNEL_TYPE\tFUNCTIONAL_ROAD_CLASS\tSPEED_CATEGORY\tNUMBER_OF_LANES\tSPEED_LIMIT\tSPEED_RESTRICTION\tNAME_ID1_REGIONAL\tNAME_ID2_LOCAL\tHOUSENUMBERS_RIGHT\tHOUSENUMBERS_LEFT\tZIP_CODE\tAREA_ID\tSUBAREA_ID\tTHROUGH_TRAFFIC\tSPECIAL_RESTRICTIONS\tEXTENDED_NUMBER_OF_LANES\tISRAMP\tCONNECTION\n";
203 for (std::map<std::string, NBEdge*>::const_iterator i = ec.
begin(); i != ec.
end(); ++i) {
206 const std::string& betweenNodeID = (e->
getGeometry().size() > 2) ? internalNodes[e] :
UNDEFINED;
208 if (oc.
getBool(
"output.street-names")) {
209 const std::string& name = i->second->getStreetName();
211 if (nameIDs.count(name) == 0) {
212 nameIDs[name] =
toString(nameIDs.size());
214 nameID = nameIDs[name];
217 device << e->
getID() <<
"\t" 220 << betweenNodeID <<
"\t" 244 if (oc.
getBool(
"output.street-names")) {
248 namesDevice <<
"# NAME_ID\tPERMANENT_ID_INFO\tName\n";
249 namesDevice <<
"# [elements] " << nameIDs.size() <<
"\n";
250 for (std::map<const std::string, std::string>::const_iterator i = nameIDs.begin(); i != nameIDs.end(); ++i) {
264 if (permissions ==
SVCAll) {
265 return "100000000000";
267 std::ostringstream oss;
269 oss << ((permissions & SVC_PASSENGER) > 0 ? 1 : 0);
270 oss << ((permissions & SVC_PASSENGER) > 0 ? 1 : 0);
271 oss << ((permissions & SVC_HOV) > 0 ? 1 : 0);
272 oss << ((permissions & SVC_EMERGENCY) > 0 ? 1 : 0);
273 oss << ((permissions & SVC_TAXI) > 0 ? 1 : 0);
274 oss << ((permissions & (SVC_BUS | SVC_COACH)) > 0 ? 1 : 0);
275 oss << ((permissions & SVC_DELIVERY) > 0 ? 1 : 0);
276 oss << ((permissions & (SVC_TRUCK | SVC_TRAILER)) > 0 ? 1 : 0);
277 oss << ((permissions & SVC_MOTORCYCLE) > 0 ? 1 : 0);
278 oss << ((permissions & SVC_BICYCLE) > 0 ? 1 : 0);
279 oss << ((permissions & SVC_PEDESTRIAN) > 0 ? 1 : 0);
292 type = type.substr(8);
304 }
else if (type ==
"unclassified") {
306 }
else if (type ==
"living_street" || type ==
"residential" || type ==
"road" || type ==
"service" || type ==
"track" || type ==
"cycleway" || type ==
"path" || type ==
"footway") {
384 const int code = (numLanes == 1 ? 1 :
385 (numLanes < 4 ? 2 : 3));
386 return numLanes * 10 + code;
396 }
else if (edge->
getTypeID() ==
"route.ferry") {
409 }
else if (edge->
getTypeID() ==
"highway.service") {
411 }
else if (edge->
getTypeID().find(
"_link") != std::string::npos) {
430 if (zipCode.find_first_of(
" ,;") != std::string::npos) {
431 WRITE_WARNING(
"ambiguous zip code '" + zipCode +
"' for edge '" + edgeID +
"'. (using first value)");
433 std::vector<std::string> ret = st.
getVector();
435 }
else if (zipCode.size() > 16) {
436 WRITE_WARNING(
"long zip code '" + zipCode +
"' for edge '" + edgeID +
"'");
447 const double geoScale = pow(10.0f, haveGeo ? 5 : 2);
450 device <<
"#Traffic signal related to LINK_ID and NODE_ID with location relative to driving direction.\n#column format like pointcollection.\n#DESCRIPTION->LOCATION: 1-rechts von LINK; 2-links von LINK; 3-oberhalb LINK -1-keineAngabe\n#RELATREC_ID\tPOICOL_TYPE\tDESCRIPTION\tLONGITUDE\tLATITUDE\tLINK_ID\n";
452 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
459 for (EdgeVector::const_iterator it = incoming.begin(); it != incoming.end(); ++it) {
461 device << e->
getID() <<
"\t" 463 <<
"LSA;NODEIDS#" << n->
getID() <<
"#;LOCATION#-1#;\t" 466 << e->
getID() <<
"\n";
479 std::set<std::string> reservedRelIDs;
480 if (oc.
isSet(
"reserved-ids")) {
484 avoid.insert(avoid.end(), reservedRelIDs.begin(), reservedRelIDs.end());
487 device <<
"#No driving allowed from ID1 to ID2 or the complete chain from ID1 to IDn\n";
488 device <<
"#RELATREC_ID\tPERMANENT_ID_INFO\tVALIDITY_PERIOD\tTHROUGH_TRAFFIC\tVEHICLE_TYPE\tNAVTEQ_LINK_ID1\t[NAVTEQ_LINK_ID2 ...]\n";
490 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
494 for (EdgeVector::const_iterator j = incoming.begin(); j != incoming.end(); ++j) {
497 for (EdgeVector::const_iterator k = outgoing.begin(); k != outgoing.end(); ++k) {
503 << idSupplier.
getNext() <<
"\t" 508 << inEdge->
getID() <<
"\t" << outEdge->
getID() <<
"\n";
522 device <<
"#Lane connections related to LINK-IDs and NODE-ID.\n";
523 device <<
"#column format like pointcollection.\n";
524 device <<
"#NODE-ID\tVEHICLE-TYPE\tFROM_LANE\tTO_LANE\tTHROUGH_TRAFFIC\tLINK_IDs[2..*]\n";
526 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
529 for (EdgeVector::const_iterator j = incoming.begin(); j != incoming.end(); ++j) {
532 const std::vector<NBEdge::Connection>& connections = from->
getConnections();
533 for (std::vector<NBEdge::Connection>::const_iterator it_c = connections.begin(); it_c != connections.end(); it_c++) {
536 << n->
getID() <<
"\t" 541 << from->
getID() <<
"\t" LaneSpreadFunction getLaneSpreadFunction() const
Returns how this edge's lanes' lateral offset is computed.
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
double ymin() const
Returns minimum y-coordinate.
void close()
Closes the device and removes it from the dictionary.
double xmax() const
Returns maximum x-coordinate.
A structure which describes a connection between edges or lanes.
int toLane
The lane the connections yields in.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
NBEdge * toEdge
The edge the connections yields in.
const Boundary & getConvBoundary() const
Returns the converted boundary.
static void loadPrefixedIDsFomFile(const std::string &file, const std::string prefix, std::set< std::string > &into)
Add prefixed ids defined in file.
static double getGraphLength(NBEdge *edge)
get the length of the edge when measured up to the junction center
bool isConnectedTo(const NBEdge *e) const
Returns the information whethe a connection to the given edge has been added (or computed) ...
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
static void writeHeader(OutputDevice &device, const OptionsCont &oc)
write header comments (input paramters, date, etc...)
int getJunctionPriority(const NBNode *const node) const
Returns the junction priority (normalised for the node currently build)
static int getRoadClass(NBEdge *edge)
get the navteq road class
NBEdge * getOppositeByID(const std::string &edgeID) const
Returns the edge with negated id if it exists.
static int speedInKph(double metersPerSecond)
get edge speed rounded to kmh
const std::string & getTypeID() const
get ID of type
double y() const
Returns the y-position.
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
bool usingGeoProjection() const
Returns whether a transformation from geo to metric coordinates will be performed.
static int getSpeedCategory(int kph)
get the navteq speed class based on the speed in km/h
The representation of a single edge during network building.
static void writeLinksUnsplitted(const OptionsCont &oc, NBEdgeCont &ec, std::map< NBEdge *, std::string > &internalNodes)
Writes the links_unsplitted file.
double x() const
Returns the x-position.
static void writeProhibitedManoeuvres(const OptionsCont &oc, const NBNodeCont &nc, const NBEdgeCont &ec)
Writes the prohibited_manoeuvres file.
void setPrecision(int precision=gPrecision)
Sets the precison or resets it to default.
std::map< std::string, NBEdge * >::const_iterator end() const
Returns the pointer to the end of the stored edges.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const std::string & getID() const
Returns the id.
const SVCPermissions SVCAll
all VClasses are allowed
static int getSpeedCategoryUpperBound(int kph)
get the SPEED_LIMIT as defined by elmar (upper bound of speed category)
A class that stores a 2D geometrical boundary.
#define WRITE_WARNING(msg)
void writeConfiguration(std::ostream &os, const bool filled, const bool complete, const bool addComments, const bool inComment=false) const
Writes the configuration.
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node)
static const std::string UNDEFINED
magic value for undefined stuff
void cartesian2geo(Position &cartesian) const
Converts the given cartesian (shifted) position to its geo (lat/long) representation.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
bool isTLControlled() const
Returns whether this node is controlled by any tls.
static int getNavteqLaneCode(const int numLanes)
get the lane number encoding
void push_front_noDoublePos(const Position &p)
insert in front a non double position
static void writeConnectedLanes(const OptionsCont &oc, NBNodeCont &nc)
Writes the connected_lanes file.
static bool startsWith(const std::string &str, const std::string prefix)
Checks whether a given string starts with the prefix.
std::map< std::string, NBEdge * >::const_iterator begin() const
Returns the pointer to the begin of the stored edges.
bool knowsParameter(const std::string &key) const
Returns whether the parameter is known.
std::string getNext()
Returns the next id.
static methods for processing the coordinates conversion for the current net
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
int size() const
Returns the number of nodes stored in this container.
int getNumLanes() const
Returns the number of lanes.
int fromLane
The lane the connections starts at.
A point in 2D or 3D with translation and scaling methods.
NBEdgeCont & getEdgeCont()
void move2side(double amount, double maxExtension=100)
move position vector to side using certain ammount
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
static std::string getSinglePostalCode(const std::string &zipCode, const std::string edgeID)
Storage for edges, including some functionality operating on multiple edges.
double xmin() const
Returns minimum x-coordinate.
static void writeNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Writes the network into XML-files (nodes, edges, connections, traffic lights)
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
double getSpeed() const
Returns the speed allowed on this edge.
std::vector< std::string > getVector()
return vector of strings
const PositionVector & getGeometry() const
Returns the geometry of the edge.
static std::string getAllowedTypes(SVCPermissions permissions)
build the ascii-bit-vector for column vehicle_type
std::vector< std::string > getAllNames() const
get all node names
double length() const
Returns the length.
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
const std::vector< Connection > & getConnections() const
Returns the connections.
NBNodeCont & getNodeCont()
Returns a reference to the node container.
Instance responsible for building networks.
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
double getTotalWidth() const
Returns the combined width of all lanes of this edge.
A storage for options typed value containers)
const std::string getParameter(const std::string &key, const std::string &defaultValue="") const
Returns the value for a given key.
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
const Position & getPosition() const
Represents a single node (junction) during network building.
static int getBrunnelType(NBEdge *edge)
get the navteq brunnel type
static int getFormOfWay(NBEdge *edge)
get the form of way
static void writeTrafficSignals(const OptionsCont &oc, NBNodeCont &nc)
Writes the traffic_signals file.
Static storage of an output device and its base (abstract) implementation.
void push_back_noDoublePos(const Position &p)
insert in back a non double position
NBNode * getFromNode() const
Returns the origin node of the edge.
Container for nodes during the netbuilding process.
void mul(double val)
Multiplies both positions with the given value.
double ymax() const
Returns maximum y-coordinate.
std::vector< std::string > getAllNames() const
Returns all ids of known edges.
static void writeNodesUnsplitted(const OptionsCont &oc, NBNodeCont &nc, NBEdgeCont &ec, std::map< NBEdge *, std::string > &internalNodes)
Writes the nodes_unsplitted file.
NBNode * getToNode() const
Returns the destination node of the edge.