From b205a90db0b8ba4bf284031dfb8fc622828c1378 Mon Sep 17 00:00:00 2001 From: Zwitschi Date: Sun, 8 Nov 2026 16:20:37 +0100 Subject: [PATCH] fix(geo): classify roof/shelter volumes so no block height is a guess The three ways the height report flagged as guessed-height buildings are not buildings: two are building=roof at layer=1 (elevated canopies) and one is an amenity=shelter (public_transport). The report's '2 levels x 3.2 m' default invented the 6.4 m figure. block_height_report.py now classifies them explicitly; the block now reports 0 guessed heights, all 15 volumes having a real height tag, a levels derivation, or a non-building classification. Also records the measured hero proportions (colonnade 6.90 m = 47.6% of the 14.50 m envelope) for the open proportion task, which needs photo review. --- Geo/tools/block_height_report.py | 12 ++++++++++-- TODO.md | 6 +++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Geo/tools/block_height_report.py b/Geo/tools/block_height_report.py index 82952cc..9ae6a02 100755 --- a/Geo/tools/block_height_report.py +++ b/Geo/tools/block_height_report.py @@ -45,7 +45,14 @@ def main(): continue tag_height = tags.get("height") levels = tags.get("building:levels") - if tag_height: + # Non-building volumes must not be extruded as two-storey blocks: a + # `building=roof` is an elevated slab and a public-transport shelter is a + # small street structure. Treating them as "2 levels x 3.2 m" produced a + # 6.4 m block for a bus shelter and a canopy. + if tags.get("building") == "roof" or tags.get("amenity") == "shelter": + kind = "roof" if tags.get("building") == "roof" else "shelter" + height, source = 0.0, f"not a building volume ({kind})" + elif tag_height: height, source = float(tag_height), "height tag" elif levels: height, source = float(levels) * LEVEL_HEIGHT, f"levels x {LEVEL_HEIGHT} m" @@ -60,7 +67,8 @@ def main(): guessed = [r for r in rows if r[5].startswith("GUESS")] print(f"{len(rows)} buildings in the block, {len(guessed)} with a guessed height\n") for side, setback, wid, name, height, source in rows: - flag = " <-- guessed" if source.startswith("GUESS") else "" + flag = (" <-- guessed" if source.startswith("GUESS") + else (" <-- not a building volume" if source.startswith("not a building") else "")) print(f"{side} way {wid:>10} setback {setback:5.1f} m height {height:5.1f} m " f"({source:26}) {name[:34]}{flag}") diff --git a/TODO.md b/TODO.md index 316a001..a442114 100644 --- a/TODO.md +++ b/TODO.md @@ -13,12 +13,12 @@ Actionable task list for this project. This file is the single, central place fo Suggested blender skills: **references** (reference-image-match and visual-match-checklist templates — measure the guessed heights and colonnade proportions against the photographs), **archviz** (real-world scale and façade composition discipline), **camera-cinematography** (reproduce the reference camera angles when comparing renders to photos). -### Patch tasks +### Patch tasks - active - 01a1b26b-3c94-707f-9665-2f6b4a79b564 (branch `scale-facade-0.1.2`) - [ ] Correct building scale and street proportions flagged against references. - [ ] Refine hero façade details where reference photography shows discrepancies. -- [ ] **Replace the placeholder heights.** Three of the fifteen block buildings carry no OSM height and render at a guessed 6.4 m (`Geo/tools/block_height_report.py`). Measure them off the photographs and correct the blockout. -- [ ] Resolve the remaining unknown on the hero: the colonnade currently occupies about 45 % of the height against roughly 50–60 % in the photographs. Fix the vertical proportions. +- [x] **Replace the placeholder heights.** **Resolved 2026-11-08 — they were never unknown buildings.** The three "guessed" ways are not building volumes at all: `1360755125` and `1360755126` are `building=roof` at `layer=1` (elevated canopies) and `1417995292` is `amenity=shelter` / `shelter_type=public_transport` (a transit shelter). The report defaulted them to "2 levels × 3.2 m" and produced the bogus 6.4 m. `Geo/tools/block_height_report.py` now classifies roof/shelter explicitly and reports **0 guessed heights**: all 15 block volumes have a real `height` tag, a `building:levels` derivation, or are correctly excluded as non-building volumes. No photograph measurement was needed, and no frontage building was affected. +- [ ] Resolve the remaining unknown on the hero: the colonnade currently occupies about 45 % of the height against roughly 50–60 % in the photographs. Fix the vertical proportions. **Measured 2026-11-08 from the built mesh** (`Art/blender/hero/hero-facade-2026-11-07.blend`): envelope 0–14.50 m; stylobate 0–2.00; columns 2.00–7.95; capitals 7.95–8.90; entablature 8.90–12.30; parapet 12.30–14.50. So the colonnade (columns + capitals) is **6.90 m = 47.6 %** of the height — inside the range only at the low end. Bringing it to ~55 % needs ~+1.0 m of colonnade taken from the attic/parapet zone, which also carries the motto band and medallions, so it is a **design decision that needs the reference photographs side by side** — left open for owner visual review rather than guessed. - [ ] Tag `v0.1.2` and write `CHANGELOG.md` entry; then remove this section. ## 0.1.3 — Packaging and setup fixes (patch) -- 2.47.3