Skip to content

Commit

Permalink
fix #14512
Browse files Browse the repository at this point in the history
  • Loading branch information
namdre committed Mar 15, 2024
1 parent e8d1eb7 commit 008f6de
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 3 deletions.
6 changes: 6 additions & 0 deletions src/netbuild/NBAlgorithms_Railway.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,9 @@ NBRailwayTopologyAnalyzer::addBidiEdge(NBEdgeCont& ec, NBEdge* edge, bool update
if (ec.retrieve(id2) == nullptr) {
NBEdge* e2 = new NBEdge(id2, edge->getToNode(), edge->getFromNode(),
edge, edge->getGeometry().reverse());
if (edge->getParameter(NBTrafficLightDefinition::OSM_DIRECTION) == "forward") {
e2->setParameter(NBTrafficLightDefinition::OSM_DIRECTION, "backward");
}
ec.insert(e2);
if (ec.retrieve(id2) == nullptr) {
WRITE_WARNINGF(TL("Bidi-edge '%' prevented by filtering rules."), id2);
Expand Down Expand Up @@ -657,6 +660,9 @@ NBRailwayTopologyAnalyzer::reverseEdges(NBEdgeCont& ec, NBPTStopCont& sc) {
e->reinitNodes(e->getToNode(), e->getFromNode());
e->setGeometry(e->getGeometry().reverse());
reversedIDs.insert(e->getID());
if (e->getParameter(NBTrafficLightDefinition::OSM_DIRECTION) == "forward") {
e->setParameter(NBTrafficLightDefinition::OSM_DIRECTION, "backward");
}
}
seqLengths[(int)seq.size()]++;
numReversed++;
Expand Down
7 changes: 7 additions & 0 deletions src/netbuild/NBNetBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,13 @@ NBNetBuilder::compute(OptionsCont& oc, const std::set<std::string>& explicitTurn
MIN2(geoConvHelper.getConvBoundary().xmin(), geoConvHelper.getConvBoundary().ymin()) < -1000000) {
WRITE_WARNING(TL("Network contains very large coordinates and will probably flicker in the GUI. Check for outlying nodes and make sure the network is shifted to the coordinate origin"));
}

// clean up OSM processing params
if (oc.exists("osm-files") && oc.isSet("osm-files")) {
for (auto item : myEdgeCont) {
item.second->unsetParameter(NBTrafficLightDefinition::OSM_DIRECTION);
}
}
}


Expand Down
21 changes: 21 additions & 0 deletions src/netbuild/NBTrafficLightDefinition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ const std::string NBTrafficLightDefinition::DefaultProgramID = "0";
const std::string NBTrafficLightDefinition::DummyID = "dummy";
const SUMOTime NBTrafficLightDefinition::UNSPECIFIED_DURATION(-1);
const int NBTrafficLightDefinition::MIN_YELLOW_SECONDS(3);
const std::string NBTrafficLightDefinition::OSM_DIRECTION("osm:direction");
const std::string NBTrafficLightDefinition::OSM_SIGNAL_DIRECTION("railway:signal:direction");


// ===========================================================================
Expand Down Expand Up @@ -478,6 +480,8 @@ NBTrafficLightDefinition::collectAllLinks(NBConnectionVector& into) {
&& (incoming->getBidiEdge() == el.toEdge)
) {
// turnarounds stay uncontrolled at rail signal
} else if (incoming->getToNode()->getType() == SumoXMLNodeType::RAIL_SIGNAL && railSignalUncontrolled(incoming, el.toEdge)) {
// rail signals may stay uncontrolled in a particular direction
} else {
into.push_back(NBConnection(incoming, el.fromLane, el.toEdge, el.toLane, tlIndex++));
if (el.indirectLeft) {
Expand Down Expand Up @@ -510,6 +514,23 @@ NBTrafficLightDefinition::collectAllLinks(NBConnectionVector& into) {
}
}

bool
NBTrafficLightDefinition::railSignalUncontrolled(const NBEdge* in, const NBEdge* out) {
const NBNode* n = in->getToNode();
if (n->hasParameter(OSM_SIGNAL_DIRECTION)) {
if (in->getParameter(OSM_DIRECTION) == out->getParameter(OSM_DIRECTION)) {
if (n->getParameter(OSM_SIGNAL_DIRECTION) != in->getParameter(OSM_DIRECTION)) {
return true;
}
} else {
WRITE_WARNINGF(TL("Could not interpret rail signal direction at junction '%' due to inconsistent directions of edge '%' (%) and edge '%' (%)"),
n->getID(),
in->getID(), in->getParameter(OSM_DIRECTION),
out->getID(), out->getParameter(OSM_DIRECTION));
}
}
return false;
}

bool
NBTrafficLightDefinition::needsCont(const NBEdge* fromE, const NBEdge* toE, const NBEdge* otherFromE, const NBEdge* otherToE) const {
Expand Down
5 changes: 5 additions & 0 deletions src/netbuild/NBTrafficLightDefinition.h
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,10 @@ class NBTrafficLightDefinition : public Named, public Parameterised {
/// @brief perform optional final checks
virtual void finalChecks() const {}

/// @brief processing parameter for rail signal edges and nodes
static const std::string OSM_DIRECTION;
static const std::string OSM_SIGNAL_DIRECTION;

protected:
/// @brief id for temporary definitions
static const std::string DummyID;
Expand Down Expand Up @@ -472,5 +476,6 @@ class NBTrafficLightDefinition : public Named, public Parameterised {
private:
static std::set<NBEdge*> collectReachable(EdgeVector outer, const EdgeVector& within, bool checkControlled);

static bool railSignalUncontrolled(const NBEdge* in, const NBEdge* out);

};
12 changes: 9 additions & 3 deletions src/netimport/NIImporter_OpenStreetMap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -435,9 +435,9 @@ NIImporter_OpenStreetMap::insertNodeChecking(long long int id, NBNodeCont& nc, N
}
if (n->railwaySignal) {
if (n->myRailDirection == WAY_FORWARD) {
node->setParameter("railway:signal:direction", "forward");
node->setParameter(NBTrafficLightDefinition::OSM_SIGNAL_DIRECTION, "forward");
} else if (n->myRailDirection == WAY_BACKWARD) {
node->setParameter("railway:signal:direction", "backward");
node->setParameter(NBTrafficLightDefinition::OSM_SIGNAL_DIRECTION, "backward");
}
}
node->updateParameters(n->getParametersMap());
Expand Down Expand Up @@ -756,12 +756,15 @@ NIImporter_OpenStreetMap::insertEdge(Edge* e, int index, NBNode* from, NBNode* t

id = StringUtils::escapeXML(id);
const std::string reverseID = "-" + id;

const bool markOSMDirection = from->getType() == SumoXMLNodeType::RAIL_SIGNAL || to->getType() == SumoXMLNodeType::RAIL_SIGNAL;
if (addForward) {
assert(numLanesForward > 0);
NBEdge* nbe = new NBEdge(id, from, to, type, speed, NBEdge::UNSPECIFIED_FRICTION, numLanesForward, tc.getEdgeTypePriority(type),
forwardWidth, NBEdge::UNSPECIFIED_OFFSET, shape, lsf,
StringUtils::escapeXML(streetName), origID, true);
if (markOSMDirection) {
nbe->setParameter(NBTrafficLightDefinition::OSM_DIRECTION, "forward");
}
nbe->setPermissions(forwardPermissions, -1);
if ((e->myBuswayType & WAY_FORWARD) != 0) {
nbe->setPermissions(SVC_BUS, 0);
Expand Down Expand Up @@ -818,6 +821,9 @@ NIImporter_OpenStreetMap::insertEdge(Edge* e, int index, NBNode* from, NBNode* t
NBEdge* nbe = new NBEdge(reverseID, to, from, type, speedBackward, NBEdge::UNSPECIFIED_FRICTION, numLanesBackward, tc.getEdgeTypePriority(type),
backwardWidth, NBEdge::UNSPECIFIED_OFFSET, shape.reverse(), lsf,
StringUtils::escapeXML(streetName), origID, true);
if (markOSMDirection) {
nbe->setParameter(NBTrafficLightDefinition::OSM_DIRECTION, "backward");
}
nbe->setPermissions(backwardPermissions);
if ((e->myBuswayType & WAY_BACKWARD) != 0) {
nbe->setPermissions(SVC_BUS, 0);
Expand Down

0 comments on commit 008f6de

Please sign in to comment.