topology

Navigation Graph

The mathematical structure that makes machine routing possible. The topology object defines every node, edge, connection, and physical constraint in the indoor navigation graph — from corridor widths and door types to vertical connections and decision points.

WIM v1.0 42 fields 6 required
42
Total fields
6
Required
36
Optional
9
Field groups
3
Standards
Purpose
Indoor navigation graph

The topology object transforms a floor plan into a computable navigation graph. It defines the node-edge structure that routing engines traverse to generate step-by-step wayfinding instructions for all channels simultaneously.

Hierarchy position
Root-level · sibling to place

The topology object sits at the root of the WIM JSON document alongside place, status, and accessibility. Its node_id ties back to the place's IMDF unit identifier.

Standards alignment
IndoorGML 2.0 · IMDF · CityGML 3.0

Nodes and edges map directly to IndoorGML cellular space model. Space identifiers align with IMDF units and openings. The CityGML space reference connects topology to the semantic 3D building model.

IndoorGML 2.0 (OGC) IMDF (Apple) CityGML 3.0 (OGC) IFC / BIM
01 Node Identity 5 fields
node_id
string required

Unique identifier for this node in the navigation graph. Corresponds to an IndoorGML cellular space identifier. Referenced by connected nodes in other WIM records and by routing engines when computing paths.

Convention: node-{building}-{level}-{unit-slug} — Immutable after creation

"node_id": "node-A-02-145"
node_type
enum required

Functional classification of this node. Drives routing logic — a junction is a decision point, a room is a destination, an entrance is a journey start. Routing engines use this to render appropriate turn instructions per channel.

room corridor junction entrance exit elevator stairwell escalator waiting_area amenity
"node_type": "room"
node_label
string optional

Human-readable label for this node, used in routing instructions and debugging tools. Not the canonical destination name (that lives in place.name.primary) — this label describes the node's role in the graph, e.g. a corridor segment or junction point.

Max: 128 chars

"node_label": "Cardiology Clinic — Level 2 Entry"
graph_id
string required

Identifier of the navigation graph this node belongs to. All nodes within a contiguous indoor space share a graph_id. Routing engines load the complete graph by ID before computing paths — a node not in the graph cannot be routed to.

Convention: graph-{site-slug}-{building} — Scoped to a single connected indoor space

"graph_id": "graph-main-hospital-a"
network_id
string optional

Parent network identifier when multiple graph_ids are interconnected across a campus. Enables cross-building routing — a routing engine can traverse from one graph to another within the same network without losing continuity.

Convention: net-{site-slug} — Optional when graph is fully self-contained

"network_id": "net-main-hospital"
02 Graph Connections 3 fields
connected_nodes
array required

Array of node_id values for all nodes directly reachable from this node in the graph. Routing engines use this adjacency list to traverse the graph. Must be consistent — if node A lists node B, node B must list node A (unless the edge is unidirectional).

Min items: 1 — Items: valid node_id strings within the same graph_id

"connected_nodes": ["node-A-02-corridor-12", "node-A-02-elevator-03", "node-A-02-waiting-area-C"]
connected_edges
array optional

Array of edge_id values for all edges incident to this node. When present, enables edge-level attribute lookup (weight, direction, surface) during routing. Omit when edge metadata is not yet modelled for this graph.

"connected_edges": ["edge-A-02-145-to-corridor-12", "edge-A-02-145-to-elevator-03"]
edge_id
string optional

Identifier of the primary edge connecting this node to its most-used neighbour. Used when this record is serialised as an edge-annotated node (rather than a pure adjacency list). Edge properties in groups 03 and 06 apply to this edge.

Convention: edge-{source-node}-to-{target-node}

"edge_id": "edge-A-02-145-to-corridor-12"
03 Edge Properties 4 fields
edge_type
enum optional

Functional type of the primary edge. Affects routing heuristics — a corridor is weighted normally; a ramp may penalise wheelchair routing if slope exceeds threshold; an open_space allows diagonal traversal.

corridor doorway open_space ramp elevator_link stair_link escalator_link outdoor_path
"edge_type": "corridor"
edge_weight
float optional

Routing cost multiplier for this edge. A value of 1.0 is baseline cost. Higher values penalise the edge in shortest-path algorithms — used to deprioritise congested corridors, poorly signposted routes, or edges with accessibility constraints.

Min: 0.1 — Default: 1.0 — Typical range: 0.5 – 5.0

"edge_weight": 1.0
edge_direction
enum optional

Directionality of traversal allowed on this edge. Used for one-way corridors in hospitals (infection control, patient flow) or one-way escalators. Routing engines must respect this when building the directed graph for Dijkstra / A* computation.

bidirectional forward_only reverse_only
"edge_direction": "bidirectional"
bidirectional
boolean optional

Shorthand flag indicating whether this edge can be traversed in both directions. true when edge_direction is bidirectional. Redundant when edge_direction is present, but provided for routing engines that check a simple flag without parsing the enum.

