feat(geo): adopt Mapbox building calibration (3.1 m per level)

Owner decision: adopt the two findings from the Mapbox cross-check.

- LEVEL_HEIGHT 3.2 -> 3.1 m in block_height_report.py and the Blosm
  --level-height default; every levels-derived building drops ~0.6 m per 6
  levels, matching Mapbox.
- HEIGHT_OVERRIDES for the three rear building=yes/apartments structures that
  Mapbox gives as single storey (3.0 m) where our 2-level fallback rendered
  6.4 m blocks.
- classify_height() takes an optional way_id so overrides apply; the Mapbox
  cross-check passes it and now reports 66 match / 6 non-building / 0 disagree.
- Geometry follows: blockout regenerated at 3.1 (frontage object names
  preserved, 6/6 exported), frontage re-imported, DemoMap rebuilt, packaged
  -qaselftest PASS (walk, reset, pause, transect 0 holes, wall probe 0/35).
- Docs: Art/blender/README scale table + a note that Blosm adds ~1.9 m roof mass
  above levels x levelHeight; TODO item closed; MEMORY records the gotcha that
  blockout regeneration must re-verify the element.* frontage mapping.
This commit is contained in:
zwitschi committed 2026-11-08 16:38:04 +01:00
1 parent 81f7cd3991
commit 1b22d551fe
37 files changed
+126 -64

No files matched your search

+14 -2
View File
@@ -146,13 +146,25 @@ Blender works in metres, and the imported meshes match the OSM geometry, so the
| Building | Blender dimensions | OSM way outline | Height source |
| --- | --- | --- | --- |
| El Capitan Entertainment Centre | 25.72 × 54.47 × 14.50 m | 25.75 × 54.88 m | `height` tag 14.5 |
| El Capitan Theatre | 38.66 × 54.46 × 20.96 m | 38.59 × 54.87 m | `building:levels=6` × 3.2 m, plus roof |
| El Capitan Theatre | 38.66 × 54.46 × 20.55 m | 38.59 × 54.87 m | `building:levels=6` × **3.1 m**, plus ~1.9 m roof |
| Madame Tussaud's | 42.48 × 56.77 × 15.90 m | 42.0 m frontage | `height` tag 15.9 |
| TCL Chinese Theatre | 43.78 × 75.90 × 18.10 m | 44.0 m frontage | `height` tag 18.1 |
Widths agree to a few centimetres; depths differ by up to 0.4 m because Blosm assembles **multipolygon relations**, not the raw way I measured. Placement after the frame correction agrees with the UTM control points to 0.1–0.5 m per building — the residual is relation assembly and Blosm's edge straightening, not projection.
Buildings **without** a `height` tag get levels × 3.2 m, which is a placeholder, not evidence. Every such height is a modelling decision to be replaced from the reference photography.
Buildings **without** a `height` tag get levels × **3.1 m**. The storey height was
3.2 m until 2026-11-09, when a cross-check of every block building against
Mapbox's building data (`Geo/tools/mapbox_buildings.py`) showed our figure
running 0.6 m high per six levels — i.e. 3.1 m per level — and that calibration
was adopted. The few buildings where Mapbox disagreed with a pure
`levels × 3.1 m` fallback carry an explicit override in
`Geo/tools/block_height_report.py::HEIGHT_OVERRIDES`.
Blosm adds roof mass on top of `levels × levelHeight`: the two `levels`-derived
frontage buildings both land ~1.9 m above their table height (6922 39.1 m against
37.2 m, El Capitan Theatre 20.5 m against 18.6 m). That offset is the roof, not a
height error — the table records the tagged height, the mesh records the storey
plus its roof.
## Relation completeness