56 if (!oc.
isSet(
"visum-file")) {
62 oc.
getBool(
"visum.use-type-priority"));
72 const std::string& file,
129 for (NIVisumTL_Map::iterator j =
myTLS.begin(); j !=
myTLS.end(); j++) {
154 if (line.length() > 0 && line[0] ==
'$') {
155 ParserVector::iterator i;
157 std::string dataName =
"$" + (*i).name +
":";
158 if (line.substr(0, dataName.length()) == dataName) {
160 (*i).pattern = line.substr(dataName.length());
168 if ((*i).position < 0) {
180 bool singleDataEndFound =
false;
183 if (line.length() == 0 || line[0] ==
'*' || line[0] ==
'$') {
184 singleDataEndFound =
true;
189 (this->*(*i).function)();
191 WRITE_ERROR(
"Too short value line in " + (*i).name +
" occured.");
195 WRITE_ERROR(
"One of the needed values ('" + std::string(e.what()) +
"') is missing in " + (*i).name +
".");
203 for (NIVisumTL_Map::iterator j =
myTLS.begin(); j !=
myTLS.end(); j++) {
208 (*k).first->addShape((*k).second);
327 if (speedS.find(
"km/h") != std::string::npos) {
328 speedS = speedS.substr(0, speedS.find(
"km/h"));
331 speed = speed / (double) 3.6;
361 bool oneway_checked = oneway;
366 oneway_checked =
false;
369 oneway_checked =
false;
377 oneway_checked =
false;
381 if (nolanes != 0 && speed != 0) {
398 if (nolanes != 0 && speed != 0) {
417 myEdges[id] = std::make_pair(from, to);
463 std::string
id = bez +
"-" + dest->getID();
466 if (dir.length() == 0) {
470 if (dir.find(
'Q') != std::string::npos) {
471 const EdgeVector& edges = dest->getOutgoingEdges();
472 bool hasContinuation =
false;
473 for (EdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
474 if (!(*i)->isMacroscopicConnector()) {
475 hasContinuation =
true;
478 if (!hasContinuation) {
480 WRITE_WARNING(
"Incoming connector '" +
id +
"' will not be build - would be not connected to network.");
484 WRITE_ERROR(
"The district '" + bez +
"' could not be built.");
487 NBEdge* edge =
new NBEdge(
id, src, dest,
"VisumConnector",
494 WRITE_ERROR(
"A duplicate edge id occured (ID='" +
id +
"').");
504 if (dir.find(
'Z') != std::string::npos) {
505 const EdgeVector& edges = dest->getIncomingEdges();
506 bool hasPredeccessor =
false;
507 for (EdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
508 if (!(*i)->isMacroscopicConnector()) {
509 hasPredeccessor =
true;
512 if (!hasPredeccessor) {
514 WRITE_WARNING(
"Outgoing connector '" +
id +
"' will not be build - would be not connected to network.");
518 WRITE_ERROR(
"The district '" + bez +
"' could not be built.");
522 NBEdge* edge =
new NBEdge(
id, dest, src,
"VisumConnector",
529 WRITE_ERROR(
"A duplicate edge id occured (ID='" +
id +
"').");
551 if (from == 0 || via == 0 || to == 0) {
598 WRITE_ERROR(
"Error in geometry description from node '" + from->
getID() +
"' to node '" + to->
getID() +
"'.");
603 WRITE_ERROR(
"Unable to project coordinates for node '" + from->
getID() +
"'.");
634 if (node == 0 || edge == 0) {
645 WRITE_ERROR(
"A lane number for edge '" + edge->
getID() +
"' is not numeric (" + laneS +
").");
650 WRITE_ERROR(
"A lane number for edge '" + edge->
getID() +
"' is not positive (" + laneS +
").");
666 WRITE_ERROR(
"A lane length for edge '" + edge->
getID() +
"' is not numeric (" + lengthS +
").");
670 WRITE_ERROR(
"A lane length for edge '" + edge->
getID() +
"' is not positive (" + lengthS +
").");
687 if (edge->
getID().substr(edge->
getID().length() - node->
getID().length() - 1) ==
"_" + node->
getID()) {
700 bool mustRecheck =
true;
701 double seenLength = 0;
702 while (mustRecheck) {
703 if (edge->
getID().substr(edge->
getID().length() - node->
getID().length() - 1) ==
"_" + node->
getID()) {
705 std::string sub = edge->
getID();
706 sub = sub.substr(sub.rfind(
'_', sub.rfind(
'_') - 1));
707 sub = sub.substr(1, sub.find(
'_', 1) - 1);
728 double useLength = length - seenLength;
729 useLength = edge->
getLength() - useLength;
730 std::string edgeID = edge->
getID();
732 if (edgeID.substr(edgeID.length() - node->
getID().length() - 1) ==
"_" + node->
getID()) {
733 edgeID = edgeID.substr(0, edgeID.find(
'_'));
739 std::string nid = edgeID +
"_" +
toString((
int) length) +
"_" + node->
getID();
744 while (nedge->
getID().substr(nedge->
getID().length() - node->
getID().length() - 1) ==
"_" + node->
getID()) {
785 WRITE_ERROR(
"Could not find TLS '" + LSAid +
"' for setting the signal group.");
806 if (from == 0 && to == 0) {
815 if (edg1 != 0 && edg2 != 0) {
818 if (edg1->
getID()[0] ==
'-') {
819 sid = edg1->
getID().substr(1);
821 sid =
"-" + edg1->
getID();
823 if (sid.find(
'_') != std::string::npos) {
824 sid = sid.substr(0, sid.find(
'_'));
830 if (edg2->
getID()[0] ==
'-') {
831 sid = edg2->
getID().substr(1);
833 sid =
"-" + edg2->
getID();
835 if (sid.find(
'_') != std::string::npos) {
836 sid = sid.substr(0, sid.find(
'_'));
850 WRITE_ERROR(
"Unknown edge in TEILFLAECHENELEMENT");
866 if (dir.length() > 0 && dir[0] ==
'1') {
874 const std::vector<long long int>& areas =
mySubPartsAreas.find(
id)->second;
875 for (std::vector<long long int>::const_iterator i = areas.begin(); i != areas.end(); ++i) {
883 if (dir.length() > 0 && dir[0] ==
'1') {
915 SG.
phases()[Phaseid] = PH;
928 if (fromEdge == 0 || toEdge == 0) {
932 int fromLaneOffset = 0;
942 int toLaneOffset = 0;
956 WRITE_ERROR(
"A from-lane number for edge '" + fromEdge->
getID() +
"' is not numeric (" + fromLaneS +
").");
961 WRITE_ERROR(
"A from-lane number for edge '" + fromEdge->
getID() +
"' is not positive (" + fromLaneS +
").");
970 WRITE_ERROR(
"A to-lane number for edge '" + toEdge->
getID() +
"' is not numeric (" + toLaneS +
").");
975 WRITE_ERROR(
"A to-lane number for edge '" + toEdge->
getID() +
"' is not positive (" + toLaneS +
").");
979 if (fromLane - fromLaneOffset < 0) {
982 fromLane = (int)fromEdge->
getNumLanes() - (fromLane - fromLaneOffset) - 1;
984 if (toLane - toLaneOffset < 0) {
987 toLane = (int)toEdge->
getNumLanes() - (toLane - toLaneOffset) - 1;
991 WRITE_ERROR(
"A from-lane number for edge '" + fromEdge->
getID() +
"' is larger than the edge's lane number (" + fromLaneS +
").");
995 WRITE_ERROR(
"A to-lane number for edge '" + toEdge->
getID() +
"' is larger than the edge's lane number (" + toLaneS +
").");
1043 WRITE_ERROR(
"The node '" + nodeS +
"' is not known.");
1064 WRITE_ERROR(
"The edge '" + edgeS +
"' is not known.");
1084 if (edge->
getID()[0] ==
'-') {
1085 sid = edge->
getID().substr(1);
1087 sid =
"-" + edge->
getID();
1089 if (sid.find(
'_') != std::string::npos) {
1090 sid = sid.substr(0, sid.find(
'_'));
1102 std::string edgeID = ret->
getID();
1110 if (nedges.size() != 1) {
1115 NBEdge* next = nedges[0];
1116 if (ret->
getID().substr(0, edgeID.length()) != next->
getID().substr(0, edgeID.length())) {
1136 if (nedges.size() != 1) {
1141 NBEdge* next = nedges[0];
1142 if (ret->
getID().substr(0, edgeID.length()) != next->
getID().substr(0, edgeID.length())) {
1162 WRITE_ERROR(
"The edge '" + edgeS +
"' is not known.");
1181 EdgeVector::const_iterator i;
1183 if (ToNode == (*i)->getToNode()) {
1196 value = value.substr(0, value.length() - 4);
1207 return defaultValue;
1224 double defaultValue) {
1241 const std::string& fieldName2) {
1264 nid =
id +
"-" + dest->
getID();
1270 WRITE_ERROR(
"Could not build connector node '" + nid +
"'.");
1280 WRITE_ERROR(
" The from-node was not found within the net");
1283 WRITE_ERROR(
" The to-node was not found within the net");
1288 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
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, double speed=UNSPECIFIED_SPEED, const PositionVector &customShape=PositionVector::EMPTY)
Adds a connection between the specified this edge's lane and an approached one.
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.
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.