cleanyourtv-app
Clean Your TV를 위한 커뮤니티 제작 모바일 앱
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
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/.