103 if (pos2 < 0 || pos1 < 0) {
107 assert(pos1 >= 0 && pos2 >= 0);
115 const std::string& type,
int noLanes,
116 double zuschlag1,
double zuschlag2,
123 assert(noLanes >= 0);
127 for (
int i = 0; i < noLanes; i++) {
143 const std::string& type,
int noLanes,
144 double zuschlag1,
double zuschlag2,
double length,
148 zuschlag2, length, geom, clv);
160 DictType::iterator i =
myDict.find(
id);
172 DictType::iterator i =
myDict.find(
id);
182 const double MAX_CLUSTER_DISTANCE = 10;
185 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); i++) {
186 int edgeid = (*i).first;
191 if (connectors.size() == 0) {
197 std::vector<int> currentCluster;
198 std::vector<int>::iterator j = connectors.begin();
200 double position = outgoing
209 if (j == connectors.end()) {
212 currentCluster.push_back(*j);
216 double n_position = n_outgoing
219 if (n_outgoing == outgoing && fabs(n_position - position) < MAX_CLUSTER_DISTANCE) {
221 currentCluster.push_back(*(j + 1));
226 currentCluster.clear();
227 currentCluster.push_back(*(j + 1));
229 outgoing = n_outgoing;
230 position = n_position;
233 }
while (j != connectors.end());
235 if (currentCluster.size() > 0) {
246 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); i++) {
255 DictType::iterator i;
264 for (
int j = 0; j < 3; j++) {
303 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
321 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
334 if (forLanes.size() == 0) {
336 forLanes.push_back((
int) i);
341 for (std::vector<int>::const_iterator i = forLanes.begin(); i < forLanes.end(); i++) {
363 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
392 for (std::vector<NIVissimConnection*>::iterator j = connected.begin(); j != connected.end(); j++) {
405 std::vector<NIVissimConnection*>
407 std::vector<NIVissimConnection*> ret;
411 if (find(lanes.begin(), lanes.end(), lane) != lanes.end()) {
424 double sameNodesOffset) {
426 std::pair<NIVissimConnectionCluster*, NBNode*> fromInf, toInf;
427 NBNode* fromNode, *toNode;
428 fromNode = toNode = 0;
432 if (tmpClusters.size() != 0) {
438 fromNode = fromInf.second;
442 toNode = toInf.second;
443 if (fromInf.first != 0 && toNode != 0 && fromInf.first->around(toNode->
getPosition())) {
450 if (fromNode == toNode) {
451 std::pair<NBNode*, NBNode*> tmp =
resolveSameNode(nc, sameNodesOffset, fromNode, toNode);
452 if (fromNode != tmp.first) {
455 if (toNode != tmp.second) {
458 fromNode = tmp.first;
468 if (!nc.
insert(fromNode)) {
469 throw ProcessError(
"Could not insert node '" + fromNode->
getID() +
"' to nodes container.");
477 throw ProcessError(
"Could not insert node '" + toNode->
getID() +
"' to nodes container.");
494 if (fromNode == toNode) {
500 avgSpeed / (
double) 3.6, myNoLanes, -1,
512 if (tmpClusters.size() > 0) {
514 for (ConnectionClusters::iterator j = tmpClusters.begin(); cont && j != tmpClusters.end(); ++j) {
516 std::string nextID = buildEdge->
getID() +
"[1]";
517 cont = ec.
splitAt(dc, buildEdge, (*j)->getNBNode());
527 std::string
id = toString<int>(distNo);
530 WRITE_WARNING(
"The referenced speed distribution '" +
id +
"' is not known.");
534 double speed = dist->getMax();
535 if (speed < 0 || speed > 1000) {
536 WRITE_WARNING(
"What about distribution '" + toString<int>(distNo) +
"' ");
579 std::pair<NIVissimConnectionCluster*, NBNode*>
582 const double MAX_DISTANCE = 3.5;
583 assert(clusters.size() >= 1);
587 if (c->
around(beg, MAX_DISTANCE)) {
588 clusters.erase(clusters.begin());
589 return std::pair<NIVissimConnectionCluster*, NBNode*>
615 std::pair<NIVissimConnectionCluster*, NBNode*>
618 if (clusters.size() > 0) {
619 const double MAX_DISTANCE = 10.;
620 assert(clusters.size() >= 1);
623 if (c->around(end, MAX_DISTANCE)) {
624 clusters.erase(clusters.end() - 1);
625 return std::pair<NIVissimConnectionCluster*, NBNode*>(c, c->getNBNode());
662 std::pair<NBNode*, NBNode*>
666 std::string nid =
"ParkingPlace" + toString<int>(d->
getID());
676 return std::pair<NBNode*, NBNode*>(newNode, toNode);
683 return std::pair<NBNode*, NBNode*>(fromNode, newNode);
689 std::pair<NBNode*, NBNode*>
701 std::string nid =
"ParkingPlace" + toString<int>(d->
getID());
710 return std::pair<NBNode*, NBNode*>(node, prevTo);
714 std::string nid =
"ParkingPlace" + toString<int>(d->
getID());
723 return std::pair<NBNode*, NBNode*>(prevFrom, node);
736 toString<int>(
myID) +
"-End",
742 return std::pair<NBNode*, NBNode*>(node, end);
748 toString<int>(
myID) +
"-Begin",
752 std::cout <<
"nope, NIVissimDisturbance" << std::endl;
755 return std::pair<NBNode*, NBNode*>(beg, node);
760 return std::pair<NBNode*, NBNode*>(node, node);
765 return std::pair<NBNode*, NBNode*>(prevFrom, prevTo);
797 ConnectionClusters::iterator i =
812 ConnectionClusters::iterator i =
821 ConnectionClusters::iterator i =
872 for (DictType::iterator i1 =
myDict.begin(); i1 !=
myDict.end(); i1++) {
877 DictType::iterator i2 = i1;
879 for (; i2 !=
myDict.end(); i2++) {
909 if (g1.back().distanceTo(g2.back()) > 10) {
953 std::vector<int>::iterator i;
970 const std::vector<NIVissimEdge*>&
981 std::ostringstream str;
982 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