"bidirectional": true
04 Proximity & Connections 9 fields
nearest_opening
string optional

IMDF opening identifier for the closest traversable opening (door, archway, gate) to this node. Referenced by channel renderers generating physical signage instructions such as "turn left at the opening ahead".

"nearest_opening": "opening-A-02-145-door"
nearest_door
string optional

Identifier of the nearest physical door to this node. More specific than nearest_opening — references a named door asset, which may carry its own accessibility and operational properties (width, automatic, access control).

"nearest_door": "door-A-02-145-main"
nearest_landmark
string optional

Identifier of the nearest navigational landmark visible from this node — a nurses' station, reception desk, coffee kiosk, or clearly-signed department. Used by natural-language routing instructions: "Continue past the nurses' station."

"nearest_landmark": "landmark-A-02-nurses-station"
nearest_lift
string optional

Identifier of the nearest lift (elevator) node relative to this node. Accessibility routing engines use this to construct step-free routes — if a level change is required, this is the preferred vertical connection for wheelchair and step-free profiles.

"nearest_lift": "elevator-A-03"
nearest_stair
string optional

Identifier of the nearest stairwell node. Used by routing engines when constructing standard (non-wheelchair) routes requiring a level change, and for fire-egress routing calculations where lifts are disabled.

"nearest_stair": "stair-A-02-S1"
nearest_escalator
string optional

Identifier of the nearest escalator node. Null when no escalator is within the graph segment. When set, routing engines may prefer this over stairs for standard travellers given lower edge_weight on escalator links.

"nearest_escalator": null
vertical_connection
string optional

Node identifier of the primary vertical connection (lift, stair, or escalator) used to reach this node from another level. Routing engines use this to splice level-change segments into multi-floor routes. Should reference the most accessible vertical connection available.

"vertical_connection": "elevator-A-03"
horizontal_connection
string optional

Node identifier of the primary horizontal connection (corridor junction or building link) used to approach this node from the same level. Used to simplify route descriptions — the routing engine can reference this as the "last junction before destination".

"horizontal_connection": "node-A-02-corridor-12"
level_connection
string optional

IMDF level identifier of the floor this node exists on. Enables routing engines to confirm level context when building multi-floor instructions and to validate that connected_nodes on the same floor share a consistent level assignment.

"level_connection": "level-A-02"
05 Route & Navigation 4 fields
route_segment_id
string optional

Identifier of the named route segment this node belongs to. Route segments group nodes into named corridors or routes (e.g. "Blue Route 3") enabling physical and digital signage systems to display consistent colour-coded route identifiers across all decision points.

"route_segment_id": "seg-blue-route-3-A"
decision_point_id
string optional

Identifier of the decision point (named junction or choice node) associated with this node. Decision points are where routing instructions are surfaced to travellers — on physical signs, kiosks, and voice AI turn-by-turn output. A node that is itself a decision point sets this to its own node_id.

"decision_point_id": "dp-junction-A-02-12"
turn_angle
float optional

The turn angle in degrees required at the edge connecting this node to the next node on the primary route. 0° is straight ahead; 90° is a right turn; −90° is a left turn; 180° is a U-turn. Used by voice AI and kiosk channels to generate natural-language turn instructions ("Turn left", "Bear slightly right").

Range: −180 to 180 — Positive: right — Negative: left

"turn_angle": -90.0
distance_m
float required

Walking distance in metres from the start of the primary route to this node. Accumulated along the route graph — not straight-line (Euclidean) distance. Used by all channel renderers to display "X metres" or "approximately Y minutes" estimates to travellers.

Min: 0.0 — Units: metres (WGS84 / EPSG:4326 projection)

"distance_m": 42.5
06 Path Metrics 4 fields
travel_time_seconds
float optional

Estimated travel time in seconds along the edge from this node to the next node on the primary route. Based on average walking speed (1.2 m/s) adjusted for edge type — corridor edges use baseline, elevator links add boarding/transit time, escalators use moving-walkway speed.

Units: seconds — Default assumption: 1.2 m/s walking speed

"travel_time_seconds": 38
slope
float optional

Gradient of the path surface on this edge, expressed as a percentage rise over run. Used by accessibility routing to flag or avoid ramps and sloped corridors exceeding EN 17210 thresholds (≤ 5% for independent wheelchair access). Positive values indicate uphill, negative values downhill.

Units: percentage — EN 17210 threshold: ≤ 5% — Range: typically −15 to +15

"slope": 0.0
width_m
float optional

Clear width of the path or corridor at the narrowest point on this edge, in metres. Accessibility routing uses this to determine whether a given route is traversable by a wheelchair (minimum 0.9 m) or power chair (minimum 1.2 m). Values below threshold increase edge_weight for accessibility profiles.

Units: metres — Wheelchair min: 0.9 m — Power chair min: 1.2 m

"width_m": 2.4
clearance_height_m
float optional

