本文整理汇总了C++中NBNode::getID方法的典型用法代码示例。如果您正苦于以下问题:C++ NBNode::getID方法的具体用法?C++ NBNode::getID怎么用?C++ NBNode::getID使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类NBNode
的用法示例。
在下文中一共展示了NBNode::getID方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: st
bool
NIImporter_DlrNavteq::TrafficlightsHandler::report(const std::string& result) {
// #ID POICOL-TYPE DESCRIPTION LONGITUDE LATITUDE NAVTEQ_LINK_ID NODEID
if (result[0] == '#') {
return true;
}
StringTokenizer st(result, StringTokenizer::WHITECHARS);
const std::string edgeID = st.get(5);
NBEdge* edge = myEdgeCont.retrieve(edgeID);
if (edge == nullptr) {
WRITE_WARNING("The traffic light edge '" + edgeID + "' could not be found");
} else {
NBNode* node = edge->getToNode();
if (node->getType() != NODETYPE_TRAFFIC_LIGHT) {
node->reinit(node->getPosition(), NODETYPE_TRAFFIC_LIGHT);
// @note. There may be additional information somewhere in the GDF files about traffic light type ...
TrafficLightType type = SUMOXMLDefinitions::TrafficLightTypes.get(OptionsCont::getOptions().getString("tls.default-type"));
// @note actually we could use the navteq node ID here
NBTrafficLightDefinition* tlDef = new NBOwnTLDef(node->getID(), node, 0, type);
if (!myTLLogicCont.insert(tlDef)) {
// actually, nothing should fail here
delete tlDef;
throw ProcessError("Could not allocate tls for '" + node->getID() + "'.");
}
}
}
return true;
}
示例2: getNamedNode
void
NIImporter_VISUM::parse_Turns() {
if (myLineParser.know("VSYSSET") && myLineParser.get("VSYSSET") == "") {
// no vehicle allowed; don't add
return;
}
// retrieve the nodes
NBNode* from = getNamedNode("VonKnot", "VonKnotNr");
NBNode* via = getNamedNode("UeberKnot", "UeberKnotNr");
NBNode* to = getNamedNode("NachKnot", "NachKnotNr");
if (from == 0 || via == 0 || to == 0) {
return;
}
// all nodes are known
std::string type = myLineParser.know("VSysCode")
? myLineParser.get("VSysCode")
: myLineParser.get("VSYSSET");
if (myVSysTypes.find(type) != myVSysTypes.end() && myVSysTypes.find(type)->second == "IV") {
// try to set the turning definition
NBEdge* src = from->getConnectionTo(via);
NBEdge* dest = via->getConnectionTo(to);
// check both
if (src == 0) {
// maybe it was removed due to something
if (OptionsCont::getOptions().isSet("keep-edges.min-speed")
||
OptionsCont::getOptions().isSet("keep-edges.explicit")) {
WRITE_WARNING("Could not set connection from node '" + from->getID() + "' to node '" + via->getID() + "'.");
} else {
if (OptionsCont::getOptions().getBool("visum.verbose-warnings")) {
WRITE_WARNING("There is no edge from node '" + from->getID() + "' to node '" + via->getID() + "'.");
}
}
return;
}
if (dest == 0) {
if (OptionsCont::getOptions().isSet("keep-edges.min-speed")
||
OptionsCont::getOptions().isSet("keep-edges.explicit")) {
WRITE_WARNING("Could not set connection from node '" + via->getID() + "' to node '" + to->getID() + "'.");
} else {
if (OptionsCont::getOptions().getBool("visum.verbose-warnings")) {
WRITE_WARNING("There is no edge from node '" + via->getID() + "' to node '" + to->getID() + "'.");
}
}
return;
}
// both edges found
// set them into the edge
src->addEdge2EdgeConnection(dest);
}
}
示例3: pos
void
NIImporter_VISUM::parse_EdgePolys() {
// get the from- & to-node and validate them
NBNode* from = getNamedNode("VonKnot", "VonKnotNr");
NBNode* to = getNamedNode("NachKnot", "NachKnotNr");
if (!checkNodes(from, to)) {
return;
}
bool failed = false;
int index;
SUMOReal x, y;
try {
index = TplConvert::_2int(myLineParser.get("INDEX").c_str());
x = getNamedFloat("XKoord");
y = getNamedFloat("YKoord");
} catch (NumberFormatException&) {
WRITE_ERROR("Error in geometry description from node '" + from->getID() + "' to node '" + to->getID() + "'.");
return;
}
Position pos(x, y);
if (!NILoader::transformCoordinates(pos)) {
WRITE_ERROR("Unable to project coordinates for node '" + from->getID() + "'.");
return;
}
NBEdge* e = from->getConnectionTo(to);
if (e != 0) {
e->addGeometryPoint(index, pos);
} else {
failed = true;
}
e = to->getConnectionTo(from);
if (e != 0) {
e->addGeometryPoint(-index, pos);
failed = false;
}
// check whether the operation has failed
if (failed) {
// we should report this to the warning instance only if we have removed
// some nodes or edges...
if (OptionsCont::getOptions().isSet("keep-edges.min-speed") || OptionsCont::getOptions().isSet("keep-edges.explicit")) {
WRITE_WARNING("Could not set geometry between node '" + from->getID() + "' and node '" + to->getID() + "'.");
} else {
// ... in the other case we report this to the error instance
if (OptionsCont::getOptions().getBool("visum.verbose-warnings")) {
WRITE_WARNING("There is no edge from node '" + from->getID() + "' to node '" + to->getID() + "'.");
}
}
}
}
示例4: writeHeader
void
NWWriter_DlrNavteq::writeTrafficSignals(const OptionsCont& oc, NBNodeCont& nc) {
OutputDevice& device = OutputDevice::getDevice(oc.getString("dlr-navteq-output") + "_traffic_signals.txt");
writeHeader(device, oc);
const GeoConvHelper& gch = GeoConvHelper::getFinal();
const bool haveGeo = gch.usingGeoProjection();
const SUMOReal geoScale = pow(10.0f, haveGeo ? 5 : 2); // see NIImporter_DlrNavteq::GEO_SCALE
device.setPrecision(0);
// write format specifier
device << "#Traffic signal related to LINK_ID and NODE_ID with location relative to driving direction.\n#column format like pointcollection.\n#DESCRIPTION->LOCATION: 1-rechts von LINK; 2-links von LINK; 3-oberhalb LINK -1-keineAngabe\n#RELATREC_ID\tPOICOL_TYPE\tDESCRIPTION\tLONGITUDE\tLATITUDE\tLINK_ID\n";
// write record for every edge incoming to a tls controlled node
for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) {
NBNode* n = (*i).second;
if (n->isTLControlled()) {
Position pos = n->getPosition();
gch.cartesian2geo(pos);
pos.mul(geoScale);
const EdgeVector& incoming = n->getIncomingEdges();
for (EdgeVector::const_iterator it = incoming.begin(); it != incoming.end(); ++it) {
NBEdge* e = *it;
device << e->getID() << "\t"
<< "12\t" // POICOL_TYPE
<< "LSA;NODEIDS#" << n->getID() << "#;LOCATION#-1#;\t"
<< pos.x() << "\t"
<< pos.y() << "\t"
<< e->getID() << "\n";
}
}
}
}
示例5: retrieve
void
NBEdgeCont::recheckPostProcessConnections() {
for (std::vector<PostProcessConnection>::const_iterator i = myConnections.begin(); i != myConnections.end(); ++i) {
NBEdge* from = retrieve((*i).from);
NBEdge* to = retrieve((*i).to);
if (from != 0 && to != 0) {
if (!from->addLane2LaneConnection((*i).fromLane, to, (*i).toLane, NBEdge::L2L_USER, false, (*i).mayDefinitelyPass)) {
WRITE_WARNING("Could not insert connection between '" + (*i).from + "' and '" + (*i).to + "' after build.");
}
}
}
// during loading we also kept some ambiguous connections in hope they might be valid after processing
// we need to make sure that all invalid connections are removed now
for (EdgeCont::iterator it = myEdges.begin(); it != myEdges.end(); ++it) {
NBEdge* edge = it->second;
NBNode* to = edge->getToNode();
// make a copy because we may delete connections
std::vector<NBEdge::Connection> connections = edge->getConnections();
for (std::vector<NBEdge::Connection>::iterator it_con = connections.begin(); it_con != connections.end(); ++it_con) {
NBEdge::Connection& c = *it_con;
if (c.toEdge != 0 && c.toEdge->getFromNode() != to) {
WRITE_WARNING("Found and removed invalid connection from " + edge->getID() +
" to " + c.toEdge->getID() + " via " + to->getID());
edge->removeFromConnections(c.toEdge);
}
}
}
}
示例6: NBLoadedTLDef
void
NIVisumTL::build(NBEdgeCont& ec, NBTrafficLightLogicCont& tlc) {
for (std::vector<NBNode*>::iterator ni = myNodes.begin(); ni != myNodes.end(); ni++) {
NBNode* node = (*ni);
TrafficLightType type = SUMOXMLDefinitions::TrafficLightTypes.get(OptionsCont::getOptions().getString("tls.default-type"));
NBLoadedTLDef* def = new NBLoadedTLDef(ec, node->getID(), node, myOffset, type);
tlc.insert(def);
def->setCycleDuration((unsigned int) myCycleTime);
// signalgroups
for (std::map<std::string, SignalGroup*>::iterator gi = mySignalGroups.begin(); gi != mySignalGroups.end(); gi++) {
std::string groupName = (*gi).first;
NIVisumTL::SignalGroup& SG = *(*gi).second;
def->addSignalGroup(groupName);
def->addToSignalGroup(groupName, SG.connections());
// phases
SUMOTime yellowTime = -1;
if (myPhaseDefined) {
for (std::map<std::string, Phase*>::iterator pi = SG.phases().begin(); pi != SG.phases().end(); pi++) {
NIVisumTL::Phase& PH = *(*pi).second;
def->addSignalGroupPhaseBegin(groupName, PH.getStartTime(), NBTrafficLightDefinition::TLCOLOR_GREEN);
def->addSignalGroupPhaseBegin(groupName, PH.getEndTime(), NBTrafficLightDefinition::TLCOLOR_RED);
yellowTime = MAX2(PH.getYellowTime(), yellowTime);
};
} else {
def->addSignalGroupPhaseBegin(groupName, SG.getStartTime(), NBTrafficLightDefinition::TLCOLOR_GREEN);
def->addSignalGroupPhaseBegin(groupName, SG.getEndTime(), NBTrafficLightDefinition::TLCOLOR_RED);
yellowTime = MAX2(SG.getYellowTime(), yellowTime);
}
// yellowTime can be -1 if not given in the input; it will be "patched" later
def->setSignalYellowTimes(groupName, myIntermediateTime, yellowTime);
}
}
}
示例7: writeHeader
void
NWWriter_DlrNavteq::writeConnectedLanes(const OptionsCont& oc, NBNodeCont& nc) {
OutputDevice& device = OutputDevice::getDevice(oc.getString("dlr-navteq-output") + "_connected_lanes.txt");
writeHeader(device, oc);
// write format specifier
device << "#Lane connections related to LINK-IDs and NODE-ID.\n";
device << "#column format like pointcollection.\n";
device << "#NODE-ID\tVEHICLE-TYPE\tFROM_LANE\tTO_LANE\tTHROUGH_TRAFFIC\tLINK_IDs[2..*]\n";
// write record for every connection
for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) {
NBNode* n = (*i).second;
const EdgeVector& incoming = n->getIncomingEdges();
for (EdgeVector::const_iterator j = incoming.begin(); j != incoming.end(); ++j) {
NBEdge* from = *j;
const SVCPermissions fromPerm = from->getPermissions();
const std::vector<NBEdge::Connection>& connections = from->getConnections();
for (std::vector<NBEdge::Connection>::const_iterator it_c = connections.begin(); it_c != connections.end(); it_c++) {
const NBEdge::Connection& c = *it_c;
device
<< n->getID() << "\t"
<< getAllowedTypes(fromPerm & c.toEdge->getPermissions()) << "\t"
<< c.fromLane + 1 << "\t" // one-based
<< c.toLane + 1 << "\t" // one-based
<< 1 << "\t" // no information regarding permissibility of through traffic
<< from->getID() << "\t"
<< c.toEdge->getID() << "\t"
<< "\n";
}
}
}
device.close();
}
示例8: toString
void
NWWriter_XML::writeNodes(const OptionsCont& oc, NBNodeCont& nc) {
const GeoConvHelper& gch = GeoConvHelper::getFinal();
bool useGeo = oc.exists("proj.plain-geo") && oc.getBool("proj.plain-geo");
if (useGeo && !gch.usingGeoProjection()) {
WRITE_WARNING("Ignoring option \"proj.plain-geo\" because no geo-conversion has been defined");
useGeo = false;
}
const bool geoAccuracy = useGeo || gch.usingInverseGeoProjection();
OutputDevice& device = OutputDevice::getDevice(oc.getString("plain-output-prefix") + ".nod.xml");
device.writeXMLHeader("nodes", NWFrame::MAJOR_VERSION + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo-sim.org/xsd/nodes_file.xsd\"");
// write network offsets and projection to allow reconstruction of original coordinates
if (!useGeo) {
NWWriter_SUMO::writeLocation(device);
}
// write nodes
for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) {
NBNode* n = (*i).second;
device.openTag(SUMO_TAG_NODE);
device.writeAttr(SUMO_ATTR_ID, n->getID());
// write position
Position pos = n->getPosition();
if (useGeo) {
gch.cartesian2geo(pos);
}
if (geoAccuracy) {
device.setPrecision(GEO_OUTPUT_ACCURACY);
}
NWFrame::writePositionLong(pos, device);
if (geoAccuracy) {
device.setPrecision();
}
device.writeAttr(SUMO_ATTR_TYPE, toString(n->getType()));
if (n->isTLControlled()) {
const std::set<NBTrafficLightDefinition*>& tlss = n->getControllingTLS();
// set may contain multiple programs for the same id.
// make sure ids are unique and sorted
std::set<std::string> tlsIDs;
for (std::set<NBTrafficLightDefinition*>::const_iterator it_tl = tlss.begin(); it_tl != tlss.end(); it_tl++) {
tlsIDs.insert((*it_tl)->getID());
}
std::vector<std::string> sortedIDs(tlsIDs.begin(), tlsIDs.end());
sort(sortedIDs.begin(), sortedIDs.end());
device.writeAttr(SUMO_ATTR_TLID, sortedIDs);
}
device.closeTag();
}
device.close();
}
示例9:
void
NWWriter_SUMO::writeJunction(OutputDevice& into, const NBNode& n) {
// write the attributes
into.openTag(SUMO_TAG_JUNCTION).writeAttr(SUMO_ATTR_ID, n.getID());
into.writeAttr(SUMO_ATTR_TYPE, n.getType());
NWFrame::writePositionLong(n.getPosition(), into);
// write the incoming lanes
std::string incLanes;
const std::vector<NBEdge*>& incoming = n.getIncomingEdges();
for (std::vector<NBEdge*>::const_iterator i = incoming.begin(); i != incoming.end(); ++i) {
unsigned int noLanes = (*i)->getNumLanes();
for (unsigned int j = 0; j < noLanes; j++) {
incLanes += (*i)->getLaneID(j);
if (i != incoming.end() - 1 || j < noLanes - 1) {
incLanes += ' ';
}
}
}
into.writeAttr(SUMO_ATTR_INCLANES, incLanes);
// write the internal lanes
std::string intLanes;
if (!OptionsCont::getOptions().getBool("no-internal-links")) {
unsigned int l = 0;
for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); i++) {
const std::vector<NBEdge::Connection>& elv = (*i)->getConnections();
for (std::vector<NBEdge::Connection>::const_iterator k = elv.begin(); k != elv.end(); ++k) {
if ((*k).toEdge == 0) {
continue;
}
if (l != 0) {
intLanes += ' ';
}
if (!(*k).haveVia) {
intLanes += (*k).id + "_0";
} else {
intLanes += (*k).viaID + "_0";
}
l++;
}
}
}
into.writeAttr(SUMO_ATTR_INTLANES, intLanes);
// close writing
into.writeAttr(SUMO_ATTR_SHAPE, n.getShape());
if (n.getType() == NODETYPE_DEAD_END) {
into.closeTag();
} else {
// write right-of-way logics
n.writeLogic(into);
into.closeTag();
}
}
示例10:
void
GNETLSEditorFrame::updateDescription() const {
std::string description;
if (myCurrentJunction == 0) {
description = "No Junction Selected\n";
} else {
NBNode* nbn = myCurrentJunction->getNBNode();
description = "Current junction: " + nbn->getID() + "\n(";
if (!nbn->isTLControlled()) {
description += "uncontrolled, ";
}
description += (myHaveModifications ? "modified)" : "unmodified)");
}
myDescription->setText(description.c_str());
}
示例11: GUIGlObject
// ===========================================================================
// method definitions
// ===========================================================================
GNEJunction::GNEJunction(NBNode& nbn, GNENet* net, bool loaded) :
GUIGlObject(GLO_JUNCTION, nbn.getID()),
GNEAttributeCarrier(SUMO_TAG_JUNCTION),
myNBNode(nbn),
myOrigPos(nbn.getPosition()),
myAmCreateEdgeSource(false),
myNet(net),
myLogicStatus(loaded ? LOADED : GUESSED),
myAmResponsible(false),
myHasValidLogic(loaded),
myAmTLSSelected(false) {
const double EXTENT = 2;
myBoundary = Boundary(
myOrigPos.x() - EXTENT, myOrigPos.y() - EXTENT,
myOrigPos.x() + EXTENT, myOrigPos.y() + EXTENT);
myMaxSize = 2 * EXTENT;
rebuildCrossings(false);
}
示例12: if
void
NIXMLConnectionsHandler::addWalkingArea(const SUMOSAXAttributes& attrs) {
bool ok = true;
NBNode* node = 0;
EdgeVector edges;
const std::string nodeID = attrs.get<std::string>(SUMO_ATTR_NODE, 0, ok);
std::vector<std::string> edgeIDs;
if (!attrs.hasAttribute(SUMO_ATTR_EDGES)) {
WRITE_ERROR("No edges specified for walkingArea at node '" + nodeID + "'.");
return;
}
SUMOSAXAttributes::parseStringVector(attrs.get<std::string>(SUMO_ATTR_EDGES, 0, ok), edgeIDs);
if (!ok) {
return;
}
for (std::vector<std::string>::const_iterator it = edgeIDs.begin(); it != edgeIDs.end(); ++it) {
NBEdge* edge = myEdgeCont.retrieve(*it);
if (edge == 0) {
WRITE_ERROR("Edge '" + (*it) + "' for walkingArea at node '" + nodeID + "' is not known.");
return;
}
if (node == 0) {
if (edge->getToNode()->getID() == nodeID) {
node = edge->getToNode();
} else if (edge->getFromNode()->getID() == nodeID) {
node = edge->getFromNode();
} else {
WRITE_ERROR("Edge '" + (*it) + "' does not touch node '" + nodeID + "'.");
return;
}
} else {
if (edge->getToNode() != node && edge->getFromNode() != node) {
WRITE_ERROR("Edge '" + (*it) + "' does not touch node '" + nodeID + "'.");
return;
}
}
edges.push_back(edge);
}
PositionVector customShape = attrs.getOpt<PositionVector>(SUMO_ATTR_SHAPE, 0, ok, PositionVector::EMPTY);
if (!NBNetBuilder::transformCoordinates(customShape)) {
WRITE_ERROR("Unable to project shape for walkingArea at node '" + node->getID() + "'.");
}
node->addWalkingAreaShape(edges, customShape);
}
示例13: dummy
void
NBTrafficLightLogicCont::setTLControllingInformation(const NBEdgeCont& ec, const NBNodeCont& nc) {
Definitions definitions = getDefinitions();
// set the information about all participants, first
for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
(*it)->setParticipantsInformation();
}
// clear previous information because tlDefs may have been removed in NETEDIT
ec.clearControllingTLInformation();
// insert the information about the tl-controlling
for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
(*it)->setTLControllingInformation();
}
// handle rail signals which are not instantiated as normal definitions
for (std::map<std::string, NBNode*>::const_iterator it = nc.begin(); it != nc.end(); it ++) {
NBNode* n = it->second;
if (n->getType() == NODETYPE_RAIL_SIGNAL || n->getType() == NODETYPE_RAIL_CROSSING) {
NBOwnTLDef dummy(n->getID(), n, 0, TLTYPE_STATIC);
dummy.setParticipantsInformation();
dummy.setTLControllingInformation();
n->removeTrafficLight(&dummy);
}
}
}
示例14: assert
void
GNETLSEditorFrame::buildIinternalLanes(NBTrafficLightDefinition* tlDef) {
// clean up previous objects
SUMORTree& rtree = myViewNet->getNet()->getVisualisationSpeedUp();
for (TLIndexMap::iterator it = myInternalLanes.begin(); it != myInternalLanes.end(); it++) {
std::vector<GNEInternalLane*> lanes = it->second;
for (std::vector<GNEInternalLane*>::iterator it_lane = lanes.begin(); it_lane != lanes.end(); it_lane++) {
rtree.removeAdditionalGLObject(*it_lane);
delete *it_lane;
}
}
myInternalLanes.clear();
if (tlDef != 0) {
const int NUM_POINTS = 10;
assert(myCurrentJunction);
SUMORTree& rtree = myViewNet->getNet()->getVisualisationSpeedUp();
NBNode* nbn = myCurrentJunction->getNBNode();
std::string innerID = ":" + nbn->getID(); // see NWWriter_SUMO::writeInternalEdges
const NBConnectionVector& links = tlDef->getControlledLinks();
for (NBConnectionVector::const_iterator it = links.begin(); it != links.end(); it++) {
int tlIndex = it->getTLIndex();
PositionVector shape = nbn->computeInternalLaneShape(it->getFrom(), NBEdge::Connection(it->getFromLane(),
it->getTo(), it->getToLane()), NUM_POINTS);
GNEInternalLane* ilane = new GNEInternalLane(this, innerID + '_' + toString(tlIndex), shape, tlIndex);
rtree.addAdditionalGLObject(ilane);
myInternalLanes[tlIndex].push_back(ilane);
}
const std::vector<NBNode::Crossing>& crossings = nbn->getCrossings();
for (std::vector<NBNode::Crossing>::const_iterator it = crossings.begin(); it != crossings.end(); it++) {
const NBNode::Crossing& c = *it;
GNEInternalLane* ilane = new GNEInternalLane(this, c.id, c.shape, c.tlLinkNo);
rtree.addAdditionalGLObject(ilane);
myInternalLanes[c.tlLinkNo].push_back(ilane);
}
}
}
示例15: min
void
NWWriter_DlrNavteq::writeNodesUnsplitted(const OptionsCont& oc, NBNodeCont& nc, NBEdgeCont& ec, std::map<NBEdge*, std::string>& internalNodes) {
// For "real" nodes we simply use the node id.
// For internal nodes (geometry vectors describing edge geometry in the parlance of this format)
// we use the id of the edge and do not bother with
// compression (each direction gets its own internal node).
OutputDevice& device = OutputDevice::getDevice(oc.getString("dlr-navteq-output") + "_nodes_unsplitted.txt");
writeHeader(device, oc);
const GeoConvHelper& gch = GeoConvHelper::getFinal();
const bool haveGeo = gch.usingGeoProjection();
const double geoScale = pow(10.0f, haveGeo ? 5 : 2); // see NIImporter_DlrNavteq::GEO_SCALE
device.setPrecision(oc.getInt("dlr-navteq.precision"));
if (!haveGeo) {
WRITE_WARNING("DlrNavteq node data will be written in (floating point) cartesian coordinates");
}
// write format specifier
device << "# NODE_ID\tIS_BETWEEN_NODE\tamount_of_geocoordinates\tx1\ty1\t[x2 y2 ... xn yn]\n";
// write header
Boundary boundary = gch.getConvBoundary();
Position min(boundary.xmin(), boundary.ymin());
Position max(boundary.xmax(), boundary.ymax());
gch.cartesian2geo(min);
min.mul(geoScale);
gch.cartesian2geo(max);
max.mul(geoScale);
int multinodes = 0;
for (std::map<std::string, NBEdge*>::const_iterator i = ec.begin(); i != ec.end(); ++i) {
if ((*i).second->getGeometry().size() > 2) {
multinodes++;
}
}
device << "# [xmin_region] " << min.x() << "\n";
device << "# [xmax_region] " << max.x() << "\n";
device << "# [ymin_region] " << min.y() << "\n";
device << "# [ymax_region] " << max.y() << "\n";
device << "# [elements_multinode] " << multinodes << "\n";
device << "# [elements_normalnode] " << nc.size() << "\n";
device << "# [xmin] " << min.x() << "\n";
device << "# [xmax] " << max.x() << "\n";
device << "# [ymin] " << min.y() << "\n";
device << "# [ymax] " << max.y() << "\n";
// write normal nodes
for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) {
NBNode* n = (*i).second;
Position pos = n->getPosition();
gch.cartesian2geo(pos);
pos.mul(geoScale);
device << n->getID() << "\t0\t1\t" << pos.x() << "\t" << pos.y() << "\n";
}
// write "internal" nodes
std::vector<std::string> avoid;
std::set<std::string> reservedNodeIDs;
const bool numericalIDs = oc.getBool("numerical-ids");
if (oc.isSet("reserved-ids")) {
NBHelpers::loadPrefixedIDsFomFile(oc.getString("reserved-ids"), "node:", reservedNodeIDs); // backward compatibility
NBHelpers::loadPrefixedIDsFomFile(oc.getString("reserved-ids"), "junction:", reservedNodeIDs); // selection format
}
if (numericalIDs) {
avoid = nc.getAllNames();
std::vector<std::string> avoid2 = ec.getAllNames();
avoid.insert(avoid.end(), avoid2.begin(), avoid2.end());
avoid.insert(avoid.end(), reservedNodeIDs.begin(), reservedNodeIDs.end());
}
IDSupplier idSupplier("", avoid);
for (std::map<std::string, NBEdge*>::const_iterator i = ec.begin(); i != ec.end(); ++i) {
NBEdge* e = (*i).second;
PositionVector geom = e->getGeometry();
if (geom.size() > 2) {
// the import NIImporter_DlrNavteq checks for the presence of a
// negated edge id to determine spread type. We may need to do some
// shifting to make this consistent
const bool hasOppositeID = ec.getOppositeByID(e->getID()) != nullptr;
if (e->getLaneSpreadFunction() == LANESPREAD_RIGHT && !hasOppositeID) {
// need to write center-line geometry instead
try {
geom.move2side(e->getTotalWidth() / 2);
} catch (InvalidArgument& exception) {
WRITE_WARNING("Could not reconstruct shape for edge:'" + e->getID() + "' (" + exception.what() + ").");
}
} else if (e->getLaneSpreadFunction() == LANESPREAD_CENTER && hasOppositeID) {
// need to write left-border geometry instead
try {
geom.move2side(-e->getTotalWidth() / 2);
} catch (InvalidArgument& exception) {
WRITE_WARNING("Could not reconstruct shape for edge:'" + e->getID() + "' (" + exception.what() + ").");
}
}
std::string internalNodeID = e->getID();
if (internalNodeID == UNDEFINED
|| (nc.retrieve(internalNodeID) != nullptr)
|| reservedNodeIDs.count(internalNodeID) > 0
) {
// need to invent a new name to avoid clashing with the id of a 'real' node or a reserved name
if (numericalIDs) {
internalNodeID = idSupplier.getNext();
} else {
internalNodeID += "_geometry";
}
}
//.........这里部分代码省略.........