From OpenStreetMap Wiki
Jump to navigation Jump to search
Public-images-osm logo.svg level
Zero-based floor number of a feature (where 0 is the ground level and -1 is the basement). Show/edit corresponding data item.
Group: buildings
Used on these elements
may be used on nodesmay be used on waysmay be used on areas (and multipolygon relations)should not be used on relations (except multipolygon relations)
Useful combination
Status: de facto

The level=* key indicates the floor level where a feature (such as an amenity or shop) is located in a building. See Simple Indoor Tagging for further information.

Use level:ref=* to specify the marked floor number for multistory buildings and structures (room numbering, elevator buttons, parkade levels) where this differs from the level value.

Highways (and other ways) can be also tagged with level=* when they are essentially bound to a floor of a building complex (such as multilevel parking buildings, railway stations or airports).

For typical street, waterway or railway crossings over bridges or tunnels, layer=* should be used instead. Roads or other ways passing through buildings should be marked with tunnel=building_passage; they should be only marked with level if there is a strong relation to the corresponding level of the building.


The value of the level=* is numerical and used to denote the vertical order of the floors. Usually, level=0 is the ground floor, level=1 the floor above it and basement floors start with level=-1. However, if a building sits at an uneven elevation, the numbers begin at the lowest exposed floor for consistency with the Simple 3D Buildings specification's building:levels=* key. For example, a shop located in a shopping mall's fully underground basement would be tagged level=-1, whereas an entrance to a house's walk-out basement would be tagged level=0.

A building may skip certain level numbers, such as floor 13 in Western countries or floors 4 and 14 in Chinese-speaking countries. Tag the surrounding building with, e.g., non_existent_levels=13 to prevent data consumers from miscounting features on floors above the skipped level.

Ground floor number

This key's zero-based numbering scheme is consistent with the floor numbering system used in many countries including the United Kingdom. However, it differs from the one-based numbering scheme used in many other countries for both wayfinding and addressing. There are also countries where both systems are in everyday use. Moreover, idiosyncratic numbering systems are used in individual buildings throughout the world, especially in large, complex buildings such as shopping malls, hospitals, and airports.

Countries by floor numbering scheme.      "Basement", "ground floor", "first floor"      "Basement", "first floor", "second floor"      Varies by language or region

In general, the level=* key ignores these distinctions in favor of the zero-based numbering scheme, because the level=* key was originally envisioned as a machine-readable key for 3D building rendering. Data consumers that support the Simple Indoor Tagging require values to be numeric and consecutive, even for basements and mezzanines that in reality are known by unpredictable mnemonics such as "B", "B1", "G", "M", and "2M".

level=* values are largely zero-based even in many regions where the one-based numbering system is prevalent in everyday life. However, mappers overwhelmingly skip 0 in Kazakhstan, Korea, and Mongolia, beyond any rate that could be explained by mappers treating 0 as an implicit default value:

level=* usage in one-based countries as of March 2022
Country High occurrence indicates zero-based usage High occurrence indicates one-based usage
0 0 (%) -1 -1 (%) 1 1 (%) B B (%) G G (%)
Belarus 1,695 25.48% 1,996 30.01% 1,598 24.02% 0 0.00% 0 0.00%
Canada 9,801 46.69% 2,024 9.64% 5,827 27.76% 0 0.00% 0 0.00%
Chile 152 18.29% 46 5.54% 310 37.30% 0 0.00% 0 0.00%
China 3,618 25.06% 1,680 11.64% 3,880 26.87% 0 0.00% 3 0.00%
Colombia 263 10.70% 1,568 63.79% 301 12.25% 0 0.00% 0 0.00%
Ecuador 186 28.88% 45 6.99% 226 35.09% 0 0.00% 0 0.00%
Finland 3,232 34.10% 742 7.83% 3,149 33.23% 0 0.00% 0 0.00%
Japan 21,437 41.76% 3,896 7.59% 11,430 22.27% 0 0.00% 0 0.00%
Kazakhstan 44 8.71% 31 6.14% 337 66.73% 0 0.00% 0 0.00%
Moldova 131 44.71% 7 2.39% 51 17.41% 0 0.00% 0 0.00%
Mongolia 12 6.59% 2 1.10% 71 39.01% 0 0.00% 0 0.00%
North Korea 2 1.43% 22 15.71% 95 67.86% 0 0.00% 0 0.00%
Norway 1,988 30.64% 963 14.84% 1,581 24.36% 0 0.00% 0 0.00%
Peru 756 30.14% 125 4.98% 968 38.60% 0 0.00% 0 0.00%
Russia 9,084 24.89% 5,455 14.95% 10,611 29.08% 1 0.00% 0 0.00%
South Korea 246 4.88% 366 7.26% 2,497 49.52% 0 0.00% 0 0.00%
Taiwan 1,081 18.64% 678 11.69% 1,854 31.97% 0 0.00% 0 0.00%
Ukraine 3,468 44.36% 749 9.58% 2,131 27.26% 0 0.00% 0 0.00%
United States 41,537 40.65% 7,432 7.27% 26,598 26.03% 4 0.00% 25 0.00%

