Proposal:Road marking revision

From OpenStreetMap Wiki
Jump to navigation Jump to search
Road marking revision
Proposal status: Voting (under wayIcon arrow down (89599) from The Noun Project
Proposed by: Supaplex030
Tagging: road_marking=*
stroke=*
pattern=*
arrow=*
symbol=*
Applies to: node, way, area
Definition: Improving existing approaches for mapping road markings as separate features.
Statistics:

Draft started: 2025-04-18
RFC start: 2025-06-01
Vote start: 2025-06-27 00:00:00 (UTC)
Vote end: 2025-07-10 23:59:59 (UTC)

Proposal

Various markings on a road in Luxembourg: A neutral area that should not be driven on, lane markings and direction indicators such as arrows and lettering.
A complex road situation consisting of various restricted areas, lane dividers, stop lines and crossing markings. For some applications (especially rendering) it can be helpful to map these as separate features.

Road markings are a common part of roads all over the world. Even though road markings are not one of the "typical" things we map in OSM (since we mostly capture their meaning rather than the markings themselves), there are situations or needs where explicitely mapping them with OSM is helpful.

For some time now, there has been a wiki page with suggestions for road marking values, which were initially used by a single mapper. The suggested values do not seem to follow any particular system, but are a collection of rather overspecific values merging function and styling of markings. Nevertheless this tagging is used continuously, especially for mapping stop lines (of which over 35,000 have already been mapped using this scheme). The aim of this proposal is to reorganize the road markings scheme by introducing easier to use categories, making it more applicable to mappers and data consumers.

Note: Usually it is not necessary to map road markings as separate features, as long as their meaning is reflected in the data through appropriate tags. Typical tags that are indicated by road markings are turn:lanes=*, overtaking=*, change=* or crossing:markings=*, for example. The presence of lane markings on a road can be specified with lane_markings=* on the highway line (as well as the number of lanes themselves by counting lanes=*).

Even for rendering, using the tags mentioned above in combination with further information like placement=* or width:lanes=* is sufficient to render exactly representations of road markings. Nevertheless, there may be situations in which it makes sense for some mappers to explicitly map road markings (as the increasing use of the existing schema shows). One use case could be, for example, the cartographic representation of intersections or other complex roadway situations, which up to now can only be represented in OSM in a highly generalized form without being able to identify the detailed layout of the roadway areas.

Rationale

The existing in-use documentation of the road_marking=* key unsystematically lists a large number of different values that describe the type and appearance of markings very specifically (e.g. dashed_yield_line or solid_stop_line). The open-ended approach makes it difficult to interpret the values, in some cases even colors are used as part of the value "in the wild". The list would become longer and less interpretable over time if usage grows in countries all over the world with their different types and styles of road markings. On the other hand, there are suggested values like dash that are also hard to interpret because they could be lane, centerline, edge or crossing lines, for example.

Therefore, this proposal aims to categorize road markings into more generic classes and provide a set of additional attributes to further describe their style and meaning. One difficulty in categorizing road markings is that it can be based either on the function of a marking (e.g. stop line, lane divider, edge of carriageway, crossing edge...) or on its design (dashed line, double solid line, shark's teeth...). Both classifications have advantages and disadvantages, e.g. the design is identifiable even if the meaning is not known. Data users, on the other hand, may be more interested in the function (e.g. distinguishing between solid stop lines and solid lane dividers). This proposal tries to avoid the conflict by proposing functionally oriented, but very generic values that are easy to identify and can be specified using sub-tags.

Tagging / How to map

The road markings key is intended for mapping road markings as separate features, i.e. with their own geometry (and not, for example, on a highway line).[note 1]

Depending on the category, road markings can be mapped as lines, points or areas. Add road_marking=* with one of the values listed below as well as further specifying tags if needed, e.g. for styles (line strokes, area patterns) and physical properties. In many cases, road markings have an influence on other tags, which should always be aligned (see the references in the table below).

If road markings are mapped in a location where the areas of roads and streets are also mapped with area:highway=*, the road markings are always mapped in addition, i.e. "on" the carriageway areas.

Typical Values

Illustration Value Geometry Description Interdependence with other tags

Describing linear markings

stop_line
stop_line
road_marking=stop_line way node

A stop line e.g. in front of a traffic signal, traffic sign or (other) junctions. Can be mapped as a line following its real location, or alternatively as a point on the highway line.

  • Add stroke=* to specify the style of the stop line (e.g. solid or sharks_teeth).
  • If mapped on a node on the highway=* line, add direction=forward/backward to specify which direction of travel is affected by the stop line.
highway=stop
highway=give_way
highway=traffic_signals
lane_divider
lane_divider
road_marking=lane_divider way

Lane markings to demarcate individual lanes.

  • Add stroke=* to specify the style of the lane marking (e.g. dashed or double_solid).
lane_markings=*
lanes=*
change=*
overtaking=*
edge_line
edge_line
road_marking=edge_line way

Marking the edge/boundary of the carriageway.

  • Add stroke=* to specify the style of the edge marking (e.g. solid).
crossing_edge
crossing_edge
road_marking=crossing_edge way

Edge/border markings of pedestrian or cycleway crossings.

  • Add stroke=* to specify the style of the crossing marking (e.g. dashed).
crossing:markings=*

Describing areal markings

restriction
restriction
road_marking=restriction area

Neutral areas or restriction markings, like gore chevron or no-parking markings.

  • Add pattern=* to specify the style of the restriction marking (e.g. chevron or stripes).
  • Add reason=* to specify, why a restriction is marked (e.g. bus_stop, driveway or emergency).
parking:side
parking:side:restriction=*
crossing
crossing
road_marking=crossing area

The (areal) marking of a crossing to map the extent of crossing markings or colored surfaces in detail. Note: In general, tags like crossing:markings=* or surface:color=* at the highway crossing line should be sufficient to describe such markings.

  • Add pattern=* to specify the style of the crossing marking (e.g. solid). It is also possible to use the values known from crossing:markings=* (e.g. zebra), but these can be derived from any existing crossing lines and duplicate information should be avoided.
  • Add colour=* to specify the colour of the crossing markings.
crossing:markings=*

Describing symbolic markings

arrow
arrow
road_marking=arrow way

An arrow, usually to indicate turn directions, but also for indicate driving or oneway directions or overtaking hints. In contrast to other symbolic road markings, arrows are mapped as lines (instead of points) by most mappers. It is therefore recommended to map arrows as a simple line between two points corresponding to the length and direction of a single arrow with the line starting at the "foot" (base) of the arrow.

  • Add arrow=* to specify the form of the arrow, usually using values from turn=* (like left, through, through;right, merge_to_left, reverse, ...) or restriction=* tagging (like no_u_turn, no_right_turn).
turn:lanes=*
traffic_sign
traffic_sign
road_marking=traffic_sign node

An equivalent of a traffic sign applied as a road marking.

traffic_sign=*
maxspeed=*
hazard=*
text
text
road_marking=text node

Lettering on the road surface like "BUS", "SLOW" or "King St.".

lanes=* (like lanes:bus=*)
access=* (like bus:lanes=*)
hazard=*
symbol
symbol
road_marking=symbol node

A symbol or pictogram applied as a road marking.

  • Add symbol=* to specify the shown pictogram.
e.g. cycleway=*

Additional attributes

Stroke, pattern and symbol styling

Use the tags stroke=* (for ways), pattern=* (for areas), arrow=* (for arrows) and symbol=* (for symbols) to further describe the design of road markings:


way stroke=*

Use stroke=* to describe the style of linear road markings.

Some line attributes like stroke=sharks_teeth are "directed" and therefore dependent on the line direction. In this case, the stroke elements are considered to "point to the right" from the line direction (in case of shark's teeth, the tips of the teeth point to the right).

Double lane markings with different stroke styles on each side can be specified with stroke:left=* and stroke:right=* (seen in the line direction).

area pattern=*

Use pattern=* to describe the style of areal road markings.

way arrow=*

Use arrow=* with the common values known from turn=* to specify the form of an road_marking=arrow (like left, through, through;right, merge_to_left, reverse, ...). In rarer cases, arrow markings may also show icons known from restriction=* (like no_u_turn, no_right_turn).

Examples:

node symbol=*

Use symbol=* to describe the style/form of symbolic road markings (road_marking=symbol). Use a generic term such as bicycle, pedestrian, hov (see hov=*) or airport (see also destination:symbol=*). (Note: In this case, symbol=* is used homonymously with the existing use of symbol=* for the human readable equivalent of osmc:symbol=*, describing route symbols that are used as waymarkers or on guideposts. In the context of road markings, however, symbol=* fits ideally into existing schemes such as destination:symbol=*.)

Examples:

Other additional attributes

There is a bunch of tags that can provide additional information describing the size or other physical properties of road markings:

  • width=*, especially for linear road markings to distinguish narrow from wide markings,
  • colour=*, e.g. whether there are white or yellow markings,
  • direction=* on nodes to specify where the markings are facing to,
  • length=* on nodes to specify the size of symbolic road markings (beside width=*).

Others could be added if needed, but aren't part of this proposal, like the technical form (paint, plastic/thermoplastic/tape, surface (like markings made from (paving) stones), studs) or, related to that, material=* (plastic, metal, stone...).

Examples

Shark's teeth stop lines at a junction.

waynode road_marking=stop_line
+ stroke=sharks_teeth

Neutral area at an exit ramp forming a theoretical gore.

area road_marking=restriction
+ pattern=stripes

Marking at a bus stop to raise attention and prevent cars from stopping.

area road_marking=restriction
+ pattern=zigzag
+ reason=bus_stop

A pattern on a junction that can be driven over but it is not allowed to stop within it (see also box junction).

area road_marking=restriction
+ pattern=crosshatch
+ reason=junction

Colored road surface on a bike lane, intended as a warning indicator on a crossing.

area road_marking=crossing
+ pattern=solid
+ colour=red

A yellow centerline with dashed lines on one side and a solid line on the other. Note: Do not use road_marking=* tags on highway=* lines itself. To specify the style of road markings directly at the highway line, a further schema needs to be developed in the future.

way road_marking=lane_divider
+ stroke:left=dashed
+ stroke:right=solid (seen in line direction: dashed on the left, solid on the right side)
+ colour=yellow

Wavy lane markings around a zebra crossing.

way road_marking=lane_divider / edge_line
+ stroke=zigzag

Turn lanes marked with arrows...
way road_marking=arrow + arrow=through/arrow=right

...from left to right separated by lane markings...
way road_marking=lane_divider + stroke=dashed

...and two different neutral areas
area road_marking=restriction + pattern=chevron/pattern=stripes

Destination markings (arrow, text, symbol) near an intersection.

way road_marking=arrow + arrow=through
node road_marking=text + inscription=TRIER
node road_marking=symbol + symbol=motorway

Footnotes

  1. The use of styling attributes to specify road markings on highway=* lines is out of scope of this proposal, but can be developed subsequently (e.g. the use of lanes=2 + lane_markings=yes + lane_markings:stroke=dashed).

External discussions

Comments

Please comment on the discussion page.

Voting

Instructions for voting
  • Log in to the wiki if you are not already logged in.
  • Scroll back down and click "Edit source" next to the title "Voting". Copy and paste the appropriate code from this table on its own line at the bottom of the text area:
To get this output you type Description
  • I approve this proposal I approve this proposal.
{{vote|yes}} --~~~~ Feel free to also explain why you support the proposal!
  • I oppose this proposal I oppose this proposal. reason
{{vote|no}} reason --~~~~ Replace reason with your reason(s) for voting no.
  • I abstain from voting but have comments I have comments but abstain from voting on this proposal. comments
{{vote|abstain}} comments --~~~~ If you don't want to vote yes or no but do have something to say. Replace comments with your comments.
Note: The ~~~~ automatically inserts your name and the current date.
For more types of votes you can cast, see Template:Vote. See also how vote outcome is processed.


  • I approve this proposal I approve this proposal. --Pavvv (talk) 22:37, 27 June 2025 (UTC)
  • I approve this proposal I approve this proposal. --Mueschel (talk) 07:21, 28 June 2025 (UTC)
  • I oppose this proposal I oppose this proposal. I can't see any real-world use case about this kind of micro-mapping that can't be handled through existing tags. And while I can see how standard values are necessary in general, it should be noted that nearly half of this key use are from two imports circa 2014 and 2017. Half of the key use nowadays is about a stop line or a give way, which can already respectively be mapped as highway=stop and highway=give_way. Right now I'd rather recommend against using this key if anything. --Lejun (talk) 11:15, 28 June 2025 (UTC)
We have no relevance criteria at OSM for good reasons. So if you don't see any use cases in this tagging, then don't use it. Others obviously see them, otherwise they wouldn't have used this tagging. (I for example for renderings of intersections: example 1 | example 2.) --Supaplex030 (talk) 12:50, 28 June 2025 (UTC)
@Lejun: One of the (stealth) imports you're referring to was mainly about stop lines at signalized intersections. However, these stop lines could not be represented as highway=traffic_signals due to the prominent local practice of staggered stop lines. – Minh Nguyễn 💬 21:01, 2 July 2025 (UTC)
I don't think rejecting a proposal for a physical feature makes sense, if the only criticism is "I cannot imagine a use case". --Dieterdreist (talk) 16:09, 3 July 2025 (UTC)
  • I approve this proposal I approve this proposal. --Tordanik 13:22, 28 June 2025 (UTC)
  • I approve this proposal I approve this proposal. --Broiledpeas (talk) 15:18, 28 June 2025 (UTC)
  • I approve this proposal I approve this proposal. --Riiga (talk) 12:49, 30 June 2025 (UTC)
  • I approve this proposal I approve this proposal. --Chris2map (talk) 15:20, 30 June 2025 (UTC)
  • I abstain from voting but have comments I have comments but abstain from voting on this proposal. I feel like the micromapping is fairly complex and see limited use of it in general, especially. Certain features are very useful when added to existing features, however, such as on the highways themselves, stroke for divider and pattern for the flush median proposal I drafted quite a while ago as well as certain other features like placing stop_line nodes onto the ways (since they're sometimes further away than usual because of driveways or something). --ManuelB701 (talk) 09:43, 2 July 2025 (UTC)
  • I approve this proposal I approve this proposal. There are still some edge cases to iron out on the margins, like how to tag a crossing edge that doubles as a stop line (extremely common in California). Some raw tag values like pattern=chessboard will need translations into more idiomatic English (checkerboard or draughtboard) for editor preset fields. But overall this is a big step in the right direction compared to the messy table that we've been coping with for years now. I look forward to mass-retagging the import in my area that helped popularize road_marking=* back in 2017. – Minh Nguyễn 💬 21:14, 2 July 2025 (UTC)
  • I approve this proposal I approve this proposal. --Dieterdreist (talk) 16:07, 3 July 2025 (UTC)
  • I approve this proposal I approve this proposal. --Severin (talk) 08:01, 5 July 2025 (UTC)
  • I approve this proposal I approve this proposal. --Marc Mongenet (talk) 10:17, 5 July 2025 (UTC)