Cách app tính toán
TÔI ĐI không có vị trí xe theo thời gian thực. Mọi giờ giấc, thời gian và chi phí là ước tính từ dữ liệu công bố — dưới đây là nguồn và cách tính từng con số, để bạn biết nên tin tới đâu.
🕒 Giờ chạy và thời gian chờ
- TP.HCM: giờ hoạt động, khoảng cách chuyến (tần suất) và giờ xuất bến lấy từ hệ thống thông tin xe buýt TP.HCM (apicms.ebms.vn), theo đúng thứ trong tuần.
- Hà Nội: lấy từ timbus.vn (Transerco); metro 2A/3 theo OpenStreetMap.
- Đà Nẵng (thử nghiệm, gói tải thêm): tuyến, trạm, giờ hoạt động, tần suất và giá vé theo OpenStreetMap do cộng đồng nhập — thành phố chưa công bố dữ liệu máy đọc được. Tần suất ghi dạng "10–30 phút": số nhỏ dùng cho giờ cao điểm (6:00–8:30, 16:00–18:30), số lớn cho giờ còn lại. Tuyến mà thứ tự trạm hoặc lộ trình trên OSM chưa khớp bị bỏ, không đoán. Giá tuyến dài chỉ là mức tối đa ("tới …").
- Tuyến chạy theo tần suất: thời gian chờ = một nửa khoảng cách chuyến (vd 15 phút/chuyến → chờ ~7 phút). Vì vậy "giờ lên xe" là ước tính, không phải giờ xe tới thật.
- Tuyến có giờ xuất bến cố định: dùng đúng giờ xuất bến.
🚌 Thời gian đi xe
- TP.HCM: thời gian chạy toàn tuyến theo biểu đồ của nguồn, chia cho từng trạm theo quãng đường dọc lộ trình.
- Hà Nội: nguồn không cho thời gian chạy → ước theo chiều dài lộ trình với vận tốc trung bình 16 km/h (buýt, đã tính dừng đón trả khách) và 35 km/h (metro).
- Không tính kẹt xe thực tế — giờ cao điểm có thể chậm hơn.
🚏 Giờ xe ở trạm — gần đúng
- Bảng giờ xe KHÔNG phải vị trí xe thật (các nguồn công khai chưa có dữ liệu xe theo thời gian thực). Giờ tại trạm = giờ xuất bến theo lịch + thời gian chạy ước tính từ đầu tuyến tới trạm (xem "Thời gian đi xe").
- Phần lớn tuyến chỉ công bố tần suất (vd 8–15 phút/chuyến), không có giờ từng chuyến: app ghi "~N phút/chuyến", không tự đặt ra giờ. Chỉ tuyến có giờ xuất bến cố định mới hiện đếm ngược từng chuyến.
- Chuyến cuối tại trạm cũng là ước tính: xe có thể qua sớm/muộn vài phút tới hơn 10 phút lúc kẹt xe. Nên ra trạm sớm hơn, nhất là chuyến cuối.
- Lịch chạy có thay đổi (đổi giờ, đổi trạm, ngừng tuyến): dữ liệu được lấy lại từ nguồn mỗi tuần (thứ Hai) — TP.HCM từ hệ thống thông tin xe buýt TP.HCM (apicms.ebms.vn), Hà Nội từ timbus.vn (Transerco), metro theo OpenStreetMap — rồi phát hành công khai tại github.com/mittohoa/toidi-data. App tự tải bản mới và báo nếu tuyến bạn hay đi thay đổi.
- Thông báo đột xuất (cấm đường, sự kiện, thời tiết) chưa có trong dữ liệu.
🚶 Đi bộ và chuyển tuyến
- Tốc độ đi bộ 1,2 m/s (~4,3 km/h, đã tính chờ đèn). Quãng đường đi bộ ước tính = đường chim bay × 1,3 (đường phố quanh co). Đi bộ chuyển tuyến giữa hai trạm: dùng quãng đường THẬT theo mạng đường OpenStreetMap ở những chỗ ước tính sai hẳn — phải vòng qua sông, kênh, xa lộ, đường sắt (vd hai trạm hai bên kênh cách 280 m chim bay nhưng phải đi 1,7 km), hoặc không đi bộ được thì không gợi ý; tính lại mỗi tháng.
- Đi bộ tới trạm tối đa 800 m; chuyển tuyến đi bộ tối đa 400 m và cần ít nhất 1 phút; tối đa 4 chặng xe.
- Nếu bạn bật "Đường đi theo phố", đoạn đi bộ được vẽ theo đường thật (OSRM/FOSSGIS, dữ liệu OpenStreetMap), và app tính lại lộ trình với quãng đi bộ THẬT từ điểm đi ra các trạm gần và từ trạm tới nơi (một yêu cầu mỗi đầu; mất mạng thì giữ ước tính).
- Tới trạm bằng xe (tuỳ chọn trong bảng chỉ đường): xe đạp 12 km/h (tối đa 3 km), xe máy và xe ôm công nghệ ~22 km/h (tối đa 6 km), ô tô công nghệ ~18 km/h (tối đa 8 km) — tính trên quãng đường chim bay × 1,3. Cộng thêm thời gian lấy/gửi xe (1–3 phút) hoặc chờ tài xế (5–6 phút). Xe của bạn chỉ dùng cho chặng đầu (gửi xe ở trạm); xe công nghệ dùng được cả chặng cuối. Đoạn nào đi bộ nhanh hơn thì app vẫn chọn đi bộ.
- Giá xe công nghệ ước tính theo bảng giá công bố 2026: xe máy 12.000đ cho 2 km đầu + 4.500đ/km, ô tô 27.000đ cho 2 km đầu + 10.000đ/km; chưa tính giờ cao điểm, phụ phí đêm, khuyến mãi. App không đặt xe.
↕️ Xếp hạng phương án
- "Đề xuất": giờ tới sớm nhất, cộng thêm cho những gì giờ tới không thể hiện: mỗi lần chuyển tuyến +5 phút (mệt, dễ lỡ xe); đi bộ quá 300 m thì mỗi mét +1 giây (đi bộ ngoài nắng mưa mệt gấp đôi ngồi xe); mỗi nghìn đồng tiền vé +30 giây (tuyến miễn phí trễ 2 phút vẫn được xếp trên tuyến 6.000đ; metro 16.000đ vẫn được đề xuất khi nhanh hơn ≥ 8 phút). Chuyển sang tuyến thưa chuyến (quá 15 phút/chuyến) thì cộng thêm nửa phần vượt — rủi ro lỡ chuyến, vd tuyến 30 phút/chuyến +7,5 phút (chặng đầu không tính: bạn tự canh giờ ra trạm). Tuyến giá cao (liên tỉnh, sân bay – Vũng Tàu, buýt du lịch) chỉ được đề xuất khi nhanh hơn hẳn: mỗi nghìn đồng vượt 20.000đ tính như chậm thêm 1 phút.
- Các tiêu chí khác (nhanh nhất, ít chuyển, rẻ nhất, ngắn nhất, ít đi bộ) — hoà thì xét giờ tới.
- Nhiều điểm dừng: mỗi đoạn chọn phương án tốt nhất theo tiêu chí đang chọn; "Tối ưu thứ tự" thử mọi thứ tự ghé và chọn thứ tự tới nơi sớm nhất.
- Danh sách phương án: app tìm một lượt theo 5 tiêu chí cùng lúc — giờ tới, số lần chuyển, mét đi bộ, tiền vé, phút ngồi buýt trên đường (phần có thể kẹt xe; metro không tính) — và giữ mọi cách không thua hẳn cách khác, trong vòng 40 phút sau cách nhanh nhất. "Thua hẳn" = trễ hơn ≥ 5 phút mà không ít chuyển, ít đi bộ (≥ 150 m), rẻ hơn hay ít kẹt xe hơn. Cách phải đổi thêm xe chỉ được giữ khi lợi rõ: sớm hơn ≥ 3 phút, bớt ≥ 200 m đi bộ, rẻ hơn ≥ 3.000đ hoặc đi metro nhiều hơn. Tuyến chưa rõ giá được coi như đắt (15.000đ) khi so. Xuống xe rồi đi bộ sang trạm mà chính xe mình đi qua thì app cho ngồi tiếp.
💵 Giá vé
- Giá vé lượt của từng tuyến theo nguồn công bố; tổng = cộng giá các chặng (không tính vé tháng, vé ngày hay vé liên thông).
- Chính sách có thời hạn tính theo NGÀY bạn đi, hết hạn tự về giá thường. Hiện có: miễn vé 134 tuyến buýt TP.HCM 1/7–31/12/2026 (theo danh sách trong thông cáo của TP.HCM; từ 1/10 cần xác thực khi lên xe).
- Metro số 1 tính theo cự ly (QĐ 5327/QĐ-UBND): dưới 5 km 7.000đ, 5–10 km 12.000đ, 10–15 km 16.000đ, từ 15 km 20.000đ (thẻ/QR: 6.000–19.000đ). Cự ly app ước tính theo lộ trình giữa hai ga nên có thể lệch một bậc giá ở ranh giới.
- Chính sách giá vé được cập nhật cùng dữ liệu tuyến, không cần cập nhật app.
- Tuyến chưa có giá trong nguồn → hiện "giá vé chưa rõ" thay vì đoán.
- Vé theo chặng (45 tuyến TP.HCM, chủ yếu liên tỉnh / đường dài, vd 60-3: 6.000–55.000đ): nguồn chỉ ghi các mức giá, không ghi mức nào ứng với chặng nào — app ƯỚC TÍNH bằng cách chia tuyến thành các chặng bằng nhau theo số mức giá và ghi "khoảng". Giá thật có thể khác một bậc.
🛵 Khi hết xe: đi bộ, xe máy / taxi
- Đường đi bộ và đường xe lấy từ OSRM (FOSSGIS, dữ liệu OpenStreetMap), chỉ khi bạn đã cho phép.
- Thời gian xe máy / taxi = lấy mức chậm hơn giữa (thời gian OSRM × 1,3) và (quãng đường ở 25 km/h) — vì OSRM không biết kẹt xe. Chỉ là ước tính.
- "Chuyến sớm nhất" = chạy lại tìm đường từ 4:30 sáng hôm sau.
- "Gần chuyến cuối" = lên xe trong vòng 30 phút trước chuyến cuối theo giờ hoạt động công bố.
📊 Hành trình của tôi
- Km đi xe = quãng đường dọc lộ trình các chặng xe; km đi bộ theo cách tính đi bộ ở trên.
- Số bước ≈ 1.300 bước/km đi bộ.
- CO₂ giảm ≈ 50 g cho mỗi km đi xe công cộng thay cho xe máy (xe máy ~90 g/km, buýt/metro ~40 g/km mỗi hành khách).
- Chuyến quen: ít nhất 3 lần cùng điểm đi–đến, cùng khung giờ (±90 phút) trong 6 tuần gần đây.
🔄 Độ mới của dữ liệu
- Dữ liệu tuyến được lấy lại từ nguồn mỗi tuần (3 giờ sáng thứ Hai), kiểm tra an toàn (thiếu tuyến/trạm bất thường thì không phát hành) rồi app tự tải; ngày cập nhật luôn hiện trong app. Quá 30 ngày chưa cập nhật, app sẽ cảnh báo.
- Địa điểm, tên đường, phường/xã (theo địa giới từ 1/7/2025) lấy từ OpenStreetMap.
- Thấy sai? Đánh giá 👎 và chọn "Giờ chạy trong app sai" / "Trạm không có" / "Tuyến đã đổi lộ trình" — báo cáo ẩn danh được tổng hợp mỗi lần cập nhật.
Nguồn dữ liệu & ghi công
- Xe buýt, metro TP.HCM (gồm Bình Dương, Bà Rịa – Vũng Tàu cũ): tổng hợp từ thông tin công khai của hệ thống thông tin xe buýt TP.HCM (apicms.ebms.vn).
- Xe buýt Hà Nội: tổng hợp từ thông tin công khai của Transerco (timbus.vn). Metro Hà Nội (2A, 3): © OpenStreetMap contributors.
- Xe buýt Đà Nẵng (thử nghiệm, gói tải thêm): © OpenStreetMap contributors — thành phố chưa công bố dữ liệu dạng máy đọc được; tuyến có dữ liệu chưa khớp bị bỏ.
- Bản đồ, địa điểm, tên đường, phường/xã: © OpenStreetMap contributors (ODbL); bản đồ nền Protomaps.
- Đường đi bộ / xe theo phố (tuỳ chọn): OSRM · FOSSGIS, dữ liệu OpenStreetMap.
Dữ liệu đã xử lý được công bố lại tại github.com/mittohoa/toidi-data (phần dẫn xuất từ OpenStreetMap theo giấy phép ODbL). Thấy sai? Đánh giá 👎 trong app và chọn nhãn phù hợp, hoặc mở issue.
How the app calculates
TÔI ĐI has no real-time vehicle positions. Every time, duration and cost is an estimate from published data — here is where each number comes from and how it's computed, so you know how far to trust it.
🕒 Timetables and waiting time
- HCMC: operating hours, headways and departure times come from the HCMC bus information system (apicms.ebms.vn), by day of week.
- Hanoi: from timbus.vn (Transerco); metro lines 2A/3 from OpenStreetMap.
- Da Nang (beta, optional download): routes, stops, hours, frequency and fares from community-mapped OpenStreetMap — the city publishes no machine-readable data. Frequencies like "10–30 min": the lower value is used at peak times (6:00–8:30, 16:00–18:30), the higher one otherwise. Routes whose stop order or path on OSM doesn't match are left out, not guessed. Fares on long routes are only a maximum ("up to …").
- Frequency-based routes: waiting time = half the headway (e.g. every 15 min → ~7 min wait). So the "board at" time is an estimate, not when a bus actually arrives.
- Routes with fixed departures: the published departure times are used as is.
🚌 Ride time
- HCMC: the route's scheduled running time from the source, split between stops by distance along the route.
- Hanoi: the source has no running times → estimated from route length at 16 km/h average (bus, including stops) and 35 km/h (metro).
- Live traffic is not included — rush hour may be slower.
🚏 Stop departures — approximate
- Departure times are NOT live bus positions (public sources don't publish real-time vehicle data yet). Time at a stop = scheduled departure from the first stop + estimated travel time to this stop (see "Riding time").
- Most routes only publish a frequency (e.g. every 8–15 min), not per-trip times: the app shows "every ~N min" and never invents times. Only routes with fixed departures show a per-trip countdown.
- The last trip at a stop is also an estimate: buses can pass a few minutes to 10+ minutes early or late in traffic. Get to the stop early, especially for the last bus.
- When timetables change (new times, moved stops, discontinued routes), the data is re-fetched from the sources every week (Monday) — HCMC from the city bus information system (apicms.ebms.vn), Hanoi from timbus.vn (Transerco), metro from OpenStreetMap — and published openly at github.com/mittohoa/toidi-data. The app downloads new data automatically and tells you if routes you ride changed.
- Ad-hoc notices (road closures, events, weather) are not in the data yet.
🚶 Walking and transfers
- Walking speed 1.2 m/s (~4.3 km/h, including crossings). Estimated walking distance = straight line × 1.3 (streets aren't straight). Transfers between two stops use the REAL distance on the OpenStreetMap street network where the estimate is clearly wrong — detours around rivers, canals, highways, railways (e.g. two stops 280 m apart across a canal but 1.7 km to walk) — and impossible walks are never suggested; recomputed monthly.
- Up to 800 m walk to a stop; transfers up to 400 m walk with at least 1 minute; at most 4 rides.
- With "Street paths" on, walking legs are drawn along real streets (OSRM/FOSSGIS, OpenStreetMap data), and the app re-plans with the REAL walking distance from your start to nearby stops and from the stop to your destination (one request per end; offline keeps the estimate).
- Getting to the stop by vehicle (option in directions): bike 12 km/h (up to 3 km), motorbike and bike taxi ~22 km/h (up to 6 km), ride-hail car ~18 km/h (up to 8 km) — over straight-line distance × 1.3, plus time to get/park the vehicle (1–3 min) or wait for the driver (5–6 min). Your own vehicle is only used for the first leg (parked at the stop); ride-hail can cover the last leg too. Where walking is faster, the app still walks.
- Ride-hail prices are estimates from published 2026 rates: bike 12,000đ for the first 2 km + 4,500đ/km, car 27,000đ for the first 2 km + 10,000đ/km; no surge, night surcharge or promotions. The app doesn't book rides.
↕️ Ranking options
- "Recommended": earliest arrival, plus what arrival time doesn't show: +5 min per transfer (tiring, easy to miss); walking beyond 300 m adds 1 s per metre (walking in sun and rain is twice as tiring as riding); +30 s per 1,000đ of fare (a free route 2 min later still ranks above a 6,000đ one; the metro at 16,000đ still wins when ≥ 8 min faster). Transferring to an infrequent route (more than 15 min between buses) adds half the excess — the risk of just missing it, e.g. a bus every 30 min adds 7.5 min (not for the first ride: you can time your walk to the stop). Premium routes (inter-province, airport – Vung Tau, tourist buses) are only recommended when clearly faster: each 1,000đ above 20,000đ counts as 1 extra minute.
- Other criteria (fastest, fewest transfers, cheapest, shortest, least walking) — ties go to earliest arrival.
- Multi-stop: each leg uses the best option for the selected criterion; "Best order" tries every visiting order and keeps the one that arrives earliest.
- Option list: the app searches once on 5 criteria at the same time — arrival time, transfers, metres walked, fare, and minutes on a bus on the road (the part that can get stuck in traffic; metro doesn't count) — and keeps every option not clearly beaten by another, up to 40 min after the fastest. "Clearly beaten" = ≥ 5 min later without fewer transfers, less walking (≥ 150 m), a lower fare or less traffic exposure. An option with an extra transfer is kept only if it clearly pays off: ≥ 3 min earlier, ≥ 200 m less walking, ≥ 3,000đ cheaper or more time on the metro. Routes with unknown fares count as expensive (15,000đ) when comparing. If you'd get off and walk to a stop your own bus also passes, the app keeps you on board.
💵 Fares
- Single-ride fare for each route as published; total = sum of legs (no day/monthly passes or integrated tickets).
- Time-limited policies apply by the DATE you travel and lapse automatically. Currently: free rides on 134 HCMC bus routes 1 Jul–31 Dec 2026 (per the city's published list; from 1 Oct riders must verify when boarding).
- Metro Line 1 is priced by distance (Decision 5327/QĐ-UBND): under 5 km 7,000đ, 5–10 km 12,000đ, 10–15 km 16,000đ, 15 km+ 20,000đ (card/QR: 6,000–19,000đ). The app estimates distance along the line, so a trip near a band edge may be off by one band.
- Fare policies update with the route data — no app update needed.
- Routes with no published fare show "fare unknown" instead of a guess.
- Fares by section (45 HCMC routes, mostly inter-province / long routes, e.g. 60-3: 6,000–55,000đ): the source only lists the price levels, not which section each applies to — the app ESTIMATES by splitting the route into equal sections, one per level, and says "about". The real fare may differ by one level.
🛵 When buses stop: walking, motorbike / taxi
- Walking and driving routes come from OSRM (FOSSGIS, OpenStreetMap data), only if you allowed it.
- Motorbike / taxi time = the slower of (OSRM time × 1.3) and (distance at 25 km/h) — OSRM doesn't know traffic. Estimate only.
- "Earliest trip" = the planner run again from 4:30 the next morning.
- "Near last trip" = boarding within 30 minutes of the last published departure.
📊 My journeys
- Ride km = distance along the route for each ride; walk km as computed above.
- Steps ≈ 1,300 per km walked.
- CO₂ saved ≈ 50 g per km by transit instead of motorbike (motorbike ~90 g/km, bus/metro ~40 g/km per passenger).
- Usual trips: at least 3 trips with the same start–end at a similar time (±90 min) in the last 6 weeks.
🔄 Data freshness
- Route data is re-fetched from the sources every week (Monday 3 am), safety-checked (not published if routes/stops drop unusually) and downloaded by the app automatically; the update date is always shown. After 30 days without an update, the app warns you.
- Places, streets and wards/communes (post-1 July 2025 boundaries) come from OpenStreetMap.
- Spotted a mistake? Rate 👎 and pick "Wrong times in app" / "Stop missing" / "Route has changed" — anonymous reports are reviewed at each update.
Data sources & credits
- HCMC bus & metro (including former Bình Dương and Bà Rịa – Vũng Tàu): compiled from public information of the HCMC bus information system (apicms.ebms.vn).
- Hanoi bus: compiled from public information of Transerco (timbus.vn). Hanoi metro (2A, 3): © OpenStreetMap contributors.
- Da Nang bus (beta, optional download): © OpenStreetMap contributors — the city publishes no machine-readable data; routes with inconsistent data are left out.
- Maps, places, streets, wards: © OpenStreetMap contributors (ODbL); basemap by Protomaps.
- Street walking / driving routes (optional): OSRM · FOSSGIS, OpenStreetMap data.
Processed data is republished at github.com/mittohoa/toidi-data (OpenStreetMap-derived parts under the ODbL). Spotted a mistake? Rate 👎 in the app and pick a tag, or open an issue.