1) Overview
Transit-oriented development (TOD) focuses growth around high-capacity stations and frequent bus corridors to maximise access, reduce car dependence and improve affordability. A practical TOD analysis should combine station buffers (walk sheds), street connectivity (how finely the grid connects), access to key destinations (jobs, education, health, retail), and minimum density thresholds to support viable transit and amenities.
2) Station buffers (walk sheds)
Create network-based reach from each station/stop, not simple circles. Typical thresholds: 5, 10, 15 minutes at 4–5 km/h walking speed. Flag “core TOD” inside 10 minutes and “extended TOD” up to 15.
isochrones = network.isochrone(origins=stations, mode="walk", speeds_kmh=4.5, minutes=[5,10,15]) core_TOD = isochrones[10] extended = isochrones[15]
3) Street connectivity
Fine-grained street networks support walking. Use these simple metrics inside the 10–15 min walk shed:
- Intersection density (nodes with degree ≥3) per km²
- Link–node ratio (street segments ÷ nodes)
- Average block length (shorter is better)
intx_density = count(intersections_deg>=3, area=1km²) ln_ratio = segments / nodes block_len_m = mean(edge.length_m)
Aim for intersection density > 90–120/km² and link–node ratio ≳ 1.4 as a rule-of-thumb; calibrate locally.
4) Access to destinations
Within the 10–15 min walk shed, compute reachable counts for priority POIs:
- Jobs (employment centres or proxy via land use)
- Education (primary/secondary/tertiary)
- Health (clinics/hospitals)
- Retail & daily needs
- Parks & public facilities
access_index = zscore(jobs_15) + zscore(education_15) + zscore(health_15) + zscore(retail_15)
5) Minimum density thresholds
TOD areas should commit to baseline intensity so transit stays viable:
- Residential: e.g., ≥ 60–100 du/ha in core; ≥ 40–60 du/ha in extended
- Non-residential FAR: e.g., FAR ≥ 2.0 in core; ≥ 1.0 in extended
- Parking: apply shared-parking and TOD reductions (see Parking & Loading Calculator)
meets_TOD = (du_per_ha >= threshold_by_zone) && (FAR >= min_FAR) && (inside(core_TOD))
6) Implement in GeoLayers
- Open GeoAnalyst and add: stations, street network, POIs, zoning/parcels.
- Generate walk isochrones (5/10/15) via the TOD template in Use-case Playbooks.
- Compute connectivity stats within isochrones (intersection density, block length) and color-ramp the results.
- Aggregate POI access to a single index (jobs/education/health/retail).
- Apply density threshold filters from zoning or proposed envelopes; export PNG/PDF with legend.
{
"name": "TOD Checklist",
"isochrones": [5,10,15],
"connectivity": ["intersection_density", "link_node_ratio", "block_length_m"],
"destinations": ["jobs","education","health","retail","parks"],
"thresholds": {"du_ha_core":80, "far_core":2.0, "du_ha_ext":50, "far_ext":1.0}
}
7) Field checklist (quick yes/no)
- Station area mapped with 5/10/15-min walk isochrones (not circles)
- Intersection density ≥ target; long blocks flagged for breaks
- Access index covers jobs, edu, health, retail, parks
- Zoning supports target DU/ha and FAR in core and extended zones
- Parking reductions justified (shared-parking profile applied)
- Exported map with legend + parameter JSON attached
8) Common pitfalls
- Using Euclidean buffers instead of network isochrones
- Ignoring slope/grade or barriers (rail lines, highways)
- Over-weighting a single mega-POI in the access index
- Not aligning density thresholds with market feasibility and building envelopes