Skip to main content

Buildings

Overview

The Overture buildings theme captures the compilation of many building attributes from a variety of open data sources including OpenStreetMap, Esri Community Maps, Microsoft, and Google.

Feature types

The buildings theme has two feature types:

  • building is a polygon or multipolygon geometry that represents the building's footprint (or roofprint, if traced from imagery).
  • building_part is a polygon that describes part of a building. These come from the OSM features with the tag building:part=yes.

Theme concepts

Both building and building_part types may have many shape related properties. These are useful for expressing the physical shape characteristics of the buidling including roof_height, roof_shape, roof_material, facade_material, etc.

Properties Derived from OpenStreetMap Tags

In OpenStreetMap, an object is defined as a building by the presence of building tag. Most commonly, the value is simply, building=yes. However, in cases where there is a more descriptive value, we capture that information along with other building attributes such as height, roof shape, material, etc. and map them to a finite list of values defined in the building schema.

You can see the SQL query logic that transforms OSM tags into Overture properties for each of these attributes below:

How do I interpret these queries?

Each WHEN line in the CASE statement is a condition that defines the value of the Overture property. For example:

WHEN lower(trim(element_at(tags, 'building'))) IN ('clinic','hospital') THEN 'medical'

Here, lower(trim(element_at(tags, 'building'))) is accessing the value of the building tag in OSM (and ensuring it is lowercase). Therefore, when either the building=clinic or building=hospital tag is present, the statement returns medical. In this case, this defines the subtype for a medical building.

CASE
-- Prioritize the `building` tag to determine the subtype
-- Agricultural
WHEN lower(trim(element_at(tags, 'building'))) IN (
'agricultural',
'barn',
'cowshed',
'farm',
'farm_auxiliary',
'glasshouse',
'greenhouse',
'silo',
'stable',
'sty'
) THEN 'agricultural'

-- Civic
WHEN lower(trim(element_at(tags, 'building'))) IN (
'civic',
'fire_station',
'government',
'government_office',
'public'
) THEN 'civic'

-- Commercial
WHEN lower(trim(element_at(tags, 'building'))) IN (
'commercial',
'hotel',
'kiosk',
'marketplace',
'office',
'restaurant',
'retail',
'shop',
'supermarket',
'warehouse'
) THEN 'commercial'

-- Education
WHEN lower(trim(element_at(tags, 'building'))) IN (
'college',
'kindergarten',
'school',
'university'
) THEN 'education'

-- Entertainment
WHEN lower(trim(element_at(tags, 'building'))) IN (
'grandstand',
'pavilion',
'sports_centre',
'sports_hall',
'stadium'
) THEN 'entertainment'

-- Industrial
WHEN lower(trim(element_at(tags, 'building'))) IN (
'factory',
'industrial',
'manufacture'
) THEN 'industrial'

-- Medical
WHEN lower(trim(element_at(tags, 'building'))) IN (
'clinic',
'hospital'
) THEN 'medical'

-- Military
WHEN lower(trim(element_at(tags, 'building'))) IN (
'bunker',
'military'
) THEN 'military'

-- Outbuilding
WHEN lower(trim(element_at(tags, 'building'))) IN (
'allotment_house',
'carport',
'outbuilding',
'shed'
) THEN 'outbuilding'

-- Religious
WHEN lower(trim(element_at(tags, 'building'))) IN (
'cathedral',
'chapel',
'church',
'monastery',
'mosque',
'presbytery',
'religious',
'shrine',
'synagogue',
'temple',
'wayside_shrine'
) THEN 'religious'

-- Residential
WHEN lower(trim(element_at(tags, 'building'))) IN (
'apartments',
'bungalow',
'cabin',
'detached',
'dormitory',
'duplex',
'dwelling_house',
'garage',
'garages',
'ger',
'house',
'houseboat',
'hut',
'residential',
'semi',
'semidetached_house',
'static_caravan',
'stilt_house',
'terrace',
'townhouse',
'trullo'
) THEN 'residential'

