Geo/tools/ is now every geographic script, with Geo/README.md documenting each one; the Blender-side builders moved beside their outputs in Art/blender/*/ and import their helpers from Geo/tools/osm_common.py. That module gains to_unreal_local() and to_blender_local(): the only place in the repository that multiplies metres by 100, so a second silent scale cannot be introduced. block_height_report.py adds height provenance for the block — 3 of 15 buildings have no height data and render at a placeholder 6.4 m. asset_metadata.py writes and audits <asset>.geo.json sidecars; four now exist (hero-facade, terrain, street, blockout) and the audit recomputes each centre from the origin, failing anything that disagrees.
46 lines
2.6 KiB
Markdown
46 lines
2.6 KiB
Markdown
# Geo
|
||
|
||
Geographic sources, manifests, and the tools that turn them into Blender and Unreal content.
|
||
|
||
OSM is layout data only. It is not authoritative for façade detail, height, or pavement, and it is never sampled as a texture or panorama source.
|
||
|
||
## Layout
|
||
|
||
| Path | Contents |
|
||
| --- | --- |
|
||
| `Geo/raw/` | Verbatim source responses and downloads, checksummed. Never edited by hand. |
|
||
| `Geo/manifests/` | One manifest per source: extract, DEM, and the local origin |
|
||
| `Geo/verification/` | Per-pass notes: address, footprints, bounds, street profile, cross-sections, elevation |
|
||
| `Geo/tools/` | Every geographic tool (Python, standard library only unless noted) |
|
||
|
||
Tools that build 3D content from these sources live next to their output in `Art/blender/*/` (`terrain_from_dem.py`, `street_mesh.py`, `site_assembly.py`, `blosm_blockout.py`) because they need Blender; their shared geo helpers and the unit conversion come from `Geo/tools/osm_common.py`.
|
||
|
||
## Tools
|
||
|
||
| Tool | Purpose |
|
||
| --- | --- |
|
||
| `osm_common.py` | Shared helpers: parse `.osm`, stitch and clip a street, project to UTM through PROJ, **and the single metres→centimetres conversion** (`to_unreal_local`) |
|
||
| `block_report.py` | Streets, boundary intersections, and the building set for a block, split by side |
|
||
| `block_height_report.py` | Every block building with its height **source** — tag, levels × 3.2 m, or a placeholder guess |
|
||
| `street_profile.py` | Carriageway width from crossings, sidewalk offsets, per-building setbacks |
|
||
| `street_section.py` | Cross-sections from the DEM: crown, gutters, kerb detection |
|
||
| `elevation_probe.py` | Samples 3DEP for relief and records the baseline for the release checks |
|
||
| `dem_stats.py` | Stdlib reader for the tiled GeoTIFF the 3DEP service returns; GDAL does not run on this host |
|
||
| `asset_metadata.py` | Writes and audits `<asset>.geo.json` sidecars: position, provenance, conversion |
|
||
|
||
## Unit boundary
|
||
|
||
There is exactly one conversion in the repository:
|
||
|
||
```
|
||
WGS84 (lat, lon) → EPSG:26911 (E, N metres) → project-local metres → Unreal centimetres
|
||
```
|
||
|
||
`Geo/tools/osm_common.py::to_unreal_local` is the only place that multiplies by 100. Per-asset sidecars record the result, and `asset_metadata.py audit` checks each saved sidecar against that function, so a file that drifts is caught rather than trusted.
|
||
|
||
## Current state
|
||
|
||
The extract, both El Capitan footprints, the demo bounds, the building sets, the street profile, cross-sections, and the 3DEP DEM window are recorded in `Geo/verification/` and `Geo/manifests/`. The local CRS and origin are fixed in `manifests/local-origin.md`.
|
||
|
||
Open items live in `ROADMAP.md` under **Geographic data**.
|