Proposal:3D tagging for building base shapes

From OpenStreetMap Wiki
Jump to navigation Jump to search
3D tagging for building base shapes
Proposal status: Proposed (under way)
Proposed by: LordGarySugar
Tagging: base:shape=*, base:height=*, base:levels=*, base:colour=*, base:material=*, base:direction=*, base:orientation=*, base:angle=*, base:angle:upper=*, base:angle:lower=*
Applies to: area only (area)
Definition: New tags to represent the underside shape of building in 3D renderers
Statistics:

Rendered as: Building shapes in 3D renderers
Draft started: 2025-08-10
RFC start: 2025-09-06


Proposal

I am proposing a new tagging schema to represent the underside shapes of 3D buildings, which is heavily influenced by and aims to complement the existing Simple 3D Buildings schema. This involves the introduction of a new main tag base:shape=* to be used in conjunction with building=* or building:part=*, which would allow users to specify the shape of the underside of buildings. Some of these will be the same values that are used to represent roof:shapes, while some are renamed for clarity or new entirely, such as pointed_arch. This new tag would be supported by a handful of additional tags that follow the same logic as roof:shape tags, these are base:height=*, base:levels=*, base:colour=*, base:material=*, base:direction=*, base:orientation=* and base:angle=*, base:angle:upper=* and base:angle:lower=*.

This proposal aims to solve two key problems: that it is very time consuming to approximate these building shapes using rectangular-shaped building parts, and that even when approximated these buildings are not accurate to their real-world counterparts, with jagged undersides where there should be smooth curves or straight lines. If this proposal gains community support, I intend to communicate with 3D renderer and editor developers to support the use of these tags as quickly as possible, as changing existing 3D mapping to make use of this new schema would cause buildings to appear broken/less accurate in renderers that do not yet support these new tags.

This schema is intended to be used for building parts that are overhanging and/or suspended. Where a building is located on a steep hill, base:shape=slope or other shapes should not be used to get the base of the building to match up with 3D terrain.

Rationale

There are a number of building shapes that are impossible to represent accurately with the current Simple 3D Buildings schema, as shown in the following table of examples. Editors have managed to approximate a number of these buildings by using a number of rectangular parts to create the illusion of a curve or angled section. This is both time consuming creating and tagging all these building parts, while still not providing an appealing and accurate end result.

Example Building Shape How it appears with current 3D building shapes Proposed base:shape tags
The Atomium, with floating spheres, the bottom of which cannot currently be represented well.
The spheres are constructed from a number of stacked building parts
These building parts could render as a perfect sphere

Tags for a single orb building part

  • building:part=yes
  • min_height=23.2
  • height=43.8
  • base:shape=inverted_dome
  • base:height=10.3
  • roof:shape=dome
  • roof:height=10.3
Folly Arch. The archway cannot currently be represented well.
The arch shape can only be represented with staggered building parts
Tags for archway part only:
  • building:part=yes
  • min_height=6.5
  • height=11
  • base:shape=round
  • base:height=2
Puerta de Europa, an 'inclined building' whose sloping underside cannot be represented well.
Editors have stacked a number of building parts in order to approximate the shape of the building.
Tags for the overhanging part of this building
  • building:part=yes
  • height=114.7
  • base:shape=slope
  • base:height=114.7
  • base:direction=280
  • building:levels=27
  • base:levels=27

Tagging

Existing tags that would be used in combination with the new tags. No change in tagging is proposed for any of these tags.

Key Comment Example tags
building:part=* what type of building part is this yes
height=* height above ground of the top of the building part, including the highest point of the roof shape 15
min_height=* height above ground of the bottom of the building part, including the lowest point of the base shape 5
building:levels=* the total levels of the building part, excluding roof levels. The amount of levels tagged in base:levels should not affect the total levels tagged in building:levels. 3
building:min_level=* the building part's lowest point will end at the top of this level;

the base shape's lowest point will end at the top of this level. This means that if building:min_level=4 and base:levels=1, the base shape should be rendered between the top of level 4 and the top of level 5, NOT the top of level 3 and top of level 4. This behaviour is in contrast to how roof:levels behaves.

1

New keys. Most of these follow the same schema that roof tags use as set out in Simple 3D Buildings. The only keys which introduce new concepts are base:shape=*, base:angle:upper=* and base:angle:lower=*

