尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证15 minutes, but for whom? Free civic isochrone map per type of person (heat, rain, slopes, broken lifts).
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A free, public-good civic map. The usual "15-minute city" map assumes a fit adult. This one shows how far a child, a pregnant woman, an elderly person and a newcomer can actually walk in 5, 10 and 15 minutes from a point you click, and how heat, rain, slopes and broken lifts change that.
First area: BGC, Taguig (Metro Manila). Live at https://fifteen-for-whom.vercel.app.
Inspired by Francesco Procacci's map (Python workflow) shared by Milan Janosov.
npm install
npm run dev # local dev server
npm run lint # tsc --noEmit + eslint
npm run build # static site into dist/
npm run smoke # checks dist/: link-preview tags, PNG, MP4 (H.264, < 5 MB), graph
scripts/check-live.sh https://fifteen-for-whom.vercel.app # same checks against a deployment
No API keys, no paid services. Everything runs in the browser; the street graph is a committed static file (public/data/bgc.json, ~330 kB, ~90 kB gzipped).
scripts/build-graph.mjs downloads every highway=* way in the area's bounding box from the Overpass API, drops what pedestrians cannot use (motorways, trunk roads, busways, cycleways, foot=no, private/permit access) and splits ways at shared nodes into edges. Each edge stores its length, its geometry and flags: steps, footbridge, covered, major road, grade.src/engine.ts, edgeCosts): time = length / (speed × multipliers), where the multipliers depend on the persona and the toggled conditions (below). Edges can be blocked.PERSONAS in src/engine.ts)| Persona | Speed | Extra |
|---|---|---|
| Fit adult (reference, not drawn) | 1.33 m/s | |
| Child | 1.0 m/s | Heat sensitivity ×1.2; needs lifts (strollers/small children on stairs) |
| Pregnant woman | 1.1 m/s | Heat ×1.4, slope ×1.3; needs lifts |
| Elderly person | 0.9 m/s | Heat ×1.5, slope ×1.5; needs lifts |
| Newcomer | 1.33 m/s × 0.85 | Wayfinding penalty: 15% slower plus 8 s at every junction with 3 or more ways |
All of these numbers are assumptions. They are rounded, plausible values chosen by the author, they are population averages rather than individual limits, and none is backed by a source with a verified URL. Earlier drafts named papers from memory; those citations were removed because they were not verified. Treat the figures as illustrative and change them in PERSONAS if you have better data.
The slope penalty uses Tobler's hiking function (Tobler 1993, NCGIA Technical Report 93-1), applied to urban walking as an assumption; see Limitations.
| Toggle | Effect |
|---|---|
| Heat | Speed × (1 − 0.18 × heat sensitivity) on uncovered edges, × (1 − 0.06 × sensitivity) on covered ones |
| Rain | Speed × 0.85 on uncovered edges, unchanged on covered ones |
| …avoid uncovered | Extra ×0.55 on uncovered edges (stand-in for detouring to stay dry) |
| Slopes | Tobler's function, speed ∝ exp(−3.5·|grade + 0.05|), relative to flat, with persona slope sensitivity multiplying the grade |
| Broken lifts | Steps and footbridges are blocked for personas that need lifts (child with stroller, pregnant, elderly). The newcomer is unaffected. |
Steps are always slow (×0.5 speed) for everyone, even with lifts working.
covered, incline: © OpenStreetMap contributors, ODbL, via the Overpass API (overpass.kumi.systems, overpass-api.de). The committed extract records the OSM timestamp.incline tags are used; where a bridge, flyover or tunnel has none, a 5% ramp of unknown direction is assumed and penalised both ways. BGC is nearly flat, so the slope toggle changes the result only slightly. A real DEM (e.g. Copernicus/SRTM sampled at build time) is the obvious next step.covered=yes, indoor=yes, corridors and tunnels/building passages count as covered. BGC has many covered walks and mall connections that are not tagged, so heat and rain effects are probably overstated.sidewalk=no are still walkable.public/og/preview.mp4 (1200×630, H.264, ~0.3 MB, 7 s) shows the isochrones growing for each persona. public/og/preview.png is the 1200×630 fallback and public/og/player.html is the twitter:player page. Regenerate all three after changing the engine or graph:
npm run preview-video # needs ffmpeg; renders frames with @napi-rs/canvas
The head tags in index.html use absolute https://fifteen-for-whom.vercel.app URLs; update them if the domain changes.
src/areas.json:
"komoro": {
"name": "Komoro, Nagano",
"center": [138.4267, 36.3275],
"zoom": 15,
"bbox": [138.41, 36.315, 138.445, 36.34],
"graph": "/data/komoro.json",
"start": [138.4267, 36.3275]
}
(bbox is [west, south, east, north]; keep it small, about 2 km × 2.5 km, to stay fast.)node scripts/build-graph.mjs komoro (add --refresh to re-download from Overpass; raw output is cached in the gitignored data/raw/).public/data/komoro.json. Open the site with ?area=komoro.src/engine.ts if local conditions (e.g. snow) need different assumptions.Free to use. A Donate link appears in the footer once DONATE_URL in src/config.ts is set (empty by default).
MIT, see LICENSE. Map data © OpenStreetMap contributors (ODbL).
npm run e2e installs Chromium and runs Playwright (e2e/app.spec.ts) against the built site with software WebGL. It checks that tiles render, that a click draws 5/10/15 min rings for all four personas, that each toggle changes the geometry, and that the layout holds at 390px. npm run smoke runs the tag checks and then this, so CI covers both. Screenshots from the last run are in docs/screenshots/.