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:
1 parent
81f7cd3991
commit
1b22d551fe
37 files changed
+126
-64
No files matched your search
+14
-2
@@ -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
|
||||
|
||||
|
||||
Binary file not shown.
@@ -40,7 +40,9 @@ def parse_args():
|
||||
ap.add_argument("--osm", required=True, help="local .osm file to import")
|
||||
ap.add_argument("--bounds", required=True, help="south,west,north,east in WGS84 degrees")
|
||||
ap.add_argument("--out", required=True, help="output .blend path")
|
||||
ap.add_argument("--level-height", type=float, default=3.2, help="metres per building level")
|
||||
# 3.1 m, not 3.2: calibrated against Mapbox building data on 2026-11-09
|
||||
# (see Geo/tools/mapbox_buildings.py and Geo/tools/block_height_report.py).
|
||||
ap.add_argument("--level-height", type=float, default=3.1, help="metres per building level")
|
||||
ap.add_argument("--origin", default=None,
|
||||
help="lat,lon to use as the Blender origin (project origin). Default: Blosm centres on the extract")
|
||||
ap.add_argument("--no-subdivide", action="store_true", help="skip OSM area subdivision")
|
||||
|
||||
Reference in new issue
Block a user