Organised Editing/Activities/TomTom/Global - Building Height Imports/Netherlands - 3D BAG Building Heights Import
Overview
TomTom, in consultation with the Dutch OpenStreetMap community, 3DGI, and the 3D geoinformation research group at TU Delft, is supporting a community-reviewed import to enrich existing OSM building footprints with missing height tags. The heights are derived from the 3D BAG dataset produced by TU Delft.
This activity follows an import-style workflow with upfront community consultation, transparent documentation, conservative acceptance rules, and a staged rollout starting with a pilot area (Amsterdam).
Context
The Netherlands contains over 10 million buildings in OpenStreetMap, imported via the BAG (Basisregistratie Adressen en Gebouwen). While building footprints and administrative attributes are well represented, the vast majority of buildings still lack height=* or building:levels tags. Building heights have been a long-standing gap in Dutch OSM data, and the topic has come up repeatedly in community discussions. The 3D BAG dataset by TU Delft now makes adding heights feasible at a national scale.
Adding reliable building heights enables:
- Better 3D map representations and routing
- Urban planning and digital twin use cases
- Environmental modelling (e.g. flood risk, solar analysis)
- AR/VR and visualization applications
This effort is supported by TomTom, which has committed engineering and community resources, in consultation with the Dutch OSM community, 3DGI and the 3D geoinformation research group at TU Delft. Similar building height imports have been completed in other countries, and we hope to learn from those experiences. We welcome everyone to voice, contribute, review and challenge any part of this project.
Data Source
| Field | Details |
| Dataset | 3D BAG (https://3dbag.nl/en/viewer) |
| Producer | 3DGI / 3D geoinformation research group, TU Delft |
| Source data | AHN (Actueel Hoogtebestand Nederland) LiDAR point cloud combined with BAG building footprints |
| Level of Detail used | LoD2.2 (default in pipeline) |
| Formats available | CityJSON, GeoPackage, PostGIS, OGC API Features, WMS |
| Coverage | All approximately 10 million buildings in the Netherlands |
| Update cadence | Tied to AHN flight cycles, currently every 2 to 4 years and increasing in frequency |
| Release date used for this import | 2025-09-03 |
| Documentation | https://docs.3dbag.nl/en/ |
| Download | https://3dbag.nl/en/download |
All height values in the dataset are absolute elevations above NAP (Normaal Amsterdams Peil, the Dutch sea level datum). Both b3_h_dak_70p and b3_h_dak_max therefore give the altitude above sea level, not the height of the building.
License
| Field | Details |
| 3D BAG license | CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) |
| ODbL compatibility | Confirmed. A signed CC BY 4.0 waiver from both rights holders is on file, following the OSMF standard CC BY 4.0 waiver template. Both clauses are agreed: OSM Contributors page accepted as "reasonable manner" attribution under Section 3(a)(1), and Section 2(a)(5)(B) waived as to OpenStreetMap and its users. |
| Waiver process | Complete as of 2 June 2026. Signatures received:
The fully signed copy has been provided to the OSMF Licensing Working Group (legal-questions@otrs.openstreetmap.org) for the confidential legal record. A public copy with the handwritten signatures redacted and a "Published Copy" watermark applied is published below. |
| Public copy of the signed waiver | 3DBAG CC BY 4.0 waiver, signed 2 June 2026 (public copy, signatures redacted) |
| Attribution required | Per the signed waiver, collective attribution via the OSM Contributors page is accepted by the rights holders as "reasonable manner" attribution under CC BY 4.0 Section 3(a)(1). TU Delft (3D geoinformation research group) and 3DGI are credited there as the source for 3DBAG-derived building heights. For per-object provenance, each imported building carries:
Changesets name the source and pilot scope. Example comment: |
| Permission reference | Signed waiver dated 2 June 2026 (see the public copy linked above; original held by TomTom and OSMF Licensing Working Group). Direct correspondence with the 3DBAG team at TU Delft and 3DGI confirmed the import plan, and the pilot has been openly communicated with the Dutch OSM community via the OSM community forum. |
Per the signed CC BY 4.0 waiver, attribution to TU Delft and 3DGI is provided collectively through the OSM Contributors page. The credit line "© 3DBAG by tudelft3d and 3DGI" is also included in each changeset comment and on this wiki page. Individual mappers do not need to add their own copyright attribution.
Methodology - Calculation of Building Heights
All height values in the dataset are absolute elevations above NAP (Normaal Amsterdams Peil, the Dutch sea level datum). To get the actual building height above ground, the following calculation is used:
height = b3_h_dak_max − b3_h_maaiveld
| Attribute | Description | Source |
| b3_h_dak_max | Maximum elevation (NAP) of the highest vertex on the reconstructed roof surface | LoD2.2 geometry (roofer reconstruction) |
| b3_h_maaiveld | Ground level elevation (NAP), calculated as the 5th percentile of AHN ground points within 4 m of the building footprint | AHN point cloud |
| Result | Height from ground to the highest point of the building in metres |
The pipeline rounds the resulting value to 1 decimal place before writing it to OSM.
Things Worth Knowing
- The LoD2.2 model is a simplified reconstruction of the raw LiDAR point cloud. Very small projections like chimneys or antennas may not be individually modelled as separate roof surfaces.
- The b3_rmse_lod22 field on each building shows the Root Mean Square Error between the model and the raw point cloud, which is a useful per-building quality indicator.
- The b3_kwaliteitsindicator field flags buildings where the reconstruction is considered reliable (true = good quality). Buildings where this value is false or missing are excluded from the import.
- For applications where the most representative rather than absolute maximum height is needed, using b3_h_dak_70p instead of b3_h_dak_max provides a 70th percentile roof elevation that is less sensitive to small protrusions.
- Where the absolute roof maximum is needed (rather than a representative height), b3_h_dak_max is also available in the dataset and is what the pipeline uses today.
Tagging
Per-building tags
The import adds these tags to each matched OSM building. No existing tag is overwritten.
| OSM Key | Value (example) | Notes |
height=*
|
13.3
|
Metres above ground level. Calculated as b3_h_dak_max - b3_h_maaiveld, rounded to 1 decimal place
|
source:height=*
|
3DBAG
|
Source attribution |
source:height:date=*
|
2025-09-03
|
Release date of the 3DBAG dataset used (ISO 8601) |
Buildings that already carry tags such as ref:bag=*, source=*, source:date=*, building=* or start_date=* keep them unchanged. The import is additive: it only fills missing height information.
We welcome the community's input on the source tag convention. If you have a preference or a recommendation based on past Dutch imports, please share it on the community discussion thread.
Per-changeset tags
Example changeset: 182589231.
| OSM Key | Value |
comment=*
|
Added building heights from 3DBAG (TU Delft) — Amsterdam pilot #tomtom-osm #amsterdam-3dbag
|
source=*
|
3DBAG (TU Delft, 3D Geoinformation)
|
created_by=*
|
osm-bulk-upload/upload.py v. 2
|
import=*
|
yes
|
ref:bag handling
We do not modify ref:bag=* values used for matching. However, when a building's existing ref:bag=* value is shorter than 16 digits (the official BAG identifier length), we will check the pipeline left-pads it with leading zeros to bring it to 16 digits to try to match the behaviour of the JOSM BAG plugin and was raised in the community thread. Reference: Voorloop nul(len) BAG referentie nummers. In case any issues, we will contact the maintainers.
Conflation And Acceptance
When buildings in 3D BAG share the same unique BAG identifier already present on OSM buildings in the Netherlands via the ref:bag=* tag, a match is made. No geometric matching or heuristics are used.
A building is skipped if any of the following apply:
- It already has a
height=*tag (no existing value is ever overwritten) - It does not have a
ref:bag=*tag - The 3D BAG quality indicator (
b3_kwaliteitsindicator) is false or missing - The computed height is below 3.0 m (likely a small auxiliary structure such as a shed or garage, where source data quality is lower)
- The
ref:bag=*tag is incorrectly placed on abuilding:part=* - The OSM element is tagged
building=no - The building tag value is empty or not a recognised value
This conservative approach minimises risk and avoids conflicts with local mapping practices. Rejected buildings are recorded in a per-run rejected.geojson file with a reason code for transparency.
Phased Rollout Plan
This task is the full-scale automated import of building heights from the 3D BAG dataset into OSM for the Amsterdam municipality. The import is conducted in a phased rollout (6 phases) to:
- minimise risk,
- allow iterative validation,
- incorporate community feedback,
- ensure quality control at each stage.
Each phase is implemented as a dedicated sub-task, each covering a predefined geographic polygon. A summary report is mandatory after each phase before the next one starts.
Scope
- Source dataset: 3D BAG (LoD2.2)
- Target platform: OpenStreetMap
- Data type: Building height attribute enrichment (
height=*) - Coverage: Full Amsterdam area, with an optional Schiphol Airport phase
Plan
| Phase | Area | No of leads/buildings | Risk Level | Estimated Import Date | QC / Community Review End date |
|---|---|---|---|---|---|
| 0 | Final validation + community announcement | — | — | 9.06 | — |
| 1 | Amsterdam-Noord + Nieuw-West | 47,129 | Low | 11.06 | 12.06 |
| 2 | Zuidoost + Westpoort + Weesp | 22,313 | Low / Medium | 15.06 | 16.06 |
| 3 | Oost + West | 32,383 | Medium | 17.06 | 18.06 |
| 4 | Zuid | 20,113 | Medium / High | 19.06 | 22.06 |
| 5 | City Center | 14,115 | High | 22.06 | 23.06 |
| 6 | Schiphol Airport area | 173 | Special case | 24.06 | 25.06 |
Acceptance Criteria (per phase)
- Automated import script runs successfully per phase in OSM
- No unintended overwrites of OSM data
- All edits are properly grouped into OSM changesets with comments
- Changes follow OSM import guidelines and tagging standards
- Each phase passes QC and OSM community review before proceeding to the next
Post-phase Reporting (MANDATORY after every phase)
After completing each phase, the following summary is published on this wiki page and announced on the forum thread:
- List of OSM changeset IDs created during the import
- Number of successfully updated buildings
- Number of unsuccessfully updated buildings (with reason codes)
Phase 0 Pre-flight Checklist (must be green before Phase 1)
| Check | Status |
| Final waiver signature received from TU Delft | Pending |
run_upload.py invoked with -y "3DBAG (TU Delft, 3D Geoinformation)" (default is survey - this was missing in Pilot 1)
|
Blocker - must be enforced |
source:height:date=* value matches the actual 3D BAG release in use (2025-09-03)
|
Confirmed |
ref:bag=* zero-padding to 16 digits applied
|
Confirmed |
Pipeline never overwrites an existing height=* value
|
Confirmed |
| Phase 1 polygon boundaries finalised and committed to the repository | Confirmed |
| Community announcement of phased plan published on talk-nl and the NL forum | Confirmed |
Dependencies / Preparation
The following items must be in place before the phased rollout proceeds:
| Dependency | Status |
|---|---|
| Final validation completed (Phase 0) | In progress |
| Import documented on OSM wiki at Organised Editing / TomTom / Netherlands - 3D BAG Building Heights Import | Confirmed (this page) |
| Community announcement published on OSM forum | Draft ready, scheduled to publish now that the waiver is in place |
| Polygon definitions prepared and committed for each phase | Confirmed |
| TU Delft / 3DGI waiver signature received | Received 2 June 2026. Signed by 3DGI (Balázs Dukai, Co-Founder, 11 May 2026) and TU Delft 3D geoinformation research group (Machiel van Dorst, Prof.dr.ir., 2 June 2026). Public copy on this wiki; full signed copy held by TomTom and the OSMF Licensing Working Group. |
Editing Account
Edits are performed using a dedicated account, created to perform TomTom's automated edits. This ensures transparency, easy identification in object history, and separation from personal mapping.
Changeset comment example:
Added building heights from 3DBAG (TU Delft) — Amsterdam pilot #tomtom-osm #amsterdam-3dbag
Editor identifier: osm-bulk-upload/upload.py v. 2 (recorded in each changeset's created_by=* tag).
Revert Plan
If a problem is identified in any batch:
- Per-changeset revert is the default mitigation, using standard OSM revert tools.
- Larger reverts (multi-changeset) are coordinated with the Dutch community via the forum thread before action.
- The TTmechanicalupdates account is dedicated to these edits, so reverts can be scoped cleanly without affecting unrelated mapping.
Pilot Run
Two community-reviewed pilots have been completed by the dedicated TTmechanicalupdates account, totalling 535 buildings across 6 changesets.
Pilot 1 (5 May 2026)
A first community-reviewed pilot was completed in the Amsterdam test scope, covering 17 buildings across multiple polygons of the multipolygon test geometry (the scope spans Amsterdam West, Noord, Oost, Nieuw-West, and two polygons in the adjacent Almere municipality).
- Buildings tagged with
height=*: 17 - Total changesets: 5 (all closed 5 May 2026)
- Account: TTmechanicalupdates
- Comment on all 5 changesets: Added building heights from 3DBAG (TU Delft) — Amsterdam pilot #tomtom-osm #amsterdam-3dbag
- No unintended overwrites, no geometry changes, no new buildings
- Outcome: positive community feedback, no reverts required
Per-changeset breakdown
| Changeset | Ways | Notable buildings | Area |
|---|---|---|---|
| 182242209 | 3 | Villa Casparus (282067006), 282067419, 282067898 (all building=apartments) | Weesp (Villa Casparus = Slijkstraat 23) |
| 182242210 | 8 | 282072533 (yes); 282074427, 282074968, 282075692, 282075971, 282076135, 282076398, 282077021 (all house) | Residential terrace + 1 untyped building (area to verify) |
| 182242211 | 3 | 277347990, 277348027, 277348141 (all house) | Residential, separate OSM ID range from changeset 210 (likely different polygon) |
| 182242212 | 1 (relation) | Relation 11071468 v4 (building=apartments multipolygon) | Multipolygon building - confirms pipeline handles relations, not only ways |
| 182242215 | 2 | 371725529, 371725530 (both house) | 2 adjacent houses, yet another OSM ID range |
| Total | 17 |
Observations from the per-changeset audit
- Total verified: 16 ways + 1 multipolygon relation = 17 buildings, matching the announcement count exactly.
- Geographic spread confirmed: the modified objects span at least four distinct OSM ID ranges (277xxxxxx, 282xxxxxx, 371xxxxxx, and a multipolygon relation), which is consistent with the deliberately scattered 8-polygon test scope.
- Weesp polygon confirmed: Villa Casparus (way 282067006, Slijkstraat 23) sits in Weesp, confirming the test scope included buildings in the gemeente edge area.
- Multipolygon coverage confirmed: relation 11071468 (
building=apartments) was successfully tagged withheight=*- this validates that the pipeline correctly handlestype=multipolygonbuildings, not only ways. (Thetype=buildingrelation mentioned in the forum announcement was intentionally not modified.) - Building type mix: 4 apartments (including the multipolygon) + 12 house + 1 yes (untyped) = a representative mix of Dutch residential building tags.
- Why 5 changesets for 8 polygons: some polygons in the test scope produced zero modifications (because all their buildings already had
height=*or no matchingref:bag=*), andrun_upload.pybundles writes by batch rather than one-changeset-per-polygon. This is expected behaviour.
Known issue with Pilot 1 changeset metadata
A review of the actual changeset tags on changeset 182242209 reveals that the per-changeset source=* value was uploaded as survey rather than the intended 3DBAG (TU Delft, 3D Geoinformation). This is the default value from
when the
flag is not supplied.
The other changeset metadata is correct:
created_by=osm-bulk-upload/upload.py✓import=yes✓- Comment with #tomtom-osm and #amsterdam-3dbag hashtags ✓
- Per-building
source:height=3DBAGon every modified way ✓
The actual data provenance is therefore still traceable via the per-building source:height=* and source:height:date=* tags, the changeset comment, the import=yes marker, and the account name.
Mitigation for future imports: the
flag is now a mandatory parameter on every
Mitigation for Pilot 1 historical changesets: to be discussed with the community on the forum thread - options include a corrective changeset note, a follow-up edit, or leaving as-is given that the actual source is already unambiguous from the other metadata.
Pilot 2 (Amsterdam-Zuid, 13 May 2026)
A second, larger pilot followed in Amsterdam-Zuid, covering the De Pijp / Rivierenbuurt area in tile 10-434-712. Community pre-announcement on 11 May 2026, import executed on 13 May 2026 (2-day notice window).
- Buildings tagged with
height=*: 518 - Changeset: 182589231 (single)
- Changeset comment: Added building heights from 3DBAG (TU Delft) — Amsterdam pilot #tomtom-osm #amsterdam-3dbag
- Closed: 13 May 2026
- Tile: 10-434-712
- Bounding box (WGS84): lat 52.35095 to 52.35538, lon 4.90419 to 4.91149
- Buildings already with
height=*(skipped): 0 - Height range: 3.0 m to 26.9 m, average 13.4 m
- Building type profile: 67% apartments, 18% house, 13% yes (untyped), 2% other (industrial / school / commercial / retail)
- Outcome: passed QC, no reverts required
Community Engagement and Announcements
This import has been openly developed in consultation with the Dutch OpenStreetMap community from the start. All announcements have been made in Nederlands, but some can be bilingual including English on the OSM Community Forum.
Forum thread
Primary consultation channel:
Announcements timeline
| Date | Forum post | Subject | Posted by |
|---|---|---|---|
| 5 May 2026, 16:14 UTC | Post #23 | Pilot 1 announcement - 17 buildings, 8 multipolygons across Amsterdam gemeente including Weesp, 5 changesets (182242209, 182242210, 182242211, 182242212, 182242215). Import executed same day. Full test scope GeoJSON attached. | sbaido |
| 11 May 2026, 10:57 UTC | Post #34 | Pilot 2 pre-announcement - 518 buildings in Amsterdam-Zuid (De Pijp / Rivierenbuurt), tile 10-434-712, height tags only on existing OSM buildings, no geometry changes. CSV and visual context PNG attached. Revert promise reaffirmed. Import executed 13 May 2026 (changeset 182589231). | sbaido |
| 22 May 19:32 UTC | Post #36 | Phased rollout announcement - 6-phase plan for full Amsterdam coverage (~136K buildings). To be posted once the TU Delft / 3DGI waiver is fully signed (or partially signed if a green light is given). | sbaido |
Engagement principles
- At least in Dutch and/or Bilingual: every announcement posted should be in Dutch (primary) and English if needed.
- Pre-announcement: each pilot is announced before the import runs, with scope, source, account, and revert plan stated up front.
- Attachments: every announcement includes a machine-readable scope file (GeoJSON or CSV) so the community can independently verify the exact buildings affected (when possible).
- Revert commitment: every announcement repeats the per-changeset revert commitment in line with the OSM Import Guidelines and the Automated Edits Code of Conduct.
Current Status
- Date of this update: 2 June 2026
- Phase: Community consultation and Amsterdam pilot completed. Phased rollout announced. Waiver fully received -- ready to proceed to Phase 1 pending community OK on the rollout announcement.
- License process: Complete. CC BY 4.0 waiver signed by both rights holders:
- 3DGI: Balázs Dukai, Co-Founder. Signed 11 May 2026.
- TU Delft 3D geoinformation research group: Machiel van Dorst, Prof.dr.ir. Signed 2 June 2026.
- Public copy of the signed waiver: 3DBAG CC BY 4.0 waiver, signed 2 June 2026. Full signed copy held by TomTom and the OSMF Licensing Working Group.
- Next steps:
- Publish the phased rollout announcement to the NL OSM forum thread, referencing the signed waiver
- Update the OSM Contributors page to credit TU Delft 3D geoinformation research group and 3DGI as the source for 3DBAG-derived building heights
- On community OK: start Phase 1 (Amsterdam-Noord + Nieuw-West)
- Publish a post-phase report after each phase before moving to the next
Contact
- Project lead: Salim Baidoun (TomTom)
Feedback, questions, and concerns are welcome via the OSM community forum thread