// =========================================================================== // method definitions // =========================================================================== // --------------------------------------------------------------------------- // static methods // --------------------------------------------------------------------------- void NWWriter_Amitran::writeNetwork(const OptionsCont& oc, NBNetBuilder& nb) { // check whether an amitran-file shall be generated if (!oc.isSet("amitran-output")) { return; } OutputDevice& device = OutputDevice::getDevice(oc.getString("amitran-output")); device << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; device << "<network xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo-sim.org/xsd/amitran/network.xsd\">\n"; // write nodes int index = 0; NBNodeCont& nc = nb.getNodeCont(); std::set<NBNode*> singleRoundaboutNodes; std::set<NBNode*> multiRoundaboutNodes; const std::vector<EdgeVector>& roundabouts = nb.getRoundabouts(); for (std::vector<EdgeVector>::const_iterator i = roundabouts.begin(); i != roundabouts.end(); ++i) { for (EdgeVector::const_iterator j = (*i).begin(); j != (*i).end(); ++j) { if ((*j)->getNumLanes() > 1) { multiRoundaboutNodes.insert((*j)->getFromNode()); } else { singleRoundaboutNodes.insert((*j)->getFromNode()); } } } std::map<NBNode*, int> nodeIds; for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) { device << " <node id=\"" << index; nodeIds[i->second] = index++; if (singleRoundaboutNodes.count(i->second) > 0) { device << "\" type=\"roundaboutSingle\"/>\n"; continue; } if (multiRoundaboutNodes.count(i->second) > 0) { device << "\" type=\"roundaboutMulti\"/>\n"; continue; } switch (i->second->getType()) { case NODETYPE_TRAFFIC_LIGHT: case NODETYPE_TRAFFIC_LIGHT_NOJUNCTION: device << "\" type=\"trafficLight"; break; case NODETYPE_PRIORITY: device << "\" type=\"priority"; break; case NODETYPE_PRIORITY_STOP: device << "\" type=\"priorityStop"; break; case NODETYPE_RIGHT_BEFORE_LEFT: device << "\" type=\"rightBeforeLeft"; break; case NODETYPE_ALLWAY_STOP: device << "\" type=\"allwayStop"; break; case NODETYPE_DEAD_END: case NODETYPE_DEAD_END_DEPRECATED: device << "\" type=\"deadEnd"; break; case NODETYPE_DISTRICT: case NODETYPE_NOJUNCTION: case NODETYPE_INTERNAL: case NODETYPE_UNKNOWN: break; } device << "\"/>\n"; } // write edges index = 0; NBEdgeCont& ec = nb.getEdgeCont(); for (std::map<std::string, NBEdge*>::const_iterator i = ec.begin(); i != ec.end(); ++i) { device << " <link id=\"" << index++ << "\" from=\"" << nodeIds[i->second->getFromNode()] << "\" to=\"" << nodeIds[i->second->getToNode()] << "\" roadClass=\"" << NWWriter_DlrNavteq::getRoadClass((*i).second) << "\" length=\"" << int(1000 * i->second->getLoadedLength()) << "\" speedLimitKmh=\"" << int(3.6 * (*i).second->getSpeed() + 0.5) << "\" laneNr=\"" << (*i).second->getNumLanes() << "\"/>\n"; } device << "</network>\n"; device.close(); }
// =========================================================================== // method definitions // =========================================================================== // --------------------------------------------------------------------------- // static methods // --------------------------------------------------------------------------- void NWWriter_SUMO::writeNetwork(const OptionsCont& oc, NBNetBuilder& nb) { // check whether a sumo net-file shall be generated if (!oc.isSet("output-file")) { return; } OutputDevice& device = OutputDevice::getDevice(oc.getString("output-file")); device.writeXMLHeader("net", NWFrame::MAJOR_VERSION + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo.sf.net/xsd/net_file.xsd\""); // street names may contain non-ascii chars device.lf(); // get involved container const NBNodeCont& nc = nb.getNodeCont(); const NBEdgeCont& ec = nb.getEdgeCont(); const NBDistrictCont& dc = nb.getDistrictCont(); // write network offsets and projection writeLocation(device); // write inner lanes bool origNames = oc.getBool("output.original-names"); if (!oc.getBool("no-internal-links")) { bool hadAny = false; for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) { hadAny |= writeInternalEdges(device, *(*i).second, origNames); } if (hadAny) { device.lf(); } } // write edges with lanes and connected edges bool noNames = !oc.getBool("output.street-names"); for (std::map<std::string, NBEdge*>::const_iterator i = ec.begin(); i != ec.end(); ++i) { writeEdge(device, *(*i).second, noNames, origNames); } device.lf(); // write tls logics writeTrafficLights(device, nb.getTLLogicCont()); // write the nodes (junctions) for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) { writeJunction(device, *(*i).second); } device.lf(); const bool includeInternal = !oc.getBool("no-internal-links"); if (includeInternal) { // ... internal nodes if not unwanted bool hadAny = false; for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) { hadAny |= writeInternalNodes(device, *(*i).second); } if (hadAny) { device.lf(); } } // write the successors of lanes unsigned int numConnections = 0; for (std::map<std::string, NBEdge*>::const_iterator it_edge = ec.begin(); it_edge != ec.end(); it_edge++) { NBEdge* from = it_edge->second; from->sortOutgoingConnectionsByIndex(); const std::vector<NBEdge::Connection> connections = from->getConnections(); numConnections += (unsigned int)connections.size(); for (std::vector<NBEdge::Connection>::const_iterator it_c = connections.begin(); it_c != connections.end(); it_c++) { writeConnection(device, *from, *it_c, includeInternal); } } if (numConnections > 0) { device.lf(); } if (includeInternal) { // ... internal successors if not unwanted bool hadAny = false; for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) { hadAny |= writeInternalConnections(device, *(*i).second); } if (hadAny) { device.lf(); } } // write loaded prohibitions for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) { writeProhibitions(device, i->second->getProhibitions()); } // write roundabout information const std::vector<EdgeVector>& roundabouts = nb.getRoundabouts(); for (std::vector<EdgeVector>::const_iterator i = roundabouts.begin(); i != roundabouts.end(); ++i) { writeRoundabout(device, *i); } if (roundabouts.size() != 0) { device.lf(); } // write the districts for (std::map<std::string, NBDistrict*>::const_iterator i = dc.begin(); i != dc.end(); i++) { writeDistrict(device, *(*i).second); } if (dc.size() != 0) { device.lf(); } device.close(); }