97 if (pos2 < 0 || pos1 < 0) {
101 assert(pos1 >= 0 && pos2 >= 0);
109 const std::string& type,
110 std::vector<double> laneWidths,
111 double zuschlag1,
double zuschlag2,
140 const std::string& type,
int noLanes,
141 double zuschlag1,
double zuschlag2,
double length,
145 zuschlag1, zuschlag2, length, geom, clv);
157 DictType::iterator i =
myDict.find(
id);
169 DictType::iterator i =
myDict.find(
id);
179 const double MAX_CLUSTER_DISTANCE = 10;
182 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); i++) {
183 int edgeid = (*i).first;
188 if (connectors.size() == 0) {
194 std::vector<int> currentCluster;
195 std::vector<int>::iterator j = connectors.begin();
197 double position = outgoing
206 if (j == connectors.end()) {
209 currentCluster.push_back(*j);
213 double n_position = n_outgoing
216 if (n_outgoing == outgoing && fabs(n_position - position) < MAX_CLUSTER_DISTANCE) {
218 currentCluster.push_back(*(j + 1));
223 currentCluster.clear();
224 currentCluster.push_back(*(j + 1));
226 outgoing = n_outgoing;
227 position = n_position;
230 }
while (j != connectors.end());
232 if (currentCluster.size() > 0) {
243 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); i++) {
252 DictType::iterator i;
261 for (
int j = 0; j < 3; j++) {
300 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
318 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
331 if (forLanes.size() == 0) {
333 forLanes.push_back((
int) i);
338 for (std::vector<int>::const_iterator i = forLanes.begin(); i < forLanes.end(); i++) {
360 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
389 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
402 std::vector<NIVissimConnection*>
404 std::vector<NIVissimConnection*> ret;
408 if (find(lanes.begin(), lanes.end(), lane) != lanes.end()) {
421 double sameNodesOffset) {
423 std::pair<NIVissimConnectionCluster*, NBNode*> fromInf, toInf;
424 NBNode* fromNode, *toNode;
425 fromNode = toNode =
nullptr;
429 if (tmpClusters.size() != 0) {
435 fromNode = fromInf.second;
439 toNode = toInf.second;
440 if (fromInf.first != 0 && toNode !=
nullptr && fromInf.first->around(toNode->
getPosition())) {
447 if (fromNode == toNode) {
448 std::pair<NBNode*, NBNode*> tmp =
resolveSameNode(nc, sameNodesOffset, fromNode, toNode);
449 if (fromNode != tmp.first) {
452 if (toNode != tmp.second) {
455 fromNode = tmp.first;
461 if (fromNode ==
nullptr) {
465 if (!nc.
insert(fromNode)) {
466 throw ProcessError(
"Could not insert node '" + fromNode->
getID() +
"' to nodes container.");
469 if (toNode ==
nullptr) {
474 throw ProcessError(
"Could not insert node '" + toNode->
getID() +
"' to nodes container.");
491 if (fromNode == toNode) {
497 avgSpeed / (
double) 3.6, myNoLanes, -1,
510 if (tmpClusters.size() > 0) {
512 for (ConnectionClusters::iterator j = tmpClusters.begin(); cont && j != tmpClusters.end(); ++j) {
514 std::string nextID = buildEdge->
getID() +
"[1]";
515 cont = ec.
splitAt(dc, buildEdge, (*j)->getNBNode());
525 std::string
id = toString<int>(distNo);
527 if (dist ==
nullptr) {
528 WRITE_WARNING(
"The referenced speed distribution '" +
id +
"' is not known.");
532 double speed = dist->getMax();
533 if (speed < 0 || speed > 1000) {
534 WRITE_WARNING(
"What about distribution '" + toString<int>(distNo) +
"' ");
577 std::pair<NIVissimConnectionCluster*, NBNode*>
580 const double MAX_DISTANCE = 3.5;
581 assert(clusters.size() >= 1);
585 if (c->
around(beg, MAX_DISTANCE)) {
586 clusters.erase(clusters.begin());
587 return std::pair<NIVissimConnectionCluster*, NBNode*>
613 std::pair<NIVissimConnectionCluster*, NBNode*>
616 if (clusters.size() > 0) {
617 const double MAX_DISTANCE = 10.;
618 assert(clusters.size() >= 1);
621 if (c->around(end, MAX_DISTANCE)) {
622 clusters.erase(clusters.end() - 1);
623 return std::pair<NIVissimConnectionCluster*, NBNode*>(c, c->getNBNode());
660 std::pair<NBNode*, NBNode*>
664 std::string nid =
"ParkingPlace" + toString<int>(d->
getID());
674 return std::pair<NBNode*, NBNode*>(newNode, toNode);
681 return std::pair<NBNode*, NBNode*>(fromNode, newNode);
687 std::pair<NBNode*, NBNode*>
699 std::string nid =
"ParkingPlace" + toString<int>(d->
getID());
701 if (node ==
nullptr) {
708 return std::pair<NBNode*, NBNode*>(node, prevTo);
712 std::string nid =
"ParkingPlace" + toString<int>(d->
getID());
714 if (node ==
nullptr) {
721 return std::pair<NBNode*, NBNode*>(prevFrom, node);
734 toString<int>(
myID) +
"-End",
740 return std::pair<NBNode*, NBNode*>(node, end);
746 toString<int>(
myID) +
"-Begin",
750 std::cout <<
"nope, NIVissimDisturbance" << std::endl;
753 return std::pair<NBNode*, NBNode*>(beg, node);
758 return std::pair<NBNode*, NBNode*>(node, node);
763 return std::pair<NBNode*, NBNode*>(prevFrom, prevTo);
795 ConnectionClusters::iterator i =
810 ConnectionClusters::iterator i =
819 ConnectionClusters::iterator i =
870 for (DictType::iterator i1 =
myDict.begin(); i1 !=
myDict.end(); i1++) {
875 DictType::iterator i2 = i1;
877 for (; i2 !=
myDict.end(); i2++) {
907 if (g1.back().distanceTo(g2.back()) > 10) {
951 std::vector<int>::iterator i;
968 const std::vector<NIVissimEdge*>&
979 std::ostringstream str;
980 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.
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.
NIVissimEdge(int id, const std::string &name, const std::string &type, std::vector< double > laneWidths, double zuschlag1, double zuschlag2, double length, const PositionVector &geom, const NIVissimClosedLanesVector &clv)
Constructor.
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)
const std::string & getID() const
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.
std::vector< double > myLaneWidths
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)
void setLaneWidth(int lane, double width)
set lane specific width (negative lane implies set for all lanes)
double getFromPosition() const