Traffic signal locations at intersections

If the question is about universally accepted practice, then it’s worth noting that there are two popular conventions for tagging highway=traffic_signals: somewhere along each incoming way or at each intersection node.

Along each incoming way

As @Nadjita points out, if you place the highway=traffic_signals node along each incoming way, routers don’t really care where along the way you place it, as long as it’s closer to the intersection than to another intersection. However, popular practice is to place the node at the stop line so that it corresponds to something verifiable on the ground. If there’s no stop line marking, you’d place it before the crosswalk or wherever drivers are supposed to come to a stop.

Sometimes the stop line is technically closer to an intersection with another street. traffic_signals:direction is a hint to the data consumer about which intersection to associate the node with:

This isn’t perfect; sometimes the stop line is associated with more than one upcoming intersection node. For example, northbound traffic at this intersection waits for traffic on East Kemper Road, not Zind Lane:

Eastbound traffic at this intersection stops for not only the service road but also the service road after that and Hope Street after that. In theory, a junction area can help to disambiguate these stop lines.

A more complex intersection may require a junction relation to fully express the system, such as this continuous flow interchange.

Another issue is that, in some situations, there isn’t a single stop line. For example, in the U.S., when the cross street comes in at an angle, the stop line is often staggered lane by lane. Some mappers place the highway=traffic_signals node at the average of all the lanes’ stop lines; others at the average of only the through lanes’ stop lines; others at the nearest or farthest stop line; and still others at none of the above.

Explicit road marking ways can help to disambiguate the situation for other mappers and for renderers, if not for routers:

At each intersection node

Tagging the intersection node simplifies things for renderers and navigation applications that count traffic lights along the route, but it’s more ambiguous when an intersection between two dual carriageways has multiple intersection nodes. Most routers that account for traffic lights try to collapse such intersections into a single vertex in the routing graph, so the presence of multiple traffic signal nodes isn’t necessarily a problem. However, sometimes there really are multiple intersections in close proximity, making this an inexact science.