104 if (pos2 < 0 || pos1 < 0) {
108 assert(pos1 >= 0 && pos2 >= 0);
116 const std::string& type,
int noLanes,
117 double zuschlag1,
double zuschlag2,
124 assert(noLanes >= 0);
128 for (
int i = 0; i < noLanes; i++) {
144 const std::string& type,
int noLanes,
145 double zuschlag1,
double zuschlag2,
double length,
149 zuschlag2, length, geom, clv);
161 DictType::iterator i =
myDict.find(
id);
173 DictType::iterator i =
myDict.find(
id);
183 const double MAX_CLUSTER_DISTANCE = 10;
186 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); i++) {
187 int edgeid = (*i).first;
192 if (connectors.size() == 0) {
198 std::vector<int> currentCluster;
199 std::vector<int>::iterator j = connectors.begin();
201 double position = outgoing
210 if (j == connectors.end()) {
213 currentCluster.push_back(*j);
217 double n_position = n_outgoing
220 if (n_outgoing == outgoing && fabs(n_position - position) < MAX_CLUSTER_DISTANCE) {
222 currentCluster.push_back(*(j + 1));
227 currentCluster.clear();
228 currentCluster.push_back(*(j + 1));
230 outgoing = n_outgoing;
231 position = n_position;
234 }
while (j != connectors.end());
236 if (currentCluster.size() > 0) {
247 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); i++) {
256 DictType::iterator i;
265 for (
int j = 0; j < 3; j++) {
304 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
322 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
335 if (forLanes.size() == 0) {
337 forLanes.push_back((
int) i);
342 for (std::vector<int>::const_iterator i = forLanes.begin(); i < forLanes.end(); i++) {
364 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
393 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
406 std::vector<NIVissimConnection*>
408 std::vector<NIVissimConnection*> ret;
412 if (find(lanes.begin(), lanes.end(), lane) != lanes.end()) {
425 double sameNodesOffset) {
427 std::pair<NIVissimConnectionCluster*, NBNode*> fromInf, toInf;
428 NBNode* fromNode, *toNode;
429 fromNode = toNode = 0;
433 if (tmpClusters.size() != 0) {
439 fromNode = fromInf.second;
443 toNode = toInf.second;
444 if (fromInf.first != 0 && toNode != 0 && fromInf.first->around(toNode->
getPosition())) {
451 if (fromNode == toNode) {
452 std::pair<NBNode*, NBNode*> tmp =
resolveSameNode(nc, sameNodesOffset, fromNode, toNode);
453 if (fromNode != tmp.first) {
456 if (toNode != tmp.second) {
459 fromNode = tmp.first;
469 if (!nc.
insert(fromNode)) {
470 throw ProcessError(
"Could not insert node '" + fromNode->
getID() +
"' to nodes container.");
478 throw ProcessError(
"Could not insert node '" + toNode->
getID() +
"' to nodes container.");
495 if (fromNode == toNode) {
501 avgSpeed / (
double) 3.6, myNoLanes, -1,
513 if (tmpClusters.size() > 0) {
515 for (ConnectionClusters::iterator j = tmpClusters.begin(); cont && j != tmpClusters.end(); ++j) {
517 std::string nextID = buildEdge->
getID() +
"[1]";
518 cont = ec.
splitAt(dc, buildEdge, (*j)->getNBNode());
528 std::string
id = toString<int>(distNo);
531 WRITE_WARNING(
"The referenced speed distribution '" +
id +
"' is not known.");
535 double speed = dist->getMax();
536 if (speed < 0 || speed > 1000) {
537 WRITE_WARNING(
"What about distribution '" + toString<int>(distNo) +
"' ");
580 std::pair<NIVissimConnectionCluster*, NBNode*>
583 const double MAX_DISTANCE = 3.5;
584 assert(clusters.size() >= 1);
588 if (c->
around(beg, MAX_DISTANCE)) {
589 clusters.erase(clusters.begin());
590 return std::pair<NIVissimConnectionCluster*, NBNode*>
616 std::pair<NIVissimConnectionCluster*, NBNode*>
619 if (clusters.size() > 0) {
620 const double MAX_DISTANCE = 10.;
621 assert(clusters.size() >= 1);
624 if (c->around(end, MAX_DISTANCE)) {
625 clusters.erase(clusters.end() - 1);
626 return std::pair<NIVissimConnectionCluster*, NBNode*>(c, c->getNBNode());
663 std::pair<NBNode*, NBNode*>
667 std::string nid =
"ParkingPlace" + toString<int>(d->
getID());
677 return std::pair<NBNode*, NBNode*>(newNode, toNode);
684 return std::pair<NBNode*, NBNode*>(fromNode, newNode);
690 std::pair<NBNode*, NBNode*>
702 std::string nid =
"ParkingPlace" + toString<int>(d->
getID());
711 return std::pair<NBNode*, NBNode*>(node, prevTo);
715 std::string nid =
"ParkingPlace" + toString<int>(d->
getID());
724 return std::pair<NBNode*, NBNode*>(prevFrom, node);
737 toString<int>(
myID) +
"-End",
743 return std::pair<NBNode*, NBNode*>(node, end);
749 toString<int>(
myID) +
"-Begin",
753 std::cout <<
"nope, NIVissimDisturbance" << std::endl;
756 return std::pair<NBNode*, NBNode*>(beg, node);
761 return std::pair<NBNode*, NBNode*>(node, node);
766 return std::pair<NBNode*, NBNode*>(prevFrom, prevTo);
798 ConnectionClusters::iterator i =
813 ConnectionClusters::iterator i =
822 ConnectionClusters::iterator i =
873 for (DictType::iterator i1 =
myDict.begin(); i1 !=
myDict.end(); i1++) {
878 DictType::iterator i2 = i1;
880 for (; i2 !=
myDict.end(); i2++) {
910 if (g1.back().distanceTo(g2.back()) > 10) {
954 std::vector<int>::iterator i;
971 const std::vector<NIVissimEdge*>&
982 std::ostringstream str;
983 str <<
"The following lanes have no explicit speed information:\n ";
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
std::vector< NIVissimConnection * > getOutgoingConnected(int lane) const
static int myMaxID
The current maximum id; needed for further id assignment.
NIVissimEdge(int id, const std::string &name, const std::string &type, int noLanes, double zuschlag1, double zuschlag2, double length, const PositionVector &geom, const NIVissimClosedLanesVector &clv)
Constructor.
std::vector< double > myDistrictConnections
~NIVissimEdge()
Destructor.
std::string myName
The name of the edge.
const std::vector< int > & getFromLanes() const
NBNode * getNBNode() const
static void dict_checkEdges2Join()
std::map< int, NIVissimEdge * > DictType
Definition of the dictionary type.
void setSpeed(int lane, double speed)
set lane specific speed (negative lane implies set for all lanes)
std::vector< int > myPatchedSpeeds
std::pair< NBNode *, NBNode * > remapOneOfNodes(NBNodeCont &nc, NIVissimDistrictConnection *d, NBNode *fromNode, NBNode *toNode)
static void reportUnsetSpeeds()
Writes edges with unset speeds to the warnings message log instance.
std::vector< NIVissimClosedLaneDef * > NIVissimClosedLanesVector
The representation of a single edge during network building.
ConnectionClusters myConnectionClusters
List of connection clusters along this edge.
std::vector< double > myLaneSpeeds
A container for districts.
static const double UNSPECIFIED_OFFSET
unspecified lane offset
const PositionVector & getGeometry() const
Position geomPosition() const
Returns the position The position yields from the edge geometry and the place the connection is plaed...
static void dict_buildNBEdges(NBDistrictCont &dc, NBNodeCont &nc, NBEdgeCont &ec, double offset)
Builds NBEdges from the VissimEdges within the dictionary.
void addToConnectionCluster(NIVissimConnectionCluster *c)
void setNodeCluster(int nodeid)
bool splitAt(NBDistrictCont &dc, NBEdge *edge, NBNode *node)
Splits the edge at the position nearest to the given node.
static bool dictionary(const std::string &type, const std::string &id, Distribution *d)
Adds a distribution of the given type and name to the container.
const std::vector< int > & getToLanes() const
static bool dictionary(int id, NIVissimConnection *o)
const std::string & getID() const
Returns the id.
int getID() const
Returns the id of the connection.
NIVissimEdge * getBestIncoming() const
static NIVissimDistrictConnection * dict_findForEdge(int edgeid)
Returns the connection to a district placed at the given node Yep, there onyl should be one...
static const double UNSPECIFIED_WIDTH
unspecified lane width
#define WRITE_WARNING(msg)
double getPositionForEdge(int edgeid) const
static OptionsCont & getOptions()
Retrieves the options.
A temporary storage for edges imported from Vissim.
Position getBegin2D() const
void propagateSpeed(double speed, std::vector< int > forLanes)
NIVissimEdge * getBestOutgoing() const
int getFromEdgeID() const
int myNoLanes
The number of lanes the edge has.
double myZuschlag1
Additional load values for this edge.
double getPosition() const
Returns the position of the connection at the edge.
double getRealSpeed(int distNo)
int operator()(NIVissimConnectionCluster *cc1, NIVissimConnectionCluster *cc2) const
comparing operation
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
void setSpeed(int lane, int speedDist)
void addIncomingConnection(int id)
Adds a connection where this edge is the destination.
bool myAmWithinJunction
Information whether this edge was not build due to being within a junction.
static void dict_propagateSpeeds()
int operator()(int c1id, int c2id) const
comparing operation
double beginEndAngle() const
returns the angle in radians of the line connecting the first and the last position ...
A point in 2D or 3D with translation and scaling methods.
std::vector< int > myIncomingConnections
List of connections incoming to this edge.
double getLength() const
Returns the length of the node.
void checkDistrictConnectionExistanceAt(double pos)
static void removeDouble(std::vector< T > &v)
std::string myType
The type of the edge.
bool around(const Position &p, double offset=0) const
int myEdgeID
The id of the edge.
Storage for edges, including some functionality operating on multiple edges.
connection_cluster_position_sorter(int edgeid)
constructor
connection_position_sorter(int edgeid)
constructor
void checkUnconnectedLaneSpeeds()
void addOutgoingConnection(int id)
Adds a connection where this edge is the source.
void buildNBEdge(NBDistrictCont &dc, NBNodeCont &nc, NBEdgeCont &ec, double sameNodesOffset)
Builds the NBEdge from this VissimEdge.
static bool dictionary(int id, const std::string &name, const std::string &type, int noLanes, double zuschlag1, double zuschlag2, double length, const PositionVector &geom, const NIVissimClosedLanesVector &clv)
Adds the described item to the dictionary Builds the edge first.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
NIVissimConnection * getConnectionTo(NIVissimEdge *e)
std::pair< NIVissimConnectionCluster *, NBNode * > getToNode(NBNodeCont &nc, ConnectionClusters &clusters)
Returns the destination node.
double getToPosition() const
static void buildConnectionClusters()
Clusters connections of each edge.
std::vector< NIVissimEdge * > myToTreatAsSame
double length() const
Returns the length.
bool addToTreatAsSame(NIVissimEdge *e)
Position getEnd2D() const
Returns the end position of the edge.
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
std::pair< NBNode *, NBNode * > resolveSameNode(NBNodeCont &nc, double offset, NBNode *prevFrom, NBNode *prevTo)
Tries to resolve the problem that the same node has been returned as origin and destination node...
static std::vector< std::string > myLanesWithMissingSpeeds
NIVissimClosedLanesVector myClosedLanes
List of lanes closed on this edge.
std::vector< NIVissimConnectionCluster * > ConnectionClusters
The definition for a container for connection clusters.
const Position & getPosition() const
Represents a single node (junction) during network building.
double getMeanSpeed() const
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
static DictType myDict
The dictionary.
const std::vector< NIVissimEdge * > & getToTreatAsSame() const
Container for nodes during the netbuilding process.
void mergedInto(NIVissimConnectionCluster *old, NIVissimConnectionCluster *act)
static double angleDiff(const double angle1, const double angle2)
Returns the difference of the second angle to the first angle in radiants.
int myEdgeID
The id of the edge.
bool erase(NBNode *node)
Removes the given node, deleting it.
std::vector< int > myOutgoingConnections
List of connections outgoing from this edge.
std::pair< NIVissimConnectionCluster *, NBNode * > getFromNode(NBNodeCont &nc, ConnectionClusters &clusters)
Returns the origin node.
void removeFromConnectionCluster(NIVissimConnectionCluster *c)
double getFromPosition() const