-- Service
WHEN lower(trim(element_at(tags, 'building'))) IN (
'beach_hut',
'boathouse',
'digester',
'guardhouse',
'service',
'slurry_tank',
'storage_tank',
'toilets',
'transformer_tower'
) THEN 'service'

-- Transportation
WHEN lower(trim(element_at(tags, 'building'))) IN (
'hangar',
'parking',
'train_station',
'transportation'
) THEN 'transportation'

-- Consider any amenity / tourism tags if no other building tag was present
WHEN lower(trim(element_at(tags, 'amenity'))) IN (
'nursing_home'
) THEN 'residential'

WHEN lower(trim(element_at(tags, 'amenity'))) IN (
'bus_station',
'parking'
) THEN 'transportation'

WHEN lower(trim(element_at(tags, 'amenity'))) IN (
'place_of_worship'
) THEN 'religious'

WHEN lower(trim(element_at(tags, 'amenity'))) IN (
'clinic',
'dentist',
'doctors',
'hospital',
'pharmacy'
) THEN 'medical'

WHEN lower(trim(element_at(tags, 'amenity'))) IN (
'casino',
'conference_centre',
'events_venue',
'cinema',
'theatre',
'arts_centre',
'nightclub'
) THEN 'entertainment'

WHEN lower(trim(element_at(tags, 'tourism'))) IN (
'aquarium',
'attraction',
'gallery',
'museum'
) THEN 'entertainment'

WHEN lower(trim(element_at(tags, 'amenity'))) IN (
'bar',
'cafe',
'fast_food',
'food_court',
'fuel',
'ice_cream',
'pub',
'restaurant'
) THEN 'commercial'

WHEN lower(trim(element_at(tags, 'amenity'))) IN (
'animal_shelter',
'community_centre',
'courthouse',
'fire_station',
'library',
'police',
'post_office',
'public_bath',
'public_building',
'ranger_station',
'shelter',
'social_centre',
'townhall',
'veterinary'
) THEN 'civic'

WHEN lower(trim(element_at(tags, 'amenity'))) IN (
'college',
'driving_school',
'kindergarten',
'music_school',
'school',
'university'
) THEN 'education'

-- buildings that are part of bridge structures
WHEN lower(trim(element_at(tags, 'bridge:support'))) <> 'no'
THEN 'transportation'

WHEN lower(trim(element_at(tags, 'bridge:structure'))) <> 'no'
THEN 'transportation'

ELSE NULL
END

Building Heights from OpenStreetMap

There are multiple ways to describe the height of an object in OSM. Overture, however, defines height as the number of meters from the ground to the tallest point of the feature. Therefore, we must parse and convert from the OSM string value.

We look for height values in the following OSM tags:

  • height - The overall height of a building or building part.
  • est_height - The estimated height of a building or building part.
  • min_height - The minimum height of a building part.
  • roof_height - The height of the roof of a building or building part.

The OSM wiki specifically lists the following height values as valid: 4, 4 m, 1.35, 7'4". However, there are many other formats present in the data that should be considered.

Comprehensive list of different height tag formats in OSM

As of June 2024:

FormatCount
X16,222,092
X m615,927
X meter212
X metre2
X'142,366
X ft721
X feet7
X'Y"2,432
X"6

Parsing & Conversion

There are a handful of common formatting issues that we generally allow when parsing height values including leading / trailing white space and incorrectly placed decimal points. We apply the following regular expressions to determine the unit of measurement and then perform the appropriate conversion:

^\s*\d+(\.\d*)?\s*$

Height strings that contain only a number value with no indicated units are assumed to be meters. These values are not rounded. Examples:

  • 10 => 10
  • 10 => 10
  • 10.0 => 10
  • 10. => 10
  • 10.6543 => 10.6543

Schema reference