Skip to main content

LOD1 building extrusion

A small Pillar 0 add-on for council planning, solar studies, line-of-sight, and urban-context demos. Polygon feature classes with a numeric height attribute render as flat-roofed 3D blocks on the existing MapLibre 2D map.

What "LOD1" means

LOD = Level Of Detail, a CityGML / OGC standard for how richly a building is represented:

LevelWhat it showsExample
LOD02D footprint onlyThe building outline on a regular map.
LOD1Footprint + height → flat-roofed prismA box. No roof shape, no facade detail, no openings.
LOD2LOD1 + roof shape (gable / hip / mansard)A house with a pitched roof.
LOD3LOD2 + facade detail (windows, doors, balconies)What you see in Google Earth city models.
LOD4LOD3 + interior layoutFloor plans + walls inside.

LOD1 is the cheapest 3D representation that is still useful. The whole city of Manchester as LOD1 is around 250k boxes; that renders in MapLibre at 60 fps on a laptop. The same city at LOD3 is gigabytes of geometry that needs Cesium and a tileset.

What ships

Stratumly already has POLYGON feature classes and an attribute schema with numeric columns. The only delta is a render mode.

Backend

  • No schema change. Reuse any existing feature class with geometry_type=POLYGON and a numeric column (height_m, floors, building_height, …).
  • New optional field on feature_classes.style_json:
    {
    "fill-color": "#cccccc",
    "extrusion": {
    "heightAttribute": "height_m",
    "heightMultiplier": 1.0,
    "baseAttribute": "ground_level_m",
    "minHeight": 2
    }
    }
  • The vector-tile cache keeps emitting the same MVT, no tile-format change.

Frontend (MapLibre)

  • The layer style switches from type: "fill" to type: "fill-extrusion" when style_json.extrusion is present.
  • MapLibre paint properties used:
    • fill-extrusion-height: ['get', 'height_m']
    • fill-extrusion-base: ['get', 'ground_level_m'] (optional, sits on terrain)
    • fill-extrusion-color: '#cccccc'
    • fill-extrusion-opacity: 0.85
  • The map needs pitch enabled. The default 2D MapView initialises locked at pitch: 0; we lift the lock and add a tilt control.
  • The click handler reads the same properties; the inspector panel is unchanged.

Where on the map

  • Pillar 0 only. No survey, no twin, no Cesium. Same /map page.
  • Toggle on the layer-panel row: a small "3D" button next to the visibility toggle. Click → re-styles the layer with extrusion mode. The setting persists on the feature class.

Edit dialog

The layer edit dialog gets a new "3D extrusion" section visible only for POLYGON layers:

  • Height attribute picker. Dropdown of numeric columns from the schema.
  • Multiplier. Slider 0.5–5.0 for cases where the column is in feet but you want metres, or a stylised exaggerated view.
  • Base attribute picker. Optional; for buildings that sit on terrain.
  • Min height. Fallback when the row's height attribute is null.

Use cases

  • Council planning. "Show me the proposed development overlaid against existing massing."
  • Solar / shadow studies. Combine extrusion with MapLibre's sun-position lighting (built-in) to flag overshadowing complaints.
  • 5G / wireless line-of-sight. An antenna at building X needs LOS to building Y; extrusion makes the obstruction obvious.
  • Cross-corridor visibility. Checking sightlines along a railway or road before greenlighting a development.
  • "What fits here" mass-modelling. Drag-and-drop a polygon, set a height, see whether the proposed building dwarfs its neighbours before committing to a CAD design.

What it deliberately is NOT

  • Not photogrammetry. No mesh generation from photos.
  • Not LOD2+. Roof shapes, facades, windows are out of scope.
  • Not the Twin. The xeokit-based Twin Studio is for designed-in-CAD elements with semantics (a column knows it's a column). LOD1 boxes are dumb extrusions: fine for context, not for engineering.
  • Not BIM import. IFC / Revit conversion lives in the dedicated Twin Studio + Scan-to-BIM AI roadmap.

Status

info

LOD1 extrusion is a small, near-term roadmap item. It lights up automatically on any POLYGON feature class with a height column once the toggle ships. We'll prioritise it when the first council customer asks, or when sales calls flag urban-context demos as recurring asks. Not blocking any other work.