Regardless of each country's local tagging convention, inexperienced mappers unaware of the convention may occasionally tag level=* based on the one-based system.[1] Some one-based tagging may have also been introduced because of a previous version of this article. Data consumers may be able to account for some discrepancies in floor numbering. For example, if some features inside a building have a level=* value greater than the building's building:levels=* value and none of the features in the building is tagged level=0, then a data consumer could decrement all the level=* values by one.

Level designations

Main article: Key:level:ref
Main article: Key:addr:floor

When a building uses non-numeric or otherwise non-standard floor designations, tag the individual features on a floor with level:ref=*, ideally in addition to level=* to prevent mishandling by data consumers. For example, the Siam Paragon mall in Bangkok consists of the following floors: B, G, M, 1, 2, 3, 4, 4A, and 5.[2]. A shop on level 4A can then be tagged with level:ref=4A.

Tagging shops exclusively with level:ref=* can be problematic because a data consumer cannot reliably determine the relative vertical order of each floor in the building. To consolidate this information, the Simple Indoor Tagging scheme suggests creating an outline for each level, tagged with indoor=level, adding both level=* and level:ref=* to it. This also works the other way round - if only level=* is defined on the individual shops.

There is also an ongoing discussion on usage of fractional values, e.g. level=0.5 or level=1.5 for mezzanine floors and staircases. See the proposals for more examples.

Multiple values

Level range: level=-1;0 room=yes is a room which goes over (spans) two levels. It's the same room that is accessible on both levels. Often there are doors to each one. If a room is repeated on multiple levels, (it's a different room on another level but has identical dimensions and position in the building,) draw a separate element for each room or use repeat_on=*.

Similarly a staircase could be tagged with level=-1;0 meaning that it connects those two levels.

Use a minus sign to specify a range of positive numbers with no missing values. e.g. The elevator of a 32 storey highrise with two basement levels: level=-2;-1; 0-31 This shows connectivity to multiple levels for indoor navigation.


A typical elevator in the United States (level=-2;-1;0;0.5;1-13), (level:ref=B2;B;1;M;2-14)
Button label level=* level:ref=*
14 13 14
If the building skips 13,
add non_existent_levels=12 to the building.
12 11 12
3 2 3
2 1 2
M 0.5 M
☆1 0 1
B -1 B
B2 -2 B2

Related tags

  • layer=* - Used to mark the vertical relationship between two crossing or overlapping features, e.g. bridges and tunnels at highway or railway junctions.
  • building:levels=* - The number of above ground levels in a building (if there's only the ground level, this is 1), not including the levels in the roof (use roof:levels to state the number of roof levels).
  • addr:floor=* - The floor an apartment/flat is located.
  • repeat_on=* - For features that repeat on several levels / floors where similar copies of a feature can be found at the same position.
  • tunnel=building_passage - A passage through a building, normally as an archway or overhang.
  • level:ref=* - For the marked floor number where this differs from the level value.

See also

Indoor Mapping