Measuring how much of Tashkent the metro actually reaches on foot, which districts are left to the bus, and whether the bus-dependent parts of the city also get the thinnest bus service. Built from OpenStreetMap and a gridded population raster, with walking times computed along the real street network.
Tashkent runs two transit systems that behave nothing alike. The metro is fast, punctual and unaffected by traffic, but it exists at only 49 stations. The bus network reaches almost everywhere — on the order of two thousand stops — but is slow, crowded and hostage to the same congestion as private cars. Whether a household has a metro station within walking distance is therefore not a small difference in convenience. It decides whether the whole city is available to them on a weekday evening, or only their own end of it.
That divide has been moving. The metro spent three decades as two and a half lines through the Soviet-era core; since 2020 it has grown by an above-ground ring and a southern extension, and the stations added in that push serve a very different kind of neighbourhood than the ones opened in 1977. Nobody has published a map of what that expansion actually bought, counted in residents rather than in kilometres of track.
This project builds that map. For every populated 100-metre cell in the city it computes the walking time — along real streets and footpaths, not straight lines — to the nearest metro entrance, the nearest bus stop, and the nearest bazaar. It then classifies each cell as metro-served, bus-only, or beyond walking distance of either, and aggregates those classifications into population-weighted statistics per district.
A conventional "15-minute city" study measures the walk to a supermarket. In Tashkent that is the wrong destination: daily food shopping happens at the bazaar, and the large bazaars — Chorsu, Alay, Farhod, Kuyluk — are also the transfer nodes where the bus network is densest. Including bazaars as a third destination class makes the analysis mean something locally, and it supplies an independent check: if a district's residents can walk to a bazaar but not to transit, that says something real about the shape of the city rather than about how the metro happens to be drawn.
Three groups, in order of how much the design owes them. Tashkent residents comparing neighbourhoods, who need to find one place on a map and read one number. Transport planners weighing where a further metro extension or a bus-priority corridor would serve the most people, who need the per-station and per-district comparisons. Researchers and NGOs working on urban service provision in Central Asia, who need the method and its caveats stated plainly enough to reuse. The finished site should be readable in Uzbek and Russian, not only English.
requests, one
query per feature class over the bounding box
41.16, 69.11, 41.40, 69.42; every response cached to disk so the
pipeline reruns without hitting the API again.name,
name:ru, name:uz, railway,
station, public_transport,
highway=bus_stop, amenity=marketplace,
route relation membership.uzb_ppp_2020_UNadj_constrained.tif — 11.8 MB, no API
key required.uzbekistan-latest.osm.pbf, 118 MB, fed to a local
OSRM instance running the
foot profile in Docker./table endpoint
returns many-to-many walking durations from population cells to
candidate stops in batches. Walking speed is fixed at 4.8 km/h and
stated explicitly wherever a figure in minutes appears.
P1619 (date of official opening) for stations of the
Tashkent metro.Counts cover nodes, ways and relations over the Tashkent bounding box. The metro station count was re-queried against the live Overpass API on 6 September 2026 and returned 49 nodes, 0 ways, 0 relations. The remaining rows come from the earlier scoping run; the endpoint rate-limited further queries, so re-verifying them is the first task of week 2 rather than a claim made here.
| Layer | Count | Note |
|---|---|---|
| Metro stations | 49 | railway=station + station=subway; re-verified 6 Sep 2026 |
| Bus stops | ~2,040 | highway=bus_stop; inflated by opposite-side pairs |
| Bazaars | ~96 | amenity=marketplace |
| Metro entrances | to confirm | railway=subway_entrance; decides whether we walk to entrances or to station centroids |
| Bus route relations | to confirm | route=bus; the basis of the service-level metric |
| District boundaries | 11 or 12 | admin_level=6; see the caveat below |
Three data problems, stated up front.
Bus stops are double-counted. A single kerbside
location is usually mapped twice, once per direction of travel, and
sometimes a third time as a public_transport=platform.
This rules out count-based metrics such as "stops per square
kilometre". It barely affects distance to the nearest stop,
which is why the project is built on distance rather than counts — the
same reasoning that makes the metric robust also makes pairing the
stops an improvement rather than a precondition.
Tashkent has twelve districts, and OpenStreetMap may still show
eleven. Yangihayot was split from Sergeli in 2020. If the
boundary relation is absent we either digitise the split or report the
two together and say so. Silently publishing a stale eleven-district
geography would be the worse error, particularly since Yangihayot is
exactly the kind of peripheral district this study is about.
Bus route relations are incomplete. Route counts per
stop are a lower bound, not a census. Research question 3 rests
entirely on this layer, so week 3 includes an explicit completeness
audit; if coverage is too thin to support a service-level claim, the
question is dropped rather than answered badly.
requests for Overpass,
geopandas and shapely for geometry,
rasterio for the population raster,
scipy.spatial.cKDTree for the straight-line baseline
and for candidate pre-filtering, pandas for
aggregation.foot profile, for
network walking times via the /table endpoint.d3-geo,
topojson-client and d3-scale-chromatic on
a static page — the same stack as the labs, no build step.| Task | Supported by |
|---|---|
| Locate and explore | Pan and zoom on the access surface; find your own neighbourhood and read its walk time |
| Compare | District composition bars; metro versus bus versus bazaar mode toggle |
| Quantify | Cumulative access curve read at whatever threshold the user chooses |
| Discover relationships | Bus-only share against bus service level |
| Detect outliers | Stations with unusually low walk-up population; districts off the service trend line |
| Filter | Mode toggle and threshold slider propagating to every linked view |
| Trace change | Metro schematic coloured by opening era, showing what the expansion added |
Six views, each a different design idiom, sharing one selection state. They are ordered as an argument — where access ends, who is left on the bus, how many people that is, which districts, which stations, and whether service compensates — rather than as a gallery.
What links them. One selected district and one walking threshold are shared global state. Hovering a district in the stacked bars highlights it in both maps and in the scatter; dragging the threshold slider moves the access surface, the classification, the stacked bars and the marker on the cumulative curve together. Without that linkage these are six charts about transit. With it they are one instrument.
To be completed. Replace the placeholder names below before submission. The split assumes three members; if the group is a different size, routing and D3 are where an extra person helps most, since those are the two longest critical paths.
| Member | Primary responsibility | Also contributes to |
|---|---|---|
| [Member 1] | Data acquisition and cleaning — Overpass queries for every layer, bus-stop pairing, entrance-to-station linkage, route-relation extraction, completeness audit | Methodology documentation, interim slides |
| [Member 2] | Spatial analysis — raster sampling, KD-tree baseline, OSRM setup and network isochrones, the three-way access classification, district aggregation | D3 implementation of the two map views; sensitivity analysis |
| [Member 3] | Visualization design and front end — the four chart views, linked selection and threshold slider, colour scales, page layout, Uzbek and Russian labels | Exploratory analysis, testing, presentation |
Shared by everyone: all three review the full pipeline and can explain any part of it under questioning. Encodings, colour scales and the narrative order of the six views are decided together, because those carry the analytical argument rather than merely displaying it. Each member writes the section of the final documentation covering their own work.
By the interim presentation we expect to demonstrate:
The bus-stop pairing problem will be presented as a solved methodological challenge rather than hidden. It is the clearest example of why the analysis is built on distance rather than counts, and explaining it is the fastest way to show that the numbers on the slides mean what they claim to mean.
| Week | Milestone | Tasks and owners | Deliverable |
|---|---|---|---|
| 2 | Acquisition | Overpass fetch and caching for all six layers, including the counts left "to confirm" above [M1]; WorldPop download, clip and district join [M2]; repository scaffold, licence, README, and a decision on whether Yangihayot exists in OSM [M3] | Raw data committed; fetch script reruns cleanly from scratch; the count table on this page filled in |
| 3 | Processing, and the first real number | Bus-stop pairing and entrance linkage [M1]; reprojection and straight-line KD-tree access grid [M2]; exploratory plots, route-relation completeness audit, decision on question 3 [M3] | Clean stop dataset, three-way access classification, EDA notebook, and the first straight-line coverage percentage |
| 4 | Design and first D3 | Settle all six encodings and the narrative order [all]; build the access surface map and district composition bars against real data [M2, M3]; OSRM container running locally [M2]; interim slides [M1] | Two working linked charts and a complete design set |
| 5 | Interim presentation | End-to-end pipeline demonstration and rehearsal [all]; first network isochrone run and comparison against the baseline [M2] | Presentation, two live visualizations, one headline number |
| 6 | Full build and interaction | Remaining four views [M3 leading, M2 on the schematic]; shared selection and threshold slider [M3]; network isochrones over the full grid and the sensitivity table [M2]; Wikidata opening years or the four-era fallback [M1] | All six views interactive and linked; straight-line versus network comparison reported |
| 7 | Polish and ship | Colourblind-safe check on the bivariate scheme, mobile layout, TopoJSON and grid size optimisation [M2, M3]; methodology README and limitations write-up [M1]; final rehearsal [all] | Published site, documented public repository, final presentation |
Scheduling risk, and the hedge against it. The data is static — OpenStreetMap and WorldPop will look the same in week 6 as in week 2 — so nothing external forces early progress. Two rules guard against that. The week 3 straight-line number is a hard internal deadline: it produces a complete, presentable pipeline with no routing infrastructure at all, so the project always has something true to show. The network isochrones in weeks 5 and 6 are then an upgrade to a working system rather than the thing everything waits on. OSRM is the only component that could fail outright, and it can fail without taking a research question with it — question 6 simply becomes a limitation instead of a finding.
Overpass API — OpenStreetMap query endpoint
WorldPop — gridded population estimates
Geofabrik — Uzbekistan OSM extract
OSRM — open source routing engine
data.gov.uz — Open Data Portal of the Republic of Uzbekistan
Wikidata SPARQL — metro station opening dates
Map data © OpenStreetMap contributors, ODbL. Population data © WorldPop, CC BY 4.0. Distances computed in EPSG:32642 (UTM 42N); walking times at 4.8 km/h along the OSM pedestrian network.
← Back to home