Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 49 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,49 @@
# ridescoredc
# RideScore DC

A community-built pipeline and map that scores the bike-safety/comfort of DC streets, combining open data (crashes, lanes, speed, lanes count, etc.) with transparent rule sets (e.g., LTS, BNA-style connectivity).


# Overview
## What this repo contains
- **Rulesets** (YAML): Encoded versions of existing bike safety/comfort frameworks (e.g., LTS) plus a composite RideScore for ranking.
- **Schemas** (JSON): Canonical fields for street segments and scores so layers stay consistent.
- **Pipeline code** (Python): Ingest → clean → features → scoring → layers → (optional) tiles.
- **Layers** (JSON): Toggleable map layers (ranking, crash history, number of car lanes, etc.).
- **Web**: A simple Leaflet/MapLibre web app for exploration.
- **Project Plan/Meeting Notes**: View link [here](https://docs.google.com/document/d/1AsSjS07xshxVOjvKomdz90E6jUUXW7Dy5Z89CkY_dj4/edit?usp=sharing)

## Quickstart (local)
TBD


## Hi Level Flow Chart
```mermaid
flowchart TD
A["📊 Collect Data<br/>(Roads, Speed, Safety Info)"] --> B["⚙️ Process Data<br/>(Clean & Organize)"]
B --> C["🔢 Calculate Scores<br/>(Safety & Ridability)"]
C --> D["🗺️ Display on Map<br/>(Interactive Web Map)"]

style A fill:#e1f5ff
style B fill:#f3e5f5
style C fill:#fff3e0
style D fill:#e8f5e9

```

```mermaid
flowchart TD
A["DC Open Data / OSM / Counts<br/>(roads, lanes, speed, crashes)"] --> B["Ingest scripts<br/>src/cli/fetch_dc_data.py"]
B --> C["Standardize & join to segments<br/>(IDs, CRS, columns)"]
C --> D["Feature engineering<br/>(crash_rate, facility flags, exposure)"]
E["Rulesets (YAML)<br/>/rulesets/lts.yml<br/>/rulesets/ridescore_v1.yml"]
E --> F["Scoring<br/>(LTS, composite RideScore)"]
D --> F
F --> G["Processed datasets<br/>data/processed/segments.geojson<br/>(lts_level, ridescore_v1, etc.)"]
H["Schemas (JSON)<br/>/schema/*.schema.json"] -->|validate| G
I["Layer configs<br/>/layers/categories/*.json"] --> J["Web map (Leaflet/MapLibre)"]
G --> J
subgraph CI
K[Lint & tests]-->L[Schema checks]
end
G --> CI
```
9 changes: 9 additions & 0 deletions dataset-metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"title": "test-dataset-metadata",
"id": "eliaahadi/test-dataset-metadata",
"licenses": [
{
"name": "CC0-1.0"
}
]
}
15 changes: 15 additions & 0 deletions flowchart TD.mmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
flowchart TD
A["DC Open Data / OSM / Counts<br/>(roads, lanes, speed, crashes)"] --> B["Ingest scripts<br/>src/cli/fetch_dc_data.py"]
B --> C["Standardize & join to segments<br/>(IDs, CRS, columns)"]
C --> D["Feature engineering<br/>(crash_rate, facility flags, exposure)"]
E["Rulesets (YAML)<br/>/rulesets/lts.yml<br/>/rulesets/ridescore_v1.yml"]
E --> F["Scoring<br/>(LTS, composite RideScore)"]
D --> F
F --> G["Processed datasets<br/>data/processed/segments.geojson<br/>(lts_level, ridescore_v1, etc.)"]
H["Schemas (JSON)<br/>/schema/*.schema.json"] -->|validate| G
I["Layer configs<br/>/layers/categories/*.json"] --> J["Web map (Leaflet/MapLibre)"]
G --> J
subgraph CI
K[Lint & tests]-->L[Schema checks]
end
G --> CI
9 changes: 9 additions & 0 deletions flowchart-simplified.mmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
flowchart TD
A["📊 Collect Data<br/>(Roads, Speed, Safety Info)"] --> B["⚙️ Process Data<br/>(Clean & Organize)"]
B --> C["🔢 Calculate Scores<br/>(Safety & Ridability)"]
C --> D["🗺️ Display on Map<br/>(Interactive Web Map)"]

style A fill:#e1f5ff
style B fill:#f3e5f5
style C fill:#fff3e0
style D fill:#e8f5e9
9 changes: 9 additions & 0 deletions segments-raw.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
segment_id,start_lon,start_lat,end_lon,end_lat,num_lanes,speed_limit,bike_facility_type,parking_presence,crash_count_5yr,serious_injury_count_5yr,fatal_count_5yr,geometry_wkt
demo-1,-77.0400,38.9100,-77.0300,38.9100,2,25,painted_lane,false,1,0,0,"LINESTRING(-77.04 38.91, -77.03 38.91)"
demo-2,-77.0400,38.9050,-77.0300,38.9050,3,35,none,true,5,1,0,"LINESTRING(-77.04 38.905, -77.03 38.905)"
demo-3,-77.0500,38.9150,-77.0400,38.9150,1,20,protected_track,false,0,0,0,"LINESTRING(-77.05 38.915, -77.04 38.915)"
demo-4,-77.0450,38.9120,-77.0350,38.9120,2,30,buffered_lane,false,2,0,0,"LINESTRING(-77.045 38.912, -77.035 38.912)"
demo-5,-77.0480,38.9080,-77.0380,38.9080,4,35,painted_lane,true,3,1,1,"LINESTRING(-77.048 38.908, -77.038 38.908)"
demo-6,-77.0410,38.9060,-77.0310,38.9060,2,25,shared,false,0,0,0,"LINESTRING(-77.041 38.906, -77.031 38.906)"
demo-7,-77.0520,38.9140,-77.0420,38.9140,2,25,separated_lane,false,1,0,0,"LINESTRING(-77.052 38.914, -77.042 38.914)"
demo-8,-77.0470,38.9090,-77.0370,38.9090,3,30,none,true,2,0,0,"LINESTRING(-77.047 38.909, -77.037 38.909)"