Proposal:Road marking revision
Road marking revision | |
---|---|
Proposal status: | Draft (under way) |
Proposed by: | Supaplex030 |
Tagging: | road_marking=* stroke=* pattern=*
|
Applies to: | ![]() ![]() ![]() |
Definition: | Improving existing approaches for mapping road markings as separate features. |
Statistics: |
|
Draft started: | 2025-04-18 |
Proposal

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 | ||||
![]() |
road_marking=stop_line
|
![]() ![]() |
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.
|
highway=stop highway=give_way highway=traffic_signals
|
![]() |
road_marking=lane_divider
|
![]() |
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.
|
change=*
|
![]() |
road_marking=road_edge
|
![]() |
Marking the edge/boundary of a road.
|
|
![]() |
road_marking=crossing_edge
|
![]() |
Edge/border markings of pedestrian or cycleway crossings. |
crossing:markings=*
|
Describing areal markings | ||||
![]() |
road_marking=restriction
|
![]() |
Neutral areas or restriction markings, like gore chevron or no-parking markings.
|
parking:side parking:side: restriction=*
|
![]() |
road_marking=junction
|
![]() |
(Drivable) patterns on junctions like box markings.
|
|
![]() |
road_marking=crossing
|
![]() |
The (areal) marking of a crossing to map the extent of crossing markings or colored surfaces in detail ( |
crossing:markings=*
|
Describing symbolic markings | ||||
road_marking=arrow
|
![]() |
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).
|
turn:lanes=*
| |
road_marking=traffic_sign
|
![]() |
An equivalent of a traffic sign applied as a road marking.
|
traffic_sign=* maxspeed=* hazard=*
| |
![]() |
road_marking=text
|
![]() |
Lettering on the road surface like "BUS", "SLOW" or "King St.".
|
lanes=* (like lanes:bus=* )access=* (like bus:lanes=* )hazard=*
|
![]() |
road_marking=pictogram
|
![]() |
A symbol or pictogram applied as a road marking. |
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:
stroke=*
-
stroke=solid
-
stroke=dashed
-
stroke=double_solid
-
stroke=double_dashed
-
stroke=shark_teeth
-
stroke=zigzag
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):
pattern=*
-
stripes
-
crosshatch
-
chevron
-
zigzag
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 arewhite
oryellow
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 (besidewidth=*
).
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. |
![]() |
A yellow centerline with dashed lines on one side and a solid line on the other.
|
![]() |
Wavy lane markings around a zebra crossing. |
![]() |
Besides the solid centerline and the solid road edge marking, there are also “shark's teeth” related to a traffic lane. |
![]() |
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. |
![]() |
Neutral area at an exit ramp forming a theoretical gore. |
![]() |
Marking at a bus stop to raise attention and prevent cars from stopping. |
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.
|
![]() |
A yellow dashed-solid double centerline and solid road edges.
|
![]() |
A dashed centerline, but no road edges.
|
![]() |
No centerline or lane dividers, but solid road edges. |
![]() |
A (dual carriageway) oneway road with dashed lane divider and solid road edges.
|
A (dual carriageway) oneway road with 4 lanes, left lane separated by solid lane divider, others by dashed lane dividers.
| |
![]() |
A (dual carriageway) oneway street with 2 lanes, right lane (bus lane) separated by solid lane divider.
|
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.
|
![]() |
External discussions
- Discussion page of the existing road_marking documentation.
- Newer discussion in the community forum about mapping junction and gore road markings.
Comments
Please comment on the discussion page.