void NIImporter_SUMO::addJunction(const SUMOSAXAttributes& attrs) { // get the id, report an error if not given or empty... myCurrentJunction.node = 0; myCurrentJunction.intLanes.clear(); myCurrentJunction.response.clear(); bool ok = true; std::string id = attrs.get<std::string>(SUMO_ATTR_ID, 0, ok); if (!ok) { return; } if (id[0] == ':') { // internal node return; } SumoXMLNodeType type = attrs.getNodeType(ok); if (ok) { if (type == NODETYPE_DEAD_END_DEPRECATED || type == NODETYPE_DEAD_END) { // dead end is a computed status. Reset this to unknown so it will // be corrected if additional connections are loaded type = NODETYPE_UNKNOWN; } } else { WRITE_WARNING("Unknown node type for junction '" + id + "'."); } Position pos = readPosition(attrs, id, ok); NBNetBuilder::transformCoordinates(pos, true, myLocation); NBNode* node = new NBNode(id, pos, type); if (!myNodeCont.insert(node)) { WRITE_ERROR("Problems on adding junction '" + id + "'."); delete node; return; } myCurrentJunction.node = node; SUMOSAXAttributes::parseStringVector(attrs.get<std::string>(SUMO_ATTR_INTLANES, 0, ok, false), myCurrentJunction.intLanes); // set optional radius if (attrs.hasAttribute(SUMO_ATTR_RADIUS)) { node->setRadius(attrs.get<SUMOReal>(SUMO_ATTR_RADIUS, id.c_str(), ok)); } // handle custom shape if (attrs.getOpt<bool>(SUMO_ATTR_CUSTOMSHAPE, 0, ok, false)) { node->setCustomShape(attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), ok)); } if (myCustomShapeMaps.count(id) > 0) { NBNode::CustomShapeMap customShapes = myCustomShapeMaps[id]; for (NBNode::CustomShapeMap::const_iterator it = customShapes.begin(); it != customShapes.end(); ++it) { node->setCustomLaneShape(it->first, it->second); } } if (type == NODETYPE_RAIL_SIGNAL || type == NODETYPE_RAIL_CROSSING) { // both types of nodes come without a tlLogic myRailSignals.insert(id); } }
// ---- the root/junction - element void NLHandler::openJunction(const SUMOSAXAttributes& attrs) { myCurrentIsBroken = false; bool ok = true; // get the id, report an error if not given or empty... std::string id = attrs.get<std::string>(SUMO_ATTR_ID, 0, ok); if (!ok) { myCurrentIsBroken = true; return; } PositionVector shape; if (attrs.hasAttribute(SUMO_ATTR_SHAPE)) { // inner junctions have no shape shape = attrs.getOpt<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), ok, PositionVector()); } SUMOReal x = attrs.get<SUMOReal>(SUMO_ATTR_X, id.c_str(), ok); SUMOReal y = attrs.get<SUMOReal>(SUMO_ATTR_Y, id.c_str(), ok); bool typeOK = true; SumoXMLNodeType type = attrs.getNodeType(typeOK); if (!typeOK) { WRITE_ERROR("An unknown or invalid junction type occured in junction '" + id + "'."); ok = false; } std::string key = attrs.getOpt<std::string>(SUMO_ATTR_KEY, id.c_str(), ok, ""); // incoming lanes std::vector<MSLane*> incomingLanes; parseLanes(id, attrs.getStringSecure(SUMO_ATTR_INCLANES, ""), incomingLanes, ok); // internal lanes std::vector<MSLane*> internalLanes; #ifdef HAVE_INTERNAL_LANES if (MSGlobals::gUsingInternalLanes) { parseLanes(id, attrs.getStringSecure(SUMO_ATTR_INTLANES, ""), internalLanes, ok); } #endif if (!ok) { myCurrentIsBroken = true; } else { try { myJunctionControlBuilder.openJunction(id, key, type, x, y, shape, incomingLanes, internalLanes); } catch (InvalidArgument& e) { WRITE_ERROR(e.what() + std::string("\n Can not build according junction.")); myCurrentIsBroken = true; } } }
void NIImporter_SUMO::addJunction(const SUMOSAXAttributes& attrs) { // get the id, report an error if not given or empty... bool ok = true; std::string id = attrs.getStringReporting(SUMO_ATTR_ID, 0, ok); if (!ok) { return; } if (id[0] == ':') { // internal node return; } SumoXMLNodeType type = attrs.getNodeType(ok); if (ok) { if (type == NODETYPE_DEAD_END_DEPRECATED) { // patch legacy type type = NODETYPE_DEAD_END; } } else { WRITE_WARNING("Unknown node type for junction '" + id + "'."); } Position pos = readPosition(attrs, id, ok); NILoader::transformCoordinates(pos, true, myLocation); // the network may have non-default edge geometry. // accurate reconstruction of legacy networks is not possible. We ought to warn about this if (attrs.hasAttribute(SUMO_ATTR_SHAPE)) { PositionVector shape = attrs.getShapeReporting(SUMO_ATTR_SHAPE, id.c_str(), ok, true); if (shape.size() > 0) { shape.push_back_noDoublePos(shape[0]); // need closed shape if (!shape.around(pos) && shape.distance(pos) > 1) { // MAGIC_THRESHOLD // WRITE_WARNING("Junction '" + id + "': distance between pos and shape is " + toString(shape.distance(pos))); mySuspectKeepShape = true; } } } NBNode* node = new NBNode(id, pos, type); if (!myNodeCont.insert(node)) { WRITE_ERROR("Problems on adding junction '" + id + "'."); delete node; return; } }