Minimum overhead clearance height on this edge in metres. Relevant for hospital contexts where ceiling-mounted medical equipment, overhead conveyors, or structural beams reduce headroom. Routing engines surface this for tall equipment transport planning.

Units: metres — Standard minimum: 2.1 m

"clearance_height_m": 2.8
07 Physical Environment 5 fields
surface_type
enum optional

Type of floor surface on this edge. Affects routing for mobility aid users — certain surfaces are incompatible with specific wheelchair types or walking frames. Also used by voice AI to warn travellers: "The next section has a smooth tile floor."

smooth_tile carpet rubber concrete wood cobblestone gravel tactile_paving
"surface_type": "smooth_tile"
surface_condition
enum optional

Current condition of the surface on this edge. Updated by maintenance or sensor systems when a defect or temporary hazard is detected. A poor or temporary_hazard condition increases edge_weight and triggers a warning in routing output.

good fair poor wet temporary_hazard under_maintenance
"surface_condition": "good"
door_type
enum optional

Type of door on the primary opening of this node. Affects accessibility routing — a manual_heavy door may not be negotiable by a wheelchair user without assistance; an automatic_sliding door is fully accessible.

automatic_sliding automatic_swing manual_light manual_heavy revolving none
"door_type": "automatic_sliding"
door_width_m
float optional

Clear width of the primary door opening in metres. Accessibility routing uses this to determine whether a wheelchair or medical transport can pass. Values below 0.9 m are incompatible with standard wheelchair access and raise edge_weight for accessibility profiles.

Units: metres — Wheelchair standard: ≥ 0.9 m — Recommended: ≥ 1.2 m

"door_width_m": 1.2
door_automatic
boolean optional

Whether the primary door on this node opens automatically without physical contact. true indicates full accessibility for hands-free passage. false means the traveller must manually operate the door, which may affect wheelchair and visually-impaired routing recommendations.

"door_automatic": true
08 Access & Restrictions 4 fields
barrier_present
boolean optional

Whether a physical barrier (turnstile, gate, bollard, or temporary obstruction) is present on the primary edge of this node. true causes routing engines to append a barrier-crossing instruction and may add edge_weight for accessibility profiles. Updated by maintenance or real-time status systems.

"barrier_present": false
restricted_access
boolean optional

Whether access to this node is restricted to authorised personnel or specific visitor types. true causes routing engines to suppress this node from public-facing wayfinding output and flag it in staff-only route planning. Distinct from access_control_required — restricted nodes may still be physically accessible.

"restricted_access": false
access_control_required
boolean optional

Whether electronic access control (keycard, badge reader, biometric) is required to pass through the primary opening of this node. true causes routing engines to inject an "badge required" instruction at this decision point in staff-facing channel output. Public channels suppress this node entirely when set.

"access_control_required": false
emergency_only
boolean optional

Whether this node and its edges are only traversable during emergency conditions. true excludes the node from standard routing graphs and activates it only in fire-egress or emergency evacuation routing modes triggered by building management or incident systems.

"emergency_only": false
09 Standards Cross-references 4 fields
indoor_gml_cell_id
string required

The IndoorGML 2.0 cellular space identifier for this node. Ties the WIM topology graph into the IndoorGML primal space model, enabling interoperability with OGC-compliant indoor navigation platforms, routing engines, and mapping APIs that consume IndoorGML directly.

Standard: OGC IndoorGML 2.0 — Format: IndoorGML cell GML ID

"indoor_gml_cell_id": "igml-cell-A-02-145"
imdf_unit_id
string optional

The IMDF unit identifier for the physical space this node represents. Ties the navigation graph to the IMDF venue geometry layer — used by Apple Maps, platform mapping APIs, and digital signage systems that consume IMDF unit polygons for visual map rendering.

Standard: Apple IMDF — Format: IMDF feature UUID

"imdf_unit_id": "imdf-unit-A-02-145"
citygml_space_id
string optional

The CityGML 3.0 space identifier for this node's physical space in the semantic 3D building model. Enables the WIM topology to cross-reference the BIM/GIS environment — routing graph nodes can be directly associated with LoD3/LoD4 room geometries and building component data.

Standard: OGC CityGML 3.0 — Format: CityGML GML ID (gml:id)

"citygml_space_id": "cgml-room-A-02-145"
bim_element_id
string optional

The Building Information Model (BIM) element global identifier for the space this node represents. Typically an IFC GlobalId (22-character Base64-encoded GUID). Connects the WIM topology record to the as-built BIM — enabling estate management systems to trace routing graph updates back to BIM model changes.

Format: IFC GlobalId (22 chars) or vendor-specific BIM ID — Standard: ISO 16739 (IFC4)

"bim_element_id": "bim-elem-A-02-145"
Complete topology object — example

A fully populated Navigation Graph object for the Cardiology Clinic node at UMC Utrecht. Required fields are always present; optional fields shown with representative values.

topology-node-A-02-145.json