# designhaoyu/safecyclingrouting architecture

> Architecture diagram of the GitHub repository designhaoyu/safecyclingrouting, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/designhaoyu/safecyclingrouting
- Repository: https://github.com/designhaoyu/safecyclingrouting

## Overview

Zurich Safe Cycling Route Recommender turns accident records into hourly edge-risk scores, combines those scores with a cycling network to compute four route strategies, and presents queried routes in a Streamlit map and dashboard. The user sets an origin, destination, and hour; the frontend invokes the backend routing pipeline, which prepares the graph and safety weights, computes routes, and exports results for display. Step 1 is documented in the README but its notebook implementation was not sampled; its documented processing stages are shown without asserting internal module wiring.

Main entry points: [`src/zurich_safe_routing/exports.py`](https://github.com/designhaoyu/safecyclingrouting/blob/main/src/zurich_safe_routing/exports.py) (Route Exports), [`scripts/run_step2_pipeline.py`](https://github.com/designhaoyu/safecyclingrouting/blob/main/scripts/run_step2_pipeline.py) (Routing Pipeline), [`backend.py`](https://github.com/designhaoyu/safecyclingrouting/blob/main/backend.py) (UI Routing Backend), [`frontend.py`](https://github.com/designhaoyu/safecyclingrouting/blob/main/frontend.py) (Streamlit App)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_safety["Safety Scoring"]
  node_step1["Accident Scoring<br/>[Step_1.ipynb]"]
end

subgraph group_routing["Route Computation"]
  node_cli["Routing Pipeline"]
  node_graph_builder["Graph Preparation<br/>[graph_builder.py]"]
  node_safety_data["Score Attachment<br/>[safety_data.py]"]
  node_routing_engine["Route Strategies<br/>[routing.py]"]
  node_exports["Route Exports<br/>[exports.py]"]
end

subgraph group_interface["User Interface"]
  node_web["Streamlit App<br/>[frontend.py]"]
  node_backend["UI Routing Backend<br/>[backend.py]"]
end

subgraph group_data["Data and Results"]
  node_accident_source["Accident Records"]
  node_osm_network["Cycling Network"]
  node_scores["Hourly Edge Scores"]
  node_geojson["Current Routes"]
  node_summary_csv["Route Summary"]
  node_summary_md["Readable Summary"]
  node_route_plot["Static Route Plot"]
end

node_cyclist(("Cyclist"))

node_cyclist -->|"sets query"| node_web
node_accident_source -->|"provides records"| node_step1
node_osm_network -->|"provides network"| node_step1
node_step1 -->|"writes scores"| node_scores
node_cyclist -.->|"supplies arguments"| node_cli
node_web -->|"requests routes"| node_backend
node_backend -->|"loads graph"| node_graph_builder
node_backend -->|"loads and attaches scores"| node_safety_data
node_scores -->|"provides hourly scores"| node_safety_data
node_graph_builder -->|"loads or caches graph"| node_osm_network
node_backend -->|"computes strategies"| node_routing_engine
node_backend -->|"exports results"| node_exports
node_cli -->|"loads graph"| node_graph_builder
node_cli -->|"loads and attaches scores"| node_safety_data
node_cli -->|"computes strategies"| node_routing_engine
node_cli -->|"exports results"| node_exports
node_exports -->|"writes route links"| node_geojson
node_exports -->|"writes summary"| node_summary_csv
node_exports -->|"writes summary"| node_summary_md
node_exports -->|"writes plot"| node_route_plot
node_geojson -->|"renders route map"| node_web
node_summary_csv -->|"drives dashboard"| node_web

click node_accident_source "https://github.com/designhaoyu/safecyclingrouting/blob/main/data/raw/roadtrafficaccidentlocations.csv"
click node_osm_network "https://github.com/designhaoyu/safecyclingrouting/blob/main/data/raw/zurich_bike_graph.graphml"
click node_step1 "https://github.com/designhaoyu/safecyclingrouting/blob/main/scripts/Step_1.ipynb"
click node_scores "https://github.com/designhaoyu/safecyclingrouting/blob/main/data/processed/zurich_hourly_edge_safety_score.csv"
click node_web "https://github.com/designhaoyu/safecyclingrouting/blob/main/frontend.py"
click node_backend "https://github.com/designhaoyu/safecyclingrouting/blob/main/backend.py"
click node_cli "https://github.com/designhaoyu/safecyclingrouting/blob/main/scripts/run_step2_pipeline.py"
click node_graph_builder "https://github.com/designhaoyu/safecyclingrouting/blob/main/src/zurich_safe_routing/graph_builder.py"
click node_safety_data "https://github.com/designhaoyu/safecyclingrouting/blob/main/src/zurich_safe_routing/safety_data.py"
click node_routing_engine "https://github.com/designhaoyu/safecyclingrouting/blob/main/src/zurich_safe_routing/routing.py"
click node_exports "https://github.com/designhaoyu/safecyclingrouting/blob/main/src/zurich_safe_routing/exports.py"
click node_geojson "https://github.com/designhaoyu/safecyclingrouting/blob/main/results/step2_current_routes.geojson"
click node_summary_csv "https://github.com/designhaoyu/safecyclingrouting/blob/main/results/step2_route_summary.csv"
click node_summary_md "https://github.com/designhaoyu/safecyclingrouting/blob/main/results/step2_route_summary.md"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_step1 toneBlue
class node_cli,node_graph_builder,node_safety_data,node_routing_engine,node_exports toneAmber
class node_web,node_backend toneMint
class node_accident_source,node_osm_network,node_scores,node_geojson,node_summary_csv,node_summary_md,node_route_plot toneRose
class node_cyclist toneIndigo
```

## Components

### Safety Scoring

- [Accident Scoring](https://github.com/designhaoyu/safecyclingrouting/blob/main/scripts/Step_1.ipynb): `scripts/Step_1.ipynb`

### Route Computation

- [Routing Pipeline](https://github.com/designhaoyu/safecyclingrouting/blob/main/scripts/run_step2_pipeline.py): `scripts/run_step2_pipeline.py`
- [Graph Preparation](https://github.com/designhaoyu/safecyclingrouting/blob/main/src/zurich_safe_routing/graph_builder.py): `src/zurich_safe_routing/graph_builder.py`
- [Score Attachment](https://github.com/designhaoyu/safecyclingrouting/blob/main/src/zurich_safe_routing/safety_data.py): `src/zurich_safe_routing/safety_data.py`
- [Route Strategies](https://github.com/designhaoyu/safecyclingrouting/blob/main/src/zurich_safe_routing/routing.py): `src/zurich_safe_routing/routing.py`
- [Route Exports](https://github.com/designhaoyu/safecyclingrouting/blob/main/src/zurich_safe_routing/exports.py): `src/zurich_safe_routing/exports.py`

### User Interface

- [Streamlit App](https://github.com/designhaoyu/safecyclingrouting/blob/main/frontend.py): `frontend.py`
- [UI Routing Backend](https://github.com/designhaoyu/safecyclingrouting/blob/main/backend.py): `backend.py`

### Data and Results

- [Accident Records](https://github.com/designhaoyu/safecyclingrouting/blob/main/data/raw/roadtrafficaccidentlocations.csv): `data/raw/roadtrafficaccidentlocations.csv`
- [Cycling Network](https://github.com/designhaoyu/safecyclingrouting/blob/main/data/raw/zurich_bike_graph.graphml): `data/raw/zurich_bike_graph.graphml`
- [Hourly Edge Scores](https://github.com/designhaoyu/safecyclingrouting/blob/main/data/processed/zurich_hourly_edge_safety_score.csv): `data/processed/zurich_hourly_edge_safety_score.csv`
- [Current Routes](https://github.com/designhaoyu/safecyclingrouting/blob/main/results/step2_current_routes.geojson): `results/step2_current_routes.geojson`
- [Route Summary](https://github.com/designhaoyu/safecyclingrouting/blob/main/results/step2_route_summary.csv): `results/step2_route_summary.csv`
- [Readable Summary](https://github.com/designhaoyu/safecyclingrouting/blob/main/results/step2_route_summary.md): `results/step2_route_summary.md`
- **Static Route Plot**

### Other components

- **Cyclist**

## Connections

- Cyclist → Streamlit App: sets query
- Accident Records → Accident Scoring: provides records
- Cycling Network → Accident Scoring: provides network
- Accident Scoring → Hourly Edge Scores: writes scores
- Cyclist → Routing Pipeline: supplies arguments
- Streamlit App → UI Routing Backend: requests routes
- UI Routing Backend → Graph Preparation: loads graph
- UI Routing Backend → Score Attachment: loads and attaches scores
- Hourly Edge Scores → Score Attachment: provides hourly scores
- Graph Preparation → Cycling Network: loads or caches graph
- UI Routing Backend → Route Strategies: computes strategies
- UI Routing Backend → Route Exports: exports results
- Routing Pipeline → Graph Preparation: loads graph
- Routing Pipeline → Score Attachment: loads and attaches scores
- Routing Pipeline → Route Strategies: computes strategies
- Routing Pipeline → Route Exports: exports results
- Route Exports → Current Routes: writes route links
- Route Exports → Route Summary: writes summary
- Route Exports → Readable Summary: writes summary
- Route Exports → Static Route Plot: writes plot
- Current Routes → Streamlit App: renders route map
- Route Summary → Streamlit App: drives dashboard
