Back to projects

Project

Interactive Transit Accessibility Map of Delhi

Interactive web map of Delhi's public transit network — bus stops, metro lines, and stations visualised with toggleable layers and stop-level popups.

Python Flask Folium OpenStreetMap GeoJSON GTFS

Overview

A Flask web app that loads open OSM and GTFS data and renders it as an interactive Folium map. Users can explore bus stop locations, toggle metro lines and stations, and click any marker to see stop-level attributes.

Objective

To make Delhi's public transit network spatially legible — combining bus, metro, and boundary data from open sources into a single browsable map.

Method

01

Loaded bus stop nodes from OSM (JSON) with attributes: name, operator, network, wheelchair, shelter, departures board

02

Added Delhi Metro lines and stations from GeoJSON files as separate toggleable layers

03

Used Folium's MarkerCluster to group dense stop areas and reduce visual noise at city scale

04

Rendered the Delhi NCT administrative boundary as a GeoJSON overlay

05

Served the map through a Flask route, with a custom HTML legend injected via folium.Element

Visuals

Pipeline for integrating OSM and GTFS data into the interactive map.
Layer structure showing bus stops, metro lines, and stations.
Interactive popup showing stop-level attributes and clustering behavior.

Analysis

  • Bus stops cluster heavily around the central corridors — peripheral areas of Delhi have noticeably lower stop density
  • Metro lines connect major corridors but large residential areas in the north-west and south remain without rail coverage
  • A significant share of stops lack shelter or wheelchair accessibility data in OSM, reflecting gaps in open data completeness

Reflection

  • The project is a starting point — adding frequency data or travel-time analysis would make the map analytically stronger
  • OSM data quality varies across the city; stops in outer Delhi often have incomplete or missing attribute tags
  • Switching to a frontend framework (Leaflet.js directly) would allow faster load times and more interactive filtering