57 if (!oc.
isSet(
"visum-file")) {
63 oc.
getBool(
"visum.use-type-priority"));
73 const std::string& file,
130 for (NIVisumTL_Map::iterator j =
myTLS.begin(); j !=
myTLS.end(); j++) {
155 if (line.length() > 0 && line[0] ==
'$') {
156 ParserVector::iterator i;
158 std::string dataName =
"$" + (*i).name +
":";
159 if (line.substr(0, dataName.length()) == dataName) {
161 (*i).pattern = line.substr(dataName.length());
169 if ((*i).position < 0) {
181 bool singleDataEndFound =
false;
184 if (line.length() == 0 || line[0] ==
'*' || line[0] ==
'$') {
185 singleDataEndFound =
true;
190 (this->*(*i).function)();
192 WRITE_ERROR(
"Too short value line in " + (*i).name +
" occured.");
196 WRITE_ERROR(
"One of the needed values ('" + std::string(e.what()) +
"') is missing in " + (*i).name +
".");
204 for (NIVisumTL_Map::iterator j =
myTLS.begin(); j !=
myTLS.end(); j++) {
209 (*k).first->addShape((*k).second);
328 if (speedS.find(
"km/h") != std::string::npos) {
329 speedS = speedS.substr(0, speedS.find(
"km/h"));
332 speed = speed / (double) 3.6;
362 bool oneway_checked = oneway;
367 oneway_checked =
false;
370 oneway_checked =
false;
378 oneway_checked =
false;
382 if (nolanes != 0 && speed != 0) {
399 if (nolanes != 0 && speed != 0) {
418 myEdges[id] = std::make_pair(from, to);
464 std::string
id = bez +
"-" + dest->getID();
467 if (dir.length() == 0) {
471 if (dir.find(
'Q') != std::string::npos) {
472 const EdgeVector& edges = dest->getOutgoingEdges();
473 bool hasContinuation =
false;
474 for (EdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
475 if (!(*i)->isMacroscopicConnector()) {
476 hasContinuation =
true;
479 if (!hasContinuation) {
481 WRITE_WARNING(
"Incoming connector '" +
id +
"' will not be build - would be not connected to network.");
485 WRITE_ERROR(
"The district '" + bez +
"' could not be built.");
488 NBEdge* edge =
new NBEdge(
id, src, dest,
"VisumConnector",
495 WRITE_ERROR(
"A duplicate edge id occured (ID='" +
id +
"').");
505 if (dir.find(
'Z') != std::string::npos) {
506 const EdgeVector& edges = dest->getIncomingEdges();
507 bool hasPredeccessor =
false;
508 for (EdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
509 if (!(*i)->isMacroscopicConnector()) {
510 hasPredeccessor =
true;
513 if (!hasPredeccessor) {
515 WRITE_WARNING(
"Outgoing connector '" +
id +
"' will not be build - would be not connected to network.");
519 WRITE_ERROR(
"The district '" + bez +
"' could not be built.");
523 NBEdge* edge =
new NBEdge(
id, dest, src,
"VisumConnector",
530 WRITE_ERROR(
"A duplicate edge id occured (ID='" +
id +
"').");
552 if (from == 0 || via == 0 || to == 0) {
599 WRITE_ERROR(
"Error in geometry description from node '" + from->
getID() +
"' to node '" + to->
getID() +
"'.");
604 WRITE_ERROR(
"Unable to project coordinates for node '" + from->
getID() +
"'.");
635 if (node == 0 || edge == 0) {
646 WRITE_ERROR(
"A lane number for edge '" + edge->
getID() +
"' is not numeric (" + laneS +
").");
651 WRITE_ERROR(
"A lane number for edge '" + edge->
getID() +
"' is not positive (" + laneS +
").");
667 WRITE_ERROR(
"A lane length for edge '" + edge->
getID() +
"' is not numeric (" + lengthS +
").");
671 WRITE_ERROR(
"A lane length for edge '" + edge->
getID() +
"' is not positive (" + lengthS +
").");
688 if (edge->
getID().substr(edge->
getID().length() - node->
getID().length() - 1) ==
"_" + node->
getID()) {
701 bool mustRecheck =
true;
702 double seenLength = 0;
703 while (mustRecheck) {
704 if (edge->
getID().substr(edge->
getID().length() - node->
getID().length() - 1) ==
"_" + node->
getID()) {
706 std::string sub = edge->
getID();
707 sub = sub.substr(sub.rfind(
'_', sub.rfind(
'_') - 1));
708 sub = sub.substr(1, sub.find(
'_', 1) - 1);
729 double useLength = length - seenLength;
730 useLength = edge->
getLength() - useLength;
731 std::string edgeID = edge->
getID();
733 if (edgeID.substr(edgeID.length() - node->
getID().length() - 1) ==
"_" + node->
getID()) {
734 edgeID = edgeID.substr(0, edgeID.find(
'_'));
740 std::string nid = edgeID +
"_" +
toString((
int) length) +
"_" + node->
getID();
745 while (nedge->
getID().substr(nedge->
getID().length() - node->
getID().length() - 1) ==
"_" + node->
getID()) {
786 WRITE_ERROR(
"Could not find TLS '" + LSAid +
"' for setting the signal group.");
807 if (from == 0 && to == 0) {
816 if (edg1 != 0 && edg2 != 0) {
819 if (edg1->
getID()[0] ==
'-') {
820 sid = edg1->
getID().substr(1);
822 sid =
"-" + edg1->
getID();
824 if (sid.find(
'_') != std::string::npos) {
825 sid = sid.substr(0, sid.find(
'_'));
831 if (edg2->
getID()[0] ==
'-') {
832 sid = edg2->
getID().substr(1);
834 sid =
"-" + edg2->
getID();
836 if (sid.find(
'_') != std::string::npos) {
837 sid = sid.substr(0, sid.find(
'_'));
851 WRITE_ERROR(
"Unknown edge in TEILFLAECHENELEMENT");
867 if (dir.length() > 0 && dir[0] ==
'1') {
875 const std::vector<long long int>& areas =
mySubPartsAreas.find(
id)->second;
876 for (std::vector<long long int>::const_iterator i = areas.begin(); i != areas.end(); ++i) {
884 if (dir.length() > 0 && dir[0] ==
'1') {
916 SG.
phases()[Phaseid] = PH;
929 if (fromEdge == 0 || toEdge == 0) {
933 int fromLaneOffset = 0;
943 int toLaneOffset = 0;
957 WRITE_ERROR(
"A from-lane number for edge '" + fromEdge->
getID() +
"' is not numeric (" + fromLaneS +
").");
962 WRITE_ERROR(
"A from-lane number for edge '" + fromEdge->
getID() +
"' is not positive (" + fromLaneS +
").");
971 WRITE_ERROR(
"A to-lane number for edge '" + toEdge->
getID() +
"' is not numeric (" + toLaneS +
").");
976 WRITE_ERROR(
"A to-lane number for edge '" + toEdge->
getID() +
"' is not positive (" + toLaneS +
").");
980 if (fromLane - fromLaneOffset < 0) {
983 fromLane = (int)fromEdge->
getNumLanes() - (fromLane - fromLaneOffset) - 1;
985 if (toLane - toLaneOffset < 0) {
988 toLane = (int)toEdge->
getNumLanes() - (toLane - toLaneOffset) - 1;
992 WRITE_ERROR(
"A from-lane number for edge '" + fromEdge->
getID() +
"' is larger than the edge's lane number (" + fromLaneS +
").");
996 WRITE_ERROR(
"A to-lane number for edge '" + toEdge->
getID() +
"' is larger than the edge's lane number (" + toLaneS +
").");
1044 WRITE_ERROR(
"The node '" + nodeS +
"' is not known.");
1065 WRITE_ERROR(
"The edge '" + edgeS +
"' is not known.");
1085 if (edge->
getID()[0] ==
'-') {
1086 sid = edge->
getID().substr(1);
1088 sid =
"-" + edge->
getID();
1090 if (sid.find(
'_') != std::string::npos) {
1091 sid = sid.substr(0, sid.find(
'_'));
1103 std::string edgeID = ret->
getID();
1111 if (nedges.size() != 1) {
1116 NBEdge* next = nedges[0];
1117 if (ret->
getID().substr(0, edgeID.length()) != next->
getID().substr(0, edgeID.length())) {
1137 if (nedges.size() != 1) {
1142 NBEdge* next = nedges[0];
1143 if (ret->
getID().substr(0, edgeID.length()) != next->
getID().substr(0, edgeID.length())) {
1163 WRITE_ERROR(
"The edge '" + edgeS +
"' is not known.");
1182 EdgeVector::const_iterator i;
1184 if (ToNode == (*i)->getToNode()) {
1197 value = value.substr(0, value.length() - 4);
1208 return defaultValue;
1225 double defaultValue) {
1242 const std::string& fieldName2) {
1265 nid =
id +
"-" + dest->
getID();
1271 WRITE_ERROR(
"Could not build connector node '" + nid +
"'.");
1281 WRITE_ERROR(
" The from-node was not found within the net");
1284 WRITE_ERROR(
" The to-node was not found within the net");
1289 return from != 0 && to != 0 && from != to;
std::map< std::string, Phase * > & phases()
Returns the phases map.
void insert(const std::string &id, int numLanes, double maxSpeed, int prio, SVCPermissions permissions, double width, bool oneWayIsDefault, double sidewalkWidth, double bikeLaneWidth)
Adds a type into the list.
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
long position
Position of the according db within the file.
unsigned long getPosition()
Returns the current position within the file.
void parse_NodesToTrafficLights()
Parses KNOTENZULSA/SIGNALANLAGEZUKNOTEN.
A signal group can be defined either by a time period or by phases.
NBTypeCont & getTypeCont()
Returns a reference to the type container.
void parse_Kante()
Parses FLAECHENELEMENT.
bool myUseVisumPrio
Information whether VISUM priority information shall be used.
void load()
Parses the VISUM-network file storing the parsed structures within myNetBuilder.
static bool transformCoordinate(Position &from, bool includeInBoundary=true, GeoConvHelper *from_srs=0)
transforms loaded coordinates handles projections, offsets (using GeoConvHelper) and import of height...
static double _2doubleSec(const E *const data, double def)
converts a 0-terminated char-type array into the double value described by it
std::map< NBDistrict *, PositionVector > myDistrictShapes
A temporary storage for district shapes as they are filled incrementally.
LineReader myLineReader
The line reader to use to read from the file.
std::vector< std::string > myTouchedEdges
Already read edges.
const Position & getPosition() const
Returns the position of this district's center.
NBEdge * getNamedEdgeContinuating(const std::string &fieldName, NBNode *node)
Tries to get the edge which name is stored in the given field continuating the search for a subedge t...
static bool endsWith(const std::string &str, const std::string suffix)
Checks whether a given string ends with the suffix.
bool readLine(LineHandler &lh)
Reads a single (the next) line from the file and reports it to the given LineHandler.
std::string myCurrentID
The name of the currently parsed item used for error reporting.
static bool _2bool(const E *const data)
converts a 0-terminated char-type array into the boolean value described by it
void parse_Turns()
Parses ABBIEGEBEZIEHUNG/ABBIEGER.
VSysTypeNames myVSysTypes
The used vsystypes.
NBNode * getNamedNode(const std::string &fieldName)
Tries to get the node which name is stored in the given field.
void parse_TrafficLights()
Parses LSA/SIGNALANLAGE.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
A helper class which computes the lane number from given capacity.
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.
double getWeightedFloat(const std::string &name)
tries to get a double which is possibly assigned to a certain modality
void parse_PartOfArea()
Parses FLAECHENELEMENT.
bool hasOutgoing(const NBEdge *const e) const
Returns whether the given edge starts at this node.
std::string get(const std::string &name, bool prune=false) const
Returns the named information.
static const double UNSPECIFIED_OFFSET
unspecified lane offset
void parse_SignalGroupsToPhases()
Parses LSASIGNALGRUPPEZULSAPHASE.
NIImporter_VISUM(NBNetBuilder &nb, const std::string &file, NBCapacity2Lanes capacity2Lanes, bool useVisumPrio)
constructor
bool setFile(const std::string &file)
Reinitialises the reader for reading from the given file.
void parse_EdgePolys()
Parses STRECKENPOLY.
static long long int _2long(const E *const data)
converts a char-type array into the long value described by it
bool markAsSet(const std::string &id, const SumoXMLAttr attr)
Marks an attribute of a type as set.
bool splitAt(NBDistrictCont &dc, NBEdge *edge, NBNode *node)
Splits the edge at the position nearest to the given node.
void parse_Phases()
Parses LSAPHASE/PHASE.
std::string myFileName
The name of the parsed file, for error reporting.
const SVCPermissions SVCAll
all VClasses are allowed
void parse_AreaSubPartElement()
Parses ABBZULSASIGNALGRUPPE/SIGNALGRUPPEZUABBIEGER.
bool hasIncoming(const NBEdge *const e) const
Returns whether the given edge ends at this node.
static const double UNSPECIFIED_WIDTH
unspecified lane width
NBEdge * getReversedContinuating(NBEdge *edge, NBNode *node)
Returns the opposite direction of the given edge.
#define WRITE_WARNING(msg)
void parse_SignalGroups()
Parses LSASIGNALGRUPPE/SIGNALGRUPPE.
static void loadNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Loads network definition from the assigned option and stores it in the given network builder...
The connection was computed and validated.
static OptionsCont & getOptions()
Retrieves the options.
A VISUM network importer.
PositionVector reverse() const
reverse position vector
void parse_TurnsToSignalGroups()
Parses ABBZULSASIGNALGRUPPE/SIGNALGRUPPEZUABBIEGER.
A class representing a single district.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node)
const std::string & getID() const
Returns the id.
void reinit(const std::string &def, const std::string &defDelim=";", const std::string &lineDelim=";", bool chomp=false, bool ignoreCase=true)
Reinitialises the parser.
bool addEdge2EdgeConnection(NBEdge *dest)
Adds a connection to another edge.
void incLaneNo(int by)
increment lane
std::string getNamedString(const std::string &fieldName)
Returns the value from the named column as a normalised string.
static std::string normalIDRepresentation(const std::string &id)
converts the numerical id to its "normal" string representation
bool addSource(const std::string &dist, NBEdge *const source, double weight)
Adds a source to the named district.
double getNamedFloat(const std::string &fieldName)
Returns the value from the named column as a float.
std::map< long long int, std::pair< long long int, long long int > > myEdges
A map of edge (not road, but "edge" in this case) ids to from/to-points.
A complete call description for parsing a single db.
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
NIVisumTL_Map myTLS
List of visum traffic lights.
void parse_Connectors()
Parses ANBINDUNG.
A point in 2D or 3D with translation and scaling methods.
int getNumLanes(const std::string &type) const
Returns the number of lanes for the given type.
NBEdgeCont & getEdgeCont()
void setAsMacroscopicConnector()
int getPriority(const std::string &type) const
Returns the priority for the given type.
int getNumLanes() const
Returns the number of lanes.
std::map< long long int, std::vector< long long int > > mySubPartsAreas
A map from area parts to area ids.
bool addSink(const std::string &dist, NBEdge *const destination, double weight)
Adds a sink to the named district.
#define PROGRESS_BEGIN_MESSAGE(msg)
void parse_Districts()
Parses BEZIRK.
void addParser(const std::string &name, ParsingFunction function)
Adds a parser into the sorted list of parsers to use.
ParserVector mySingleDataParsers
List of known parsers.
std::map< long long int, Position > myPoints
A map of point ids to positions.
void parse_Point()
Parses PUNKT.
void(NIImporter_VISUM::* ParsingFunction)()
Definition of a function for parsing a single line from a certain db.
NBEdge * getEdge(NBNode *FromNode, NBNode *ToNode)
Returns the edge that connects both nodes.
NBEdge * getConnectionTo(NBNode *n) const
get connection to certain node
void parse_VSysTypes()
Parses VSYS.
void parse_Types()
Parses STRECKENTYP.
bool insert(NBDistrict *const district)
Adds a district to the dictionary.
void parse_Nodes()
Parses KNOTEN.
bool know(const std::string &name) const
Returns the information whether the named column is known.
void parse_Lanes()
Parses FAHRSTREIFEN.
static int _2int(const E *const data)
converts a char-type array into the integer value described by it
NBNode * getToNode() const
Returns the destination node of the edge.
double getLength() const
Returns the computed length of the edge.
~NIImporter_VISUM()
destructor
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
NBNodeCont & getNodeCont()
Returns a reference to the node container.
Instance responsible for building networks.
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
NamedColumnsParser myLineParser
the parser to parse the information from the data lines
std::map< long long int, NBDistrict * > myShapeDistrictMap
A map from district shape definition name to the district.
const PositionVector & getGeometry() const
Returns the geometry of the edge.
A storage for options typed value containers)
int get(double capacity) const
Returns the number of lanes computed from the given capacity.
static double _2double(const E *const data)
converts a char-type array into the double value described by it
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
NBNode * buildDistrictNode(const std::string &id, NBNode *dest, bool isSource)
Builds a node for the given district and returns it.
std::string name
The name of the db.
NBTrafficLightLogicCont & getTLLogicCont()
Returns a reference to the traffic light logics container.
LaneSpreadFunction
Numbers representing special SUMO-XML-attribute values Information how the edge's lateral offset shal...
Intermediate class for storing visum traffic lights during their import.
NBConnectionVector & connections()
Returns the connections vector.
bool addLane2LaneConnection(int fromLane, NBEdge *dest, int toLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, bool keepClear=true, double contPos=UNSPECIFIED_CONTPOS, double visibility=UNSPECIFIED_VISIBILITY_DISTANCE)
Adds a connection between the specified this edge's lane and an approached one.
void reinit()
Reinitialises the reading (of the previous file)
Represents a single node (junction) during network building.
bool getWeightedBool(const std::string &name)
tries to get a bool which is possibly assigned to a certain modality
void setPos(unsigned long pos)
Sets the current position within the file to the given value.
double getSpeed(const std::string &type) const
Returns the maximal velocity for the given type [m/s].
void parse_Edges()
Parses STRECKE/STRECKEN.
NBNetBuilder & myNetBuilder
The network builder to fill with loaded values.
bool hasMore() const
Returns whether another line may be read (the file was not read completely)
void addGeometryPoint(int index, const Position &p)
Adds a further geometry point.
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
#define PROGRESS_DONE_MESSAGE()
ParsingFunction function
Pointer to the function used for parsing.
static int _2intSec(const E *const data, int def)
converts a 0-terminated char-type array into the integer value described by it
bool checkNodes(NBNode *from, NBNode *to)
Returns whether both nodes are a valid combination of from/to-nodes.
void setLaneSpreadFunction(LaneSpreadFunction spread)
(Re)sets how the lanes lateral offset shall be computed
#define WRITE_MESSAGE(msg)
NBEdge * getNamedEdge(const std::string &fieldName)
Tries to get the edge which name is stored in the given field.
NBDistrictCont & getDistrictCont()
Returns a reference the districts container.
void parseLine(const std::string &line)
Parses the contents of the line.
NBCapacity2Lanes myCapacity2Lanes
The converter to compute the lane number of edges from their capacity.
NBDistrict * retrieve(const std::string &id) const
Returns the districts with the given id.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
void parse_LanesConnections()
Parses FAHRSTREIFENABBIEGER.
NBNode * getFromNode() const
Returns the origin node of the edge.