Proposal:Road marking revision

From OpenStreetMap Wiki
Jump to navigation Jump to search
Road marking revision
Proposal status: Draft (under way)
Proposed by: Supaplex030
Tagging: road_marking=*
stroke=*
pattern=*
Applies to: node, way, area
Definition: Improving existing approaches for mapping road markings as separate features.
Statistics:

Draft started: 2025-04-18

Proposal

Various road 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.

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=*) – however, this proposal gives suggestions how to use the road_marking scheme to specify road/lane markings directly at the highway line.

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, road edge, centerline, crossing edge...) or on its design (dashed line, double solid line, shark 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 centerlines). 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

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 Potential influence on 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 form of the stop line (e.g. solid or shark_teeth).
highway=stop
highway=give_way
highway=traffic_signals


lane_divider
lane_divider
road_marking=lane_divider way

Lane markings to demarcate individual lanes, particularly if there are multiple lanes in the same direction or special lanes e.g. for busses or bicycles.

  • Add stroke=* to specify the form of the lane marking (e.g. dashed or double_solid).
change=*
road_edge
road_edge
road_marking=road_edge way

Marking the edge/boundary of a road.

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

Edge/border markings of pedestrian or cycleway crossings.

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 form of the restriction marking (e.g. chevron or stripes).
  • reason=* could be used to specify, why a restriction is marked (e.g. bus_stop, driveway or emergency).
  • TODO Or using a function tag or similar to distinguish types like gore, traffic_island, no_parking, emergency, bus_stop, junction...
parking:side
parking:side:restriction=*
junction
junction
road_marking=junction area

(Drivable) patterns on junctions like box markings.

  • Add pattern=* to specify the form of the junction marking (e.g. crosshatch).
  • TODO Could also be mapped as restriction, adding a function subtag telling it is a junction/no_stopping marking.
crossing
crossing
road_marking=crossing area

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

crossing:markings=*

Describing symbolic markings

arrow
arrow
road_marking=arrow way

An arrow, often to indicate turn directions, but also for indicate driving or oneway directions or overtaking hints. Recommended to be mapped as a line between two points corresponding to the length and direction of a single arrow (start point at the "foot" of the arrow).

  • Add turn=left, turn=through;right etc. to specify the form of the arrow (according to the values of turn:lanes=* tagging). TODO turn=* isn't fitting in every case, maybee also use symbol=* here? Or something else?
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=*
pictogram
pictogram
road_marking=pictogram node

A symbol or pictogram applied as a road marking.

  • Add symbol=* to specify the shown pictogram. TODO symbol=* would be a homonymous use, since it's already in use for human readable expressions of hiking trail marker symbols.
e.g. cycleway=*

Additional attributes

Stroke and pattern styling

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

way stroke=*

Some line attributes like stroke=shark_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 teeth, the tips of the teeth point to the right).

Also double lane markings with different stroke styles depend on the line direction and can be specified with stroke:left=*, stroke:right=* and, in the rare case of triple markings, stroke:center=* (left and right seen in the line direction):

area pattern=*

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 arrows or other symbolic 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 teeth stop lines at a junction.

way road_marking=stop_line
+ stroke=shark_teeth

A yellow centerline with dashed lines on one side and a solid line on the other.

way road_marking=centerline
+ stroke=dashed_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
+ stroke=zigzag

Besides the solid centerline and the solid road edge marking, there are also “shark's teeth” related to a traffic lane.

way road_marking=lane_divider
+ stroke=shark_teeth

Turn lanes marked with arrows (road_marking=arrow + turn=through/turn=right), from left to right separated by lane markings (road_marking=lane_divider + stroke=dashed) and two different neutral areas (road_marking=restriction + pattern=chevron/pattern=stripes).

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

area road_marking=crossing
+ colour=red

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

Using on highway=* lines to specify lane_markings=yes

Instead of mapping road markings as separate features, the values of this scheme can also be used on the highway line itself to specify the already existing unspecific lane_markings=yes property. Although “lane markings” is an unfavorable term, as it is unclear which elements of the lane it refers to (centerlines, lane dividers, road edge markings, ...), it is already established and should therefore serve as a basis for additional tagging options.

TODO Short textual explanation how to use the tagging.

TODO Explaining defaults: solid road edge, dashed lane dividers, country specific colours and overtaking/change indicators.

TODO Replacing in use divider=* tagging.

The following examples illustrate the use of road marking values on highway lines:

A dashed centerline and solid road edges.

lane_markings=yes
lane_markings:centreline:stroke=dashed
lane_markings:road_edge:stroke=solid


lane_markings=yes alone may be sufficient according to country specific defaults.

A yellow dashed-solid double centerline and solid road edges.

lane_markings=yes
lane_markings:centreline:stroke:left=dashed
lane_markings:centreline:stroke:right=solid
lane_markings:centreline:colour=yellow
lane_markings:road_edge:stroke=solid


lane_markings=yes + overtaking=backward (driving on the right) may be sufficient according to country specific defaults.)

A dashed centerline, but no road edges.

lane_markings=yes
lane_markings:centreline:stroke=dashed
lane_markings:road_edge=no

No centerline or lane dividers, but solid road edges.

lane_markings=no
lane_markings:road_edge:stroke=solid

A (dual carriageway) oneway road with dashed lane divider and solid road edges.

lane_markings=yes
lane_markings:lane_divider:stroke=dashed
lane_markings:road_edge=solid

A (dual carriageway) oneway road with 4 lanes, left lane separated by solid lane divider, others by dashed lane dividers.

lane_markings=yes
lane_markings:lane_divider:stroke:lanes=|solid|dashed|dashed
lane_markings:road_edge=solid
lane_markings:road_edge:left:colour=yellow


lane_markings=yes + change:lanes=no|not_left|yes|yes may be sufficient according to country specific defaults.

A (dual carriageway) oneway street with 2 lanes, right lane (bus lane) separated by solid lane divider.

lane_markings=yes
lane_markings:lane_divider:stroke:lanes=|solid
lane_markings:road_edge=solid

TODO With shoulder, the line separating the shoulder isn't an edge marking?

TODO Other idea using/expanding [Proposal:Separation|marking]] scheme

A cycleway separated by dashed lane divider.

cycleway:right=lane
cycleway:right:marking:stroke=dashed


cycleway:right=lane + cycleway:right:lane=advisory may be sufficient according to country specific defaults.

External discussions

Comments

Please comment on the discussion page.