Key Comment Example tags
base:height=* the vertical extent of the base shape only (e.g. an arch which begins 4m off the ground and reaches 5m off the ground would be tagged 1) 5
base:levels=* how many building levels are located within the base shape's height (a sloping underside of levels 4 and 5 would be tagged =2). You should not add or subtract any levels from building:levels. 1
base:shape=* the underside shape of this building part slope, round
base:colour=* the colour of the bottom of this building part red, #FF1E00
base:material=* the material of the bottom of this building part (there is already the tag floor:material=* which was supposed to mean the exterior underside material, but a large majority of tag uses actually refers the material of the interior's floor (concrete) or are impossible exterior materials i.e. carpet, fine_gravel, ground etc.) concrete
base:direction=* what direction (in degrees) the main face of the base is facing, for example all base:shape=slope and base:shape=partial_arch? need to specify which direction they face. In a scenario with a roof:shape=skillion and base:shape=slope which are parallel, they will have two opposite direction in degrees, for example roof:direction=10 and base:direction=190 45
base:orientation=* what direction the face of the base is relative to the shape of the building part, for example base:shape=round (for parity with roof:shape=round) would default to the long side (along), but most arch shapes need to be oriented along the short side (across) across
base:angle=* for slope and other base types, the angle of the base in degrees. An alternative to tagging base:height. 45
base:angle:upper=* for use only with base:shape=curve. This indicates the angle of the curve at its highest point, relative to horizontal. This must be 0-90 degrees. 45
base:angle:lower=* for use only with base:shape=curve. This indicates the angle of the curve at its lowest point, relative to horizontal. This must be 0-90 degrees. 90

Currently proposed base:shape tags

Diagram of currently proposed base:shape=* values

Please refer to the diagram illustrating all proposed base shapes. This is presented in 2D; dome, pyramidal, cone and their inverted_ counterparts would be 3D shapes just like their roof counterparts.

  • flat (default for building parts without base:shape tags)
  • slope (renamed from roof-centric skillion)
  • pyramidal (+synonym cone)
  • inverted_pyramidal (+synonym inverted_cone)
  • dome
  • inverted_dome
  • round - the same as roof:shape=round - a parabolic arch that begins vertically on each side
  • inverted_round
  • gabled
  • gambrel
  • pointed_arch (gothic arch) - an archway shape where each side consists of two arcs of slightly different radii, these should be calculated automatically based on the base:height set and width of the building parts - need to find explanatory maths for how this is done.
  • segmental_arch - a constant-radius arch where the bottom of the arch ends at a 0-90 degree angle depending on the ratio of height to width. The maximum possible base:height that can be valid is double the width of the building:part, which would result in the exact same shape as round. The radius of a segmental arch is defined as 4x(base:height^2) + arch_width^2 all divided by 8x(base:height)
  • inverted_segmental_arch
  • curve - a curved shape where you can specify the angle at which the curve begins and ends to represent more complex forms, as well as half-arches. Requires the use of base:angle:upper=* and base:angle:lower=*. explanatory diagrams to be created

Multipolygons

Midrand Water Tower, Johannesberg. base:shape=inverted_cone on a multipolygon building:part is necessary to represent this, with base:height being the same as the entire height of the structure.

Like roof shapes, multipolygons should be supported. Some buildings are supported by inverted_cone shapes, but the full cone shape would effectively extend into the ground, which is not possible without recognising that a multipolygon is necessary in such scenarios. See for example Midrand Water Tower, Johannesberg.

base:orientation and base:direction for each base shape

Some base shapes, such as slope and curve require base:direction to be set to define their orientation. Others, such as gabled and round cannot use base:orientation when the building part polygon is square. Pyramidal and dome shapes don't need any tag to be set as they have rotational symmetry.

base:shape base:orientation base:direction
flat no no
slope no yes
pyramidal

cone inverted_pyramidal inverted_cone

no no
dome

inverted_dome

no no
round

inverted_round

yes (no when polygon is square) yes
gabled yes (no when polygon is square) yes
gambrel yes (no when polygon is square) yes
pointed_arch yes (no when polygon is square) yes
segmental_arch

inverted_segmental_arch

yes (no when polygon is square) yes
curve no yes

Existing roof:shape values that I am not proposing become base:shape values

  • saltbox
  • gabled_height_moved
  • hipped
  • half-hipped
  • side_hipped
  • side_half-hipped
  • hipped-and-gabled
  • mansard
  • crosspitched
  • onion

The rationale for excluding these is that there is either ambiguity in how they are rendered or that there are no real-life examples of buildings that could make use of these base:shapes.

Examples

Some examples of relatively complex shapes that could be easily represented with a single building part using this schema

building part with skillion roof and base shape
difference between base:shape=round and round:inverted
example of a complete arch that could be constructed with a single building part

Rendering

To be rendered by 3D renderers only.

Features/Pages affected

Update 3D tagging to explain the new tags there

Update floor:material=* to explain that base:material is the recommended replacement tag, supported by 3D renderers. (Another proposal or discussion will be required later to redefine floor:material as for the interior's floor material, it's current de-facto usage).

Comments

Please comment on the OSM Community